MVC已经是现代Web开发中的一个很重要的部分,在项目开发中逐步替代了web层中的struts2框架,本篇简单介绍一下Spring MVC的基础参数绑定是如何处理的,高级参数绑定会在后续博文进行介绍。
默认支持的参数类型
既然学习Spring MVC的参数绑定,首先就要了解其它本身提供了哪些默认支持的参数类型。
处理器形参中添加如下类型参数,处理器会默认识别并进行赋值。
- HttpServletRequest:用于request对象获取请求信息
- HTTPServletResponse:通过response处理响应信息
- HTTPSession:通过session对象,得到session中存放的对象
Model和ModelMap
除了默认支持类型的参数,Spring MVC还可以自动封装Model或ModelMap对象,用于向页面传递数据。
- Model
Model是一个接口,在参数中直接声明model即可。如果使用Model对象,则可以不使用ModelAndView对象,Model对象可以向页面传递数据,View对象可使用String返回值代替,即String字符串为视图名称。
不管是Model还是ModelAndView,其本质都是使用Request对象向JSP页面传递数据。
/**
* 根据id查询商品,使用Model
*
* @param request
* @param model
* @return
*/
@RequestMapping("/itemEdit")
public String queryItemById(HttpServletRequest request, Model model) {
// 从request中获取请求参数
String strId = request.getParameter("id");
Integer id = Integer.valueOf(strId);
// 根据id查询商品数据
Item item = this.itemService.queryItemById(id);
// 把商品数据放在模型中
model.addAttribute("item", item);
return "itemEdit";
}
- ModelMap
ModelMap是Model接口的实现类,也可以使用ModelMap向页面传递数据。同样在参数列表出生命ModelMap对象,Spring MVC帮助我们生成ModelMap对象。
/**
* 根据id查询商品,使用ModelMap
*
* @param request
* @param model
* @return
*/
@RequestMapping("/itemEdit")
public String queryItemById(HttpServletRequest request, ModelMap model) {
// 从request中获取请求参数
String strId = request.getParameter("id");
Integer id = Integer.valueOf(strId);
// 根据id查询商品数据
Item item = this.itemService.queryItemById(id);
// 把商品数据放在模型中
model.addAttribute("item", item);
return "itemEdit";
}
使用Model和ModelMap的效果一样,如果直接使用Model,则Spring MVC也会实例化为ModelMap对象。绑定简单类型
当请求的参数名称和处理器形参名称一致时,会将请求参数与形参进行绑定。这样,从request中取得参数的方法就可以进一步进行简化。
/**
* 根据id查询商品,绑定简单数据类型
*
* @param id
* @param model
* @return
*/
@RequestMapping("/itemEdit")
public String queryItemById(int id, ModelMap model) {
// 根据id查询商品数据
Item item = this.itemService.queryItemById(id);
// 把商品数据放在模型中
model.addAttribute("item", item);
return "itemEdit";
}
简单类型支持的数据类型
参数类型推荐使用包装数据类型,因为基础数据类型不可以为null。下表列出常用的基本数据类型:
整形 | Integer | int |
字符串 | String | |
单精度 | Float | float |
双精度 | Double | double |
布尔型 | Boolean | boolean |
说明:对于布尔型的参数,请求的参数值应为true或false或1或0。
请求的url,例如:http://localhost:8080/xxx.action?id=2&status=false
处理器方法:publicString editItem(Model model,Integer id,Boolean status)
@RequestParam
注解@RequestParam常用于处理简单类型的绑定问题,若参数名称与表单提交属性名称不同,可以使用此注解进行标注。
value属性:参数名称,即入参的请求参数名字(name属性),如value="itemId"表示请求的参数 区中的名字为itemId的参数的值将传入
required:是否必须,默认是true,表示请求中一定要有相应的参数,否则将报错,错误信息:TTPStatus 400 - Required Integer parameter 'XXXX' is not present
defaultValue:默认值,表示如果请求中没有同名参数时的默认值。
说明:若required设置为false,可以使用defaultValue属性进行指定默认值。
@RequestMapping("/itemEdit")
public String queryItemById(@RequestParam(value = "itemId", required = true, defaultValue = "1") Integer id,
ModelMap modelMap) {
// 根据id查询商品数据
Item item = this.itemService.queryItemById(id);
// 把商品数据放在模型中
modelMap.addAttribute("item", item);
return "itemEdit";
}
绑定POJO
如果提交的参数很多,或者提交的表单中内容很多的时候,如果使用简单类型绑定,那么方法的参数可能就有很多,给程序员的开发带来很大的不便利。在这种情况下,我们可以使用POJO接收前端提交的数据。
需要注意的是:POJO对象中的属性名称需要和表单中input标签中的name属性值保存一致。
页面定义如下图:
Pojo(逆向工程生成)如下图:
请求的参数名称和pojo的属性名称一致,Sprring MVC会自动将请求参数赋值给pojo的属性。
注意:
提交的表单中不要有日期类型的数据,否则会报400错误。如果想提交日期类型的数据需要用到后面的自定义参数绑定的内容。
绑定包装POJO
包装POJO,顾名思义是将POJO进一步的封装。前端表单中的name属性需要使用“对象.属性”进行数据提交。包装类定义如下所示:
public class QueryVo {
private Item item;
public void setItem(Item item) {
this.item = item;
}
public Item getItem() {
return this.item;
}
}
页面定义如下图:
// 绑定包装数据类型
@RequestMapping("/queryItem")
public String queryItem(QueryVo queryVo) {
System.out.println(queryVo.getItem().getId());
System.out.println(queryVo.getItem().getName());
return "success";
}
自定义参数绑定
在表单提交过程中,可能会有日期数据进行绑定,但是日期数据有多种数据格式,Spring MVC无法把字符串转换成日期类型。所以需要自定义参数绑定。
前端控制器接收到请求后,找到注解形式的处理器适配器,对RequestMapping标记的方法进行适配,并对方法中的形参进行参数绑定。可以在springmvc处理器适配器上自定义转换器Converter进行参数绑定。
一般使用<mvc:annotation-driven/>注解驱动加载处理器适配器,可以在此标签上进行配置。
自定义Converter
/**
* 转换日期类型的数据
* S:页面传递过来的类型
* T:转换后的类型
* Created by LXH on 2018/5/9.
*/
public class DateConveter implements Converter<String, Date> {
@Override
public Date convert(String s) {
try {
if(null != s) {
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return df.parse(s);
}
} catch (Exception e) {
}
return null;
}
}
在Spring MVC配置文件中配置转换工厂,并在转换工厂中引用Conveter转换器。
<!--配置Conveter转换器 转换工厂(转换日期)-->
<bean id="formattingConversionServiceFactoryBean" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<!--配置多个转换器-->
<property name="converters">
<list>
<!--自定义转换器的类型,配置为bean-->
<bean class="stu.l.springmvc.conversion.DateConveter"></bean>
</list>
</property>
</bean>
在使用Spring MVC时,有时会出现提交到数据库造成乱码问题,这时候需要在web.xml文件中配置相关的过滤器进行转换,具体配置如下所示:
<!--处理POST提交乱码问题-->
<filter>
<filter-name>encoding</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>encoding</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>