一,需求
有时候需要从页面传入某一个值给后台,根据这个值去数据库查询,比如根据id查询商品。这就涉及参数的绑定问题,springmvc提供了多种参数绑定。
二,spring接收参数(绑定)
1.默认绑定
处理器形参中添加如下类型的参数处理适配器会默认识别并进行赋值。
- HttpServletRequest request
通过request对象获取请求信息 - HttpServletResponse response
通过response处理响应信息 - HttpSession session
通过session对象得到session中存放的对象 - Model/ModelMap model
ModelMap是Model接口的实现类,通过Model或ModelMap向页面传递数据
如果使用Model则可以不使用ModelAndView对象,Model对象可以向页面传递数据,View对象则可以使用String返回值替代。不管是Model还是ModelAndView,其本质都是使用Request对象向jsp传递数据。
@RequestMapping("/itemEdit")
public String itemEdit(HttpServletRequest request,Model model) {
String id = request.getParameter("id");
Items items = itemsService.findById(id);
model.addAttribute("item", items);
return "editItem";
}
2.绑定简单类型
规则:页面参数的名字和形参中的名字保持一致
public String itemEdit(int id, Model model) {
...
}
1).支持的数据类型
参数类型推荐使用包装数据类型,因为基础数据类型不可以为null
整形:Integer、int
字符串:String
单精度:Float、float
双精度:Double、double
布尔型:Boolean、boolean
说明:对于布尔类型的参数,请求的参数值为true或false。
处理器方法:
public String editItem(Model model,Integer id,Boolean status) throws Exception
请求url:
http://localhost:8080/xxx.action?id=2&status=false2).@RequestParam
使用@RequestParam常用于处理简单类型的绑定
public String editItem(@RequestParam(value="item_id",required=false,defaultValue="1") String id) {
...
}
value:参数名字,即入参的请求参数名字,如value=“item_id”表示请求的参数区中的名字为item_id的参数的值将传入;
required:是否必须,默认是true,表示请求中一定要有相应的参数,否则将报;
TTP Status 400 - Required Integer parameter ‘XXXX’ is not present
defaultValue:默认值,表示如果请求中没有同名参数时的默认值
3.绑定pojo类型
1).使用pojo接收表单数据
请求的参数名称和pojo的属性名称一致,会自动将请求参数赋值给pojo的属性。
要求pojo对象中的属性名和表单中input的name属性一致。
@RequestMapping("/updateitem")
public String updateItem(Items items) {
itemService.updateItem(items);
return "success";
}
注意:提交的表单中不要有日期类型的数据,否则会报400错误。如果想提交日期类型的数据需要用到后面的自定义参数绑定的内容。
2).解决乱码问题
当测试程序时会发现出现了乱码问题,一下是post/get分别的解决方式
post: 解决方式在web.xml中加入过滤器
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
get: 解决方式有两种
方式一、对参数重新编码
String name = new String(item.getName().getBytes("iso-8859-1"),"utf-8");
方式二、直接修改tomcat的编码
<Connector URIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
4.绑定包装的pojo
包装类
Public class QueryVo {
private Items items;
}
注意页面定义
<input type="text" name="items.name" />
<input type="text" name="items.price" />
Controller接收
@RequestMapping("/queryitem")
public String queryItem(QueryVo queryVo) {
System.out.println(queryVo.getItems().getName());
System.out.println(queryVo.getItems().getPrice());
return null;
}
5.自定义参数绑定
在商品修改页面可以修改商品的生产日期,并且根据业务需求自定义日期格式。由于日期数据有很多种格式,所以springmvc没办法把字符串转换成日期类型。所以需要自定义参数绑定。两种方式:
方式一:自定义转化器 需要实现接口Converter
自定义Converter
//S:source, T:target
public class DateConverter implements Converter<String, Date> {
// 2016-02-03 13:22:53
@Override
public Date convert(String source) {
try {
return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(source);
} catch (ParseException e) {
return null;
}
}
}
配置Converter
<!-- 加载注解驱动 -->
<mvc:annotation-driven conversion-service="conversionService"/>
<!-- 转换器配置 -->
<bean id="conversionService"
class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="com.djc.springmvc.convert.DateConverter"/>
</set>
</property>
</bean>
方式二:在pojo类的日期属性上添加如下注解
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date createtime;
三,springmvc与Struts2的区别
- 前端控制器不一样 前者使用servlet,后者使用的是filter
- 接收参数的方式不一样,前者使用是形参直接绑定参数,后者使用的是属性驱动、模型驱动、对象驱动
- 在项目前者的Controller类是单例,后者action都是多例