客户端请求携带的key/value 键值对 绑定到 Controller方法的形参上。
1,默认支持的参数类型
HttpServletRequest、HttpServletResponse、HttpSession、Model、ModelMap
Model 将参数绑定到request域中。
2,简单类型参数绑定
@RequestParam
在不使用时,前端发送的参数key名应和Controller的方法名中参数名一致。
当使用后,前端发送和后端接收参数名可以不一样,通过@RequestParam(value=”sendParamKey”) String reseveparamKey中 @RequestParam 中也可以指定一下属性:
value指定前端发送的参数名,绑定到reseveparamKey中。
required 属性限定改参数是否为必传传递;
defaultValue 属性表示参数默认值。
3,PoJo类绑定
前提 :传递的参数key名应和pojo类的属性名一致。
4,自定义参数绑定
举例:前台传递的 “1990/9/9 9:9:9” 绑定到后台的Pojo类的Date类型属性上
第一步:编写类实现 Converter接口
public class CustomDateConverter implements Converter {
@Override
public Date convert(String source) {
try {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return simpleDateFormat.parse(source);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
第二步:配置注册转换组件
5,Pojo 包装类型参数
前台传递参数 classb.attr1=111 后台方法接收参数 classa;Classb 为classa的 属性类型;为了解决有时候请求中两个不同对象所含属性名相同,如果前台传参值说明属性名则系统不能区分传递给哪个对象的属性,故可以使用在进行一次包装。
6,数组绑定(包装类型接收)
页面定义如下:
页面选中多个checkbox向controller方法传递
传递到controller方法中的格式是:001,002,003
Controller方法中可以用String[]接收,定义如下:
public String deleteitem(String[] item_id)throws Exception{
System.out.println(item_id);
}
7,List 参数绑定(包装类型接收)
List中存放对象,并将定义的List放在包装类中,action使用包装对象接收。
List中对象:
成绩对象
Public class QueryVo {
Private List itemList;//商品列表
//get/set方法..
}
页面定义如下:
上边的静态代码改为动态jsp代码如下:
.....
.....
Contrller方法定义如下:
public String useraddsubmit(Model model,QueryVo queryVo)throws Exception{
System.out.println(queryVo.getItemList());
}
8,其他参数类型绑定 Map
页面定义如下:
学生信息:
姓名:
年龄:
.. .. ..
Contrller方法定义如下:
public String useraddsubmit(Model model,QueryVo queryVo)throws Exception{
System.out.println(queryVo.getStudentinfo());
}
第一步:导入校验的相关依赖包
第二步:配置校验器
classpath:CustomValidationMessages
第三步:请求方法上添加参数校验
注意:添加@Validated表示在对items参数绑定时进行校验,校验信息写入BindingResult中,在要校验的pojo后边添加BingdingResult, 一个BindingResult对应一个pojo,且BingdingResult放在pojo的后边。
// 商品修改提交
@RequestMapping("/editItemSubmit")
public String editItemSubmit(@Validated @ModelAttribute("item") Items items,BindingResult result,@RequestParam("pictureFile") MultipartFile[] pictureFile,Model model) throws Exception {
//如果存在校验错误则转到商品修改页面
if (result.hasErrors()) {
List errors = result.getAllErrors();
for(ObjectError objectError:errors){
System.out.println(objectError.getCode());
System.out.println(objectError.getDefaultMessage());
}
}
return "item/editItem";
}
校验器注入到处理器适配器中
在pojo中添加校验规则
public class Items {
private Integer id;
@Size(min=1,max=30,message="{item.name.length.error}")
private String name;
@NotEmpty(message="{pic.is.null}")
private String pic;
错误消息文件CustomValidationMessages
item.name.length.error=商品名称在1到30个字符之间
pic.is.null=请上传图片
分组校验
如果两处校验使用同一个Items类则可以设定校验分组,通过分组校验可以对每处的校验个性化。
需求:商品修改提交只校验商品名称长度
分组就是一个标识,这里定义一个接口:
public interface ValidGroup1 {
}
public interface ValidGroup2 {
}
指定分组校验
public class Items {
private Integer id;
//这里指定分组ValidGroup1,此@Size校验只适用ValidGroup1校验
@Size(min=1,max=30,message="{item.name.length.error}",groups={ValidGroup1.class})
private String name;
// 商品修改提交
@RequestMapping("/editItemSubmit")
public String editItemSubmit(@Validated(value={ValidGroup1.class}) @ModelAttribute("item")
Items items,BindingResult result,@RequestParam("pictureFile") MultipartFile[] pictureFile,Model model)throws Exception {
在@Validated中添加value={ValidGroup1.class}表示商品修改使用了ValidGroup1分组校验规则,也可以指定多个分组中间用逗号分隔,
@Validated(value={ValidGroup1.class,ValidGroup2.class })