Controller方法参数绑定
- 一、参数绑定 -- @RequestParam、@PathVariable、@RequestBody、@CookieValue 注解
- 二、各种类型参数绑定
- 1. 默认支持的参数类型
- 2. Model/ModelMap
- 2.1 Model
- 2.2 ModelMap
- 3. 绑定简单类型
- 3.1. 支持的数据类型
- 3.2 @RequestParam - 用于处理简单类型的绑定
- 3.3 使用 @PathVariable 对URI中的参数做绑定
- 3.4 @CookieValue 绑定请求包中的Cookie值
- 4. 绑定pojo类型(实体类)
- 5. 绑定包装pojo
- 6. 自定义参数绑定 -- 例如时间参数
- 7. 绑定数组
一、参数绑定 – @RequestParam、@PathVariable、@RequestBody、@CookieValue 注解
- 什么注解都不加 :直接在参数列表里面写上前端传过来的参数名或者使用包装类
-
@RequestParam :
可以为名称不匹配的参数做绑定,也可以设置该参数是否必传,也可以为改
参数设置默认值(如果前端没有传,则默认值生效) -
@PathVariable :
主要用在restful开发风格中,用来对URI中的参数做绑定 -
@RequestBody :
用来接收请求体中的数据,特别的GET请求没有请求体,所以不可以用在GET请求中 -
@CookieValue :
用来绑定请求包中的Cookie值
二、各种类型参数绑定
1. 默认支持的参数类型
处理器形参中添加如下类型的参数处理适配器会默认识别并进行赋值。
- HttpServletRequest
通过request对象获取请求信息 - HttpServletResponse
通过response处理响应信息 - HttpSession
通过session对象得到session中存放的对象
RequestMapping("/itemEdit")
public ModelAndView queryItemById(HttpServletRequest request, HttpResponse response, HttpSession session) {
// 从request中获取请求参数
String strId = request.getParameter("id");
//添加数据
session.setAttribute("info",info);
//使用response进行重定向到编辑页面
response.sendRedirect("/springmvc-web2/itemEdit.action");
}
2. Model/ModelMap
2.1 Model
除了ModelAndView以外,还可以使用Model来向页面传递数据,
Model是一个接口,在参数里直接声明model即可。
如果使用Model则可以不使用ModelAndView对象,Model对象可以向页面传递数据,View对象则可以使用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);
// 把结果传递给页面
// ModelAndView modelAndView = new ModelAndView();
// 把商品数据放在模型中
// modelAndView.addObject("item", item);
// 设置逻辑视图
// modelAndView.setViewName("itemEdit");
// 把商品数据放在模型中
model.addAttribute("item", item);
return "itemEdit";
}
2.2 ModelMap
ModelMap是Model接口的实现类,也可以通过ModelMap向页面传递数据
使用Model和ModelMap的效果一样,如果直接使用Model,springmvc会实例化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);
// 把结果传递给页面
// ModelAndView modelAndView = new ModelAndView();
// 把商品数据放在模型中
// modelAndView.addObject("item", item);
// 设置逻辑视图
// modelAndView.setViewName("itemEdit");
// 把商品数据放在模型中
model.addAttribute("item", item);
return "itemEdit";
}
3. 绑定简单类型
当请求的参数名称和处理器形参名称一致时会将请求参数与形参进行绑定。
这样,从Request取参数的方法就可以进一步简化。
http://localhost:8080/xxx.action?id=2
/**
* 根据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";
}
3.1. 支持的数据类型
参数类型推荐使用包装数据类型,因为基础数据类型不可以为null
- 整形:Integer、int
- 字符串:String
- 单精度:Float、float
- 双精度:Double、double
- 布尔型:Boolean、boolean
- 说明:对于布尔类型的参数,请求的参数值为true或false。或者1或0
- 请求 url: http://localhost:8080/xxx.action?id=2&status=false
- 处理器方法:
public String editItem(Model model,Integer id,Boolean status)
3.2 @RequestParam - 用于处理简单类型的绑定
- 使用@RequestParam常用于处理简单类型的绑定。
- value: 参数名字,即入参的请求参数名字,如value=“itemId”表示请求的参数 区中的名字为itemId的参数的值将传入
- required: 是否必须,默认是true,表示请求中一定要有相应的参数,否则将报错
TTP Status 400 - Required Integer parameter ‘XXXX’ is not present - 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";
}
3.3 使用 @PathVariable 对URI中的参数做绑定
/**
* http://localhost:8080/first/fr/20
* @param age
* @return
*/
@ResponseBody
@GetMapping("/fr/{myage}")
public String firstRequest(@PathVariable("myage") Integer age,HttpServletRequest
request){
System.out.println(request.getRequestURI());
System.out.println(request.getRequestURL());
System.out.println("age="+age);
return "First Request";
}
3.4 @CookieValue 绑定请求包中的Cookie值
@GetMapping("/cookiereq")
@ResponseBody
public String cookieRequest(@CookieValue("JSESSIONID") String sessionId) {
System.out.println("拿到的cookie值为:"+sessionId);
return "vip3";
}
4. 绑定pojo类型(实体类)
要求: pojo对象中的属性名和表单中input的name属性一致。
请求的参数名称和pojo的属性名称一致,会自动将请求参数赋值给pojo的属性。
注意:
提交的表单中不要有日期类型的数据,否则会报400错误。如果想提交日期类型的数据需要用到后面的自定义参数绑定的内容。
Item类
public class Item {
private Integer id;
private String name;
private Float price;
private String detail;
}
ItemController
@RequestMapping("/updateItem")
public String updateItem(Item item) {
// 调用服务更新商品
this.itemService.updateItemById(item);
// 返回逻辑视图
return "success";
}
5. 绑定包装pojo
包装pojo类 : pojo类中包含一个或多个其他实体类
包装对象定义如下:
public class QueryVo {
private Item item;
}
接收查询条件
// 绑定包装数据类型
@RequestMapping("/queryItem")
public String queryItem(QueryVo queryVo) {
System.out.println(queryVo.getItem().getId());
System.out.println(queryVo.getItem().getName());
return "success";
}
6. 自定义参数绑定 – 例如时间参数
由于日期数据有很多种格式,springmvc没办法把字符串转换成日期类型。所以需要自定义参数绑定。
前端控制器接收到请求后,找到注解形式的处理器适配器,对RequestMapping标记的方法进行适配,并对方法中的形参进行参数绑定。可以在springmvc处理器适配器上自定义转换器Converter进行参数绑定。
一般使用<mvc:annotation-driven/>
注解驱动加载处理器适配器,可以在此标签上进行配置。
- 修改jsp页面
把商品生产日期的注释打开
<tr>
<td>商品生产日期</td0>
<td><input type="text" name="createtime" value="<fmt: formatDate value="${item.createtime}" pattern="yyy-MM-dd HH:mm:ss" </tr>
- 自定义Converter
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;
}
}
- 配置Converter
<!-- 配置注解驱动 -->
<mvc:annotation-driven conversion-service="conversionService" />
<!-- 转换器配置 -->
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class=" com.sxy.converter.DateConverter" />
</set>
</property>
</bean>
7. 绑定数组
可以使用两种方式
- 直接接收
- 包装类型 绑定数组类型,pojo的属性接收
/**
* @param queryVo
* @return
*/
@RequestMapping("queryItem")
public String queryItem(QueryVo queryVo, Integer[] ids) {
System.out.println(queryVo.getItem().getId());
System.out.println(queryVo.getItem().getName());
System.out.println(queryVo.getIds().length);
System.out.println(ids.length);
return "success";
}