长大后想做什么?做回小孩!

0%

SpringMVC中的非集合参数绑定

默认支持、Model/ModelMap、绑定简单类型、pojo、自定义类型

1.绑定默认支持的参数类型

处理器形参中添加如下类型的参数处理适配器默认识别进行赋值

1-1 HttpServletRequest

通过request对象获取请求信息。(例如:如果需要从请求中把参数取出来,只需要在Controller方法的形参中添加一个参数即可,Springmvc框架会自动把Request对象传递给方法。)

1-2 HttpServletResponse

通过response处理响应信息。

1-3 HttpSession

通过session对象得到session中存放的对象。


2. Model/ModelMap

2-1 Model

除了ModelAndView以外,还可以使用Model来向页面传递数据,Model是一个接口,在参数里直接声明model即可。

如果使用Model则可以不使用ModelAndView对象Model对象可以向页面传递数据View对象则可以使用String返回值替代

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/**
* 根据id查询商品,使用Model
*
* @param request
* @param model
* @return
*/
@RequestMapping("/itemEdit.action")
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);

// 把结果传递给页面
// ModelAndView modelAndView = new ModelAndView();
// 把商品数据放在模型中
// modelAndView.addObject("item", item);
// 设置逻辑视图
// modelAndView.setViewName("itemEdit");

// 把商品数据放在模型中,相当于ModelAndView.addObject(name,value)
model.addAttribute("item", item);

// 相当于ModelAndView.setViewName("viewName")
return "itemEdit";
}

2-2 ModelMap

ModelMap是Model接口的实现类,也可以通过ModelMap向页面传递数据。

使用ModelMap和Model的用法和效果一样,如果直接使用Model,springmvc会实例化ModelMap。


3. 绑定简单类型

3-1 请求中参数名称处理器形参名一致

请求的参数名称处理器形参名一致时会自动将请求参数与形参进行绑定。

这样,从Request取参数的方法就可以进一步简化。

支持的数据类型:

​ 整形:Integer、int

​ 字符串:String

​ 单精度:Float、float

​ 双精度:Double、double

​ 布尔型:Boolean、boolean

说明:URL中对于布尔类型的参数,请求的参数值为true或false。或者1或0。

参数类型推荐使用包装数据类型,因为基础数据类型不可以为null。

3-2 @RequestParam

请求的参数名称处理器形参名不一致时,可以使用注解进行绑定。

注解的参数:

value:参数名字,即入参的请求参数名字,如value=“itemId”表示请求的参数区中的名字为itemId的参数的值将传入。

required:是否必须,默认是true,表示请求中一定要有相应的参数,否则将报错:TTP Status 400 - Required Integer parameter ‘XXXX’ is not present

defaultValue:默认值,表示如果请求中没有同名参数时的默认值。

1
2
3
4
5
6
7
8
9
10
11
12
@RequestMapping("/itemEdit")
//将请求域中名为“itemId”的参数 和 方法中名为“id”的形参绑定
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";
}

4. 绑定pojo类型

4-1 绑定普通pojo类型(属性中不含pojo类)

使用pojo接收表单数据,如果提交的参数很多,或者提交的表单中的内容很多的时候,可以使用简单类型接受数据,也可以使用pojo接收数据。

要求:pojo对象中的属性名和表单中input的name属性一致。

请求的参数名称pojo的属性名称一致,会自动将请求参数赋值给pojo的属性。

4-2 绑定包装pojo类型

例如这种包装pojo类:

1
2
3
4
5
6
7
8
public class Item {

private Integer id;
private String itemname;
private Double price;
private Date itemdate;
set/get。。。
}
1
2
3
4
public class QueryVo {
private Item item;
set/get。。。
}

jsp表单中:

1
2
3
4
<tr>
<td><input type="text" name="item.id"></td>
<td><input type="text" name="item.itemname"></td>
</tr>

controller中接收包装pojo类的值

1
2
3
4
5
6
7
@RequestMapping("/queryItem")
public String queryItem(QueryVo queryVo) {
System.out.println(queryVo.getItem().getId());
System.out.println(queryVo.getItem().getItemname());

return "success";
}

5. 自定义参数绑定

例如,前端页面中修改商品的生产日期,并且根据业务需求自定义日期格式。

由于日期数据有很多种格式,springmvc没办法把字符串转换成日期类型。所以需要自定义参数绑定。

前端控制器接收到请求后,找到注解形式的处理器适配器对RequestMapping标记的方法进行适配,并对方法中的形参进行参数绑定。可以在springmvc处理器适配器自定义转换器Converter进行参数绑定

一般使用mvc:annotation-driven标签注解驱动加载处理器适配器,可以在此标签上进行配置。

5-1. 如果使用MVC注解驱动的方式加载处理器适配器处理器映射器

先写一个日期转换器类(DateConverter),实现Converter<S, T>接口:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//Converter<S, T>
//S:source,需要转换的源的类型
//T:target,需要转换的目标类型
public class DateConverter implements Converter<String, Date> {

@Override
public Date convert(String source) {
try {
// 把字符串转换为日期类型
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyy-MM-dd HH:mm:ss");
Date date = simpleDateFormat.parse(source);

return date;
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 如果转换异常则返回空
return null;
}
}

可以同时配置多个转换器,在springmvc.xml配置文件中进行配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
<!-- 配置注解驱动 -->
<!-- 如果配置此标签,可以不用配置处理器适配器和处理器映射器 -->
<mvc:annotation-driven conversion-service="conversionService" />

<!-- 转换器工厂配置 -->
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<!-- 自己写的转换器配置 -->
<property name="converters">
<set>
<bean class="nynu.converter.DateConverter" />
</set>
</property>
</bean>

5-2. 如果使用独立配置加载处理器适配器处理器映射器

转换器类的编写同上。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<!--注解适配器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="webBindingInitializer" ref="customBinder"></property>
</bean>

<!-- 自定义webBinder -->
<bean id="customBinder" class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
<property name="conversionService" ref="conversionService" />
</bean>

<!-- 转换器配置 -->
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="cn.itcast.springmvc.convert.DateConverter" />
</set>
</property>
</bean>