1.springMVC注解开发:
包装类型pojo参数绑定:
1.在形参中 添加httpServletRequest Request参数,通过request来接收条件参数。
2.在形参中 让包装类型的pojo接收条件参数
分析:
页面传参是复杂多样性的。
2.
数组绑定、list绑定,map绑定。
1.使用List接收页面提交的批量数据,通过包装pojo接收,在包装pojo中定义list<pojo>属性。
3.服务端校验:
1.通常使用最多的是前端校验,比如js校验。对于安全性较高的建议在服务端进行校验。
2.服务端校验:控制层controller--校验页面请求的参数的合法性
3.业务层校验:(使用最多)主要校验关键业务参数、仅限于service接口中的使用参数。
3.持久层校验:一般是不检验的。
4.springMVC校验使用hibernate的校验框架validation(和hibernate没有任何关系)
思路:页面提交请求的参数,请求道controller方法中,使用validation进行校验,如果校验出错,将错误信息展示到页面。
hibernate-validator-4.3.0.Final.jar
jboss-logging-3.1.0.CR2.jar
validation-api-1.0.0.GA.jar
校验规则:
<!-- 校验器 -->
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<!-- hiberante校验 -->
<property name="providerClass" value="org.hibernate.validator.HibernateValidator"/>
<!-- 指定校验的资源文件,如果不指定,默认使用classpath下validationMessages.properties -->
<property name="validationMessageSource" ref=""/>
</bean>
<!-- 校验资源文件 -->
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<!-- 资源文件名 -->
<property name="basenames">
<list>
<value>classpath:CustomValidationMessage</value>
</list>
</property>
<!-- 资源文件编码格式 -->
<property name="fileEncodings" value="utf-8"/>
<!-- 文件内容缓存时间 -->
<property name="cacheSeconds" value="120"/>
</bean>
<!-- 注解映射器 -->
<!-- 注解适配器 -->
<mvc:annotation-driven validator="validator"></mvc:annotation-driven>
//校验名称
@Size(min=1,max=30,message="{items.name.length.error}")
private String name;
//非空校验
@NotNull(message="{items.createtime.isNull}")
private Date createtime;
CustomValidationMessage.properties:
items.name.length.error=\u8BF7\u8F93\u51651\u523030\u4E2A\u5B57\u7B26\u7684\u5546\u54C1\u540D\u79F0
items.createtime.isNull=\u8BF7\u8F93\u5165\u5546\u54C1\u7684\u751F\u4EA7\u65E5\u671F
//在你需要校验的pojo前边添加@Validated,在后面添加BindingResult bindingResult接收错误信息
//@Validated 和BindingResult bindingResult配对出现,且按顺序
@RequestMapping("/editqueryItems")
public ModelAndView editqueryItems(@Validated ItemsQueryVo itemsQueryVo,BindingResult bindingResult)throws Exception{
//获取检验错误方法
if(bindingResult.hasErrors()){
//输出错误信息
List<ObjectError> allErrors=bindingResult.getAllErrors();
for (ObjectError objectError : allErrors) {
//输出错误信息
System.out.println(objectError.getDefaultMessage());
}
//传到页面上去
model.addAttribute("allErrors", allErrors);
return "到从新修改页面";
}
<!-- 页面显示错误信息 -->
<c:if test="${allErrors!=null }">
<c:forEach items="${allErrors}" var="error">
${error.defaultMessage }
</c:forEach>
</c:if>
5.分组校验:
在pojo中定义校验规则,而pojo是被多个controller所共用,不同的controller对同一个pojo进行校验,但是每个controller方法需要不同的检验。
解决方法:
定义多个 检验分组(接口),分组中每个controller方法使用不同的校验分组。
/**
* @描述: 校验分组
*
*/
public interface ValidGroup1 {
//接口不需要定义任何方法。仅是对不同的检验规则进行分组。
}
//检验名称在1到30的字符
//message提示出错信息
//groups此校验属于哪个分组,可以定义多个分组。
@Size(min=1,max=30,message="{items.name.length.error}",groups={ValidGroup1.class})
private String name;
//在你需要校验的pojo前边添加@Validated,在后面添加BindingResult bindingResult接收错误信息
//@Validated 和BindingResult bindingResult配对出现,且按顺序
//value={ValidGroup1.class}指定使用validgroup1分组
@RequestMapping("/editqueryItems")
public ModelAndView editqueryItems(@Validated(value={ValidGroup1.class}) ItemsQueryVo itemsQueryVo,
BindingResult bindingResult)throws Exception{