特殊类型的参数绑定:
包装类型的pojo参数绑定:
需求:
实现商品查询条件,在商品查询的controller中实现商品查询条件的传入
实现的方法:
1、在形参中添加HttpRequestServlet request参数,通过request接收查询条件参数
2、在形参中让包装类型的pojo接收查询条件参数
分析:
页面传参数的特点:
比较复杂,比较多样性(参数包括用户账号、订单的信息。。。),没有规律
如果将这些放到简单的pojo(属性是简单类型的)类中,pojo类中属性比较多,比较乱
建议使用包装类型的pojo,属性是pojo
页面的参数和controller形参的定义:
页面的参数:
对于pojo类里面的pojo的属性,可以直接用包装类.被包装类.属性名
SQL语句只是单表查询的话可以不采用包装类
对于综合查询,需要设置包装类
包装类尽量不要用继承
集合类型的参数绑定:
数组:
需求:
商品的批量删除
用户在页面选中多个选项,实现批量删除
实现:
表现层的实现
关键:
将页面多项选择的id传到controller方法的形参中
方法的形参使用数组来接收页面请求的多个id
页面的定义:
controller方法的定义:
List:
需求:
批量提交数据
将提交的数据绑定的list<pojo>中,比如:
成绩的录入(多门课的成绩,批量提交)
批量商品的修改:
将多个商品信息提交到controller方法
表现层的实现:
页面的定义:
controller方法的定义:
进入批量商品修改页面(页面样式参考商品信息查询页面)
批量修改商品的提交,在形参里面不能直接写List
使用List来接收页面提交的批量数据,通过包装pojo接收,在pojo中定义List<pojo>属性
在形参中添加包装有List<pojo>的pojo
Map:
在包装里面定义map,也是通过包装类型来接收
商品修改
校验的理解:
在项目中,通常使用较多的是前端的校验,比如说页面中js校验,对于安全要求较高点建议在服务端进行校验
服务端校验:
控制层controller:校验页面请求的参数的合法性。在服务端控制层controller校验,不区分客户端类型(浏览器、手机客户端、远程调用)
业务层service(使用较多的):主要校验关键业务参数,仅限于service接口中所使用的参数
持久层dao:一般是不校验的
添加校验:
思路:
页面提交请求的参数,请求到controller方法中,使用validation进行校验。如果校验出错,将错误信息展示到界面
具体的需求:
商品修改,添加校验(校验商品名称的长度、生产日期的非空校验),如果校验出错,在商品修改页面显示错误信息
SpringMVC提供的校验:
使用Hibernate的validation校验框架,和Hibernate没有任何关系
环境的准备:
hibernate-validator
jboss-logging
validation-api
配置校验器:
校验器注入到处理器适配器中:
org.hibernate.validator.HibernateValidator
指定校验使用的资源文件,在文件中配置校验错误信息,如果不指定则使用classpath下的ValidationMessage.properties
<mvc:annotation-driven>里面包含validator属性
在pojo中添加校验规则:
比如用户名的长度限制在6-16个字符:
@Size(min=6,max=16,message="提示信息")
但是提示信息一般配置在配置文件中,用key=value的形式来写,在pojo的message里面写入{key}
非空校验:
@NotNull(message="")
实现校验功能:
在需要校验的controller的pojo前面加入@Validated 在需要校验的pojo后面BindingResult bindingresult,用来接收校验错误的信息,这两个配对出现,顺序是固定的
必须使一前一后
获取校验错误的信息:
if(bindingresult.hasErrors()){
List<ObjectError> allerrors = bindingresult.getAllErrors();
for(ObjectError objecterror : allerrors){
System.out.println(objecterror.getDefaultMessage());//输出错误信息
}
}
在页面显示错误信息:
model.setAttribute(arg0,arg1);
用<c:forEach>遍历错误信息
用${var里面的值.DefaultMessage}来打印输出
分组校验:
需求:
在pojo中定义校验规则,而pojo是被多个controller调用,当不同的controller对同一个pojo进行校验,但是每个controller方法需要不同的校验
解决方法:
定义多个校验的分组(其实是一个java接口)
每个controller方法使用不同的校验分组,在这个分组中定义有哪些规则,每个controller方法使用不同的校验分组
校验的分组:
定义不同的接口,接口中不需要定义方法仅是对不同的校验规则进行分组
在校验规则中添加分组:
@Size(min=6,max=16,message="提示信息",groups="Group1.class")
groups可以定义多个分组
在controller中使用指定分组的校验:
@Validated(value={Group1.class})指定分组的校验
网友评论