SpringMVC和FreeMarker整合中使用注解方式的后台数据校验validate(部分自己扩展)
2017-10-11 09:38
483 查看
前提概要
本文主题:在Spring MVC和FreeMarker整合的项目中,采用JSR-303验证框架,通过注解的方式进行数据验证
基础框架:
MVC:Spring MVC 3
视图:FreeMarker
验证:Hibernate-validator实现
需要JAR包:
0、Spring MVC和FreeMarker所需jar包
1、org.hibernate.validator-4.1.0.GA.jar
2、javax.validation-1.0.0.GA.jar
配置文件和Java代码的修改
在Spring MVC配置文件中添加配置
添加以下mvc的注解驱动配置,一切变成“自动化”
<mvc:annotation-driven />
在JavaBean中添加数据校验的注解
其中@Length、@Email就是Hibernate-validator中的数据校验注解,还可以用javax.validation中的注解,比如@NotNull
public class SystemUser { @Length(min = 5, max = 20, message = "用户名长度必须位于5到20之间") private String userName; @Email(message = "比如输入正确的邮箱") private String email; }
在Controller方法中指定需要进行校验
首先,要在需要进行校验的Bean前面加上@Valid注解,告诉SpringMVC框架这个Bean需要进行校验;同时,还要在需要校验的Bean前面加上@ModelAttribute注解,从而将Bean暴露给视图,并且指定名字,这有两个作用,第一是显示校验错误需要使用这个名字,第二个是返回原来的页面以后,前面输入的所有值还要显示出来;
其次,每个需要校验的Bean后面紧跟一个BindingResult,SpringMVC框架会将校验结果保存在它里面,通过hasErrors方法可以判断是否有校验错误;
最后,当返回到原页面以后,SpringMVC框架还会将所有校验错误信息保存在上下文中,供页面上取得校验错误,Spring提供了一套JSP自定义标签。
@RequestMapping(value = "/create.html", method = RequestMethod.POST) public String doCreateUser( @Valid @ModelAttribute("userDetail") SystemUser user, BindingResult bindingResult, HttpServletRequest request) { // 如果有校验错误,返回添加用户的页面 if (bindingResult.hasErrors()) { return "/user/create"; } this.userService.createUser(user); return "/user/list.html"; }
进行自定义校验
如果需要添加自定义校验,比如验证用户名是否已经被使用了,那么简单的注解自然无能为力,需要自己编码实现,如果校验失败,可以手动将自定义校验错误添加到BindingResult中。@RequestMapping(value = "/user/create.html", method = RequestMethod.POST) public String doCreateUser( @Valid @ModelAttribute("userDetail") SystemUser user, BindingResult bindingResult, HttpServletRequest request) { // 如果有数据校验错误,返回添加用户的页面 if (bindingResult.hasErrors()) { return "/user/create"; } boolean isUserNameExist = this.userService.checkUserByUserName(user.getUserName()); // 如果用户名已存在,返回添加用户的页面 if (isUserNameExist) { // 向BindingResult添加用户已存在的校验错误 bindingResult.rejectValue("userName", "该用户名已存在", "该用户名已存在"); return "/user/create"; } this.userService.createUser(user); return "/user/list.html"; }
在JSP页面上显示校验错误信息
返回页面以后,SpringMVC框架将所有校验错误信息都放在了上下文中,可以自己去取出来,但是那样非常麻烦,不过没关系,Spring提供了一套自定义标签,可以方便的显示校验错误信息。页面头部需要导入Spring的自定义标签库
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
需要一次性显示全部校验错误
(commandName的值就是@ModelAttribute注解中指定的值)
<form:form commandName="userDetail"> <form:errors path="*" cssStyle="color:red"></form:errors> </form:form>
需要在对应输入框的后面显示单个校验错误
(通过path指定显示那个具体的校验错误,userDetail正是@ModelAttribute注解中指定的值,而点号后面则是指定显示Bean中哪个属性的校验错误)
<input type="text" name="userName" value="${userDetail.userName}" > <form:errors path="userDetail.userName" cssStyle="color:red"></form:errors> <input type="text" name="email" value="${userDetail.email}"> <form:errors path="userDetail.email" cssStyle="color:red"></form:errors>
在FreeMarker视图上面显示校验错误
如果视图使用的是FreeMarker,Spring同样提供了一套“自定义标签库”,在FreeMarker中叫做自定义宏,使我们可以方便的显示出校验错误信息。先在spring-webmvc-xx.jar下的\org\springframework\web\servlet\view\freemarker下找到spring.ftl文件,copy到工程目录中;
它里面定义了很多的宏命令,同时还可以添加自定义的宏命令:
1,扩展命令
<#macro showErrors_lee>
<#if error?exists>
<script type="text/javascript">
<#list error as e>
$("[for='${e.field}']").show().text("${e.defaultMessage}");
</#list>
</script>
</#if>
bf74
<#macro>
2,同时XXXController的save方法需要加入验证以及错误处理
@RequestMapping(value="/save",method=RequestMethod.POST)
public String save (@Valid Role role, BindingResult result, Model model){
if (result.hasErrors()){
model.addAttribute("entity", role);
model.addAttribute("error",result.getAllErrors());//配合showErrors_lee使用
return "base/role_edit";
}
roleService.save(role);
return "redirect:/role";
}
3,同时ftl如下:
role_edit.ftl 这个页面的变动不大,主要就是四点,具体的可以查看源码。
1 、引入并定义 < #import"/common/spring.ftl" as spring/>
2 、在角色名 input 后面增加 < label class="error" for="name" style="display:none;"></label>
3 、然后加入 jquery.js ,用来解析 showErrors_lee 中的脚本
4 、使用 < @spring.showErrors_lee/>
<form action="${ctx}/validator/save" method="post"> <input type="input" name="nickname" value="${(user.nickname)!''}"/> <label class="error" for="nickname" style="display:none;"></label> <#if user??> <@spring.bind "user.nickname" /> <@spring.showErrors_lee /> </#if> <br/><input type="input" name="age" value="${(user.age)!''}"/> <#if user??> <@spring.bind "user.age" /> <@spring.showErrors "<br>","error"/> </#if> <br/><input type="submit" value="提交"/> </form>
所有首先,需要导入Spring专门为FreeMarker提供的宏指令文件
<#import "spring.ftl" as spring />
或者在Springmvc配置文件FreeMarkConfigurer下增加一个属性
<prop key="auto_import">common/spring.ftl as spring</prop>
可以用<@spring.formInput "xxx.xxx" />
<@spring.showErrors "" />
或者
<@spring.bind "xxx.xx" />
<#list spring.status.errorMessages as error> ${error}
</#list>显示错误信息
错误信息的样式控制
1,class="error". <@spring.showErrors "<br>","error"/> 2, 自定义style="". <@spring.showErrors "<br>",":style='color:red;'"/>
然后就可以在每个输入框后面显示单个校验错误了
(bind后面的值与JSP中显示校验错误时的path是一致的)
<input type="text" name="userName" value="${(userDetail.userName)!}" /> <#if userDetail??> <@spring.bind "userDetail.userName" /> <@spring.showErrors "<br>"/> </#if> <input type="text" name="email" value="${(userDetail.email)!}" /> <#if userDetail??> <@spring.bind "userDetail.email" /> <@spring.showErrors "<br>"/> </#if>
同时:@ModelAttribute("term")Terms term, BindingResult result
在freemarker中 <form action="regDo.do" method="POST"> <table style="width: 100%; height: 100%" border="0" cellspacing="0" cellpadding="0"> <tr> <th>termId---</th> <td>[@spring.formInput "term.termId" /]</td> <td>[@spring.showErrors "" /]</td> </tr> <tr> <th></th> <td></td> <td>[@spring.showErrors "" /]</td> </tr> <tr> <th>taxonomy</th> <td>[@spring.formInput "term.taxonomy" /]</td> <td></td> </tr> <tr> <th>termName</th> <td>[@spring.formInput "term.termName" /]</td> <td>[@spring.showErrors "" /]</td> </tr> <tr> <th></th> <td></td> <td>[@spring.showErrors "" /]</td> </tr> <tr> <td> </td> <td><input type="submit" name="btn_tijiao" value="提交注册" /></td> </tr> </table> </form> 那么: 原来他是先根据 [@spring.formInput "term.termId" /] 然后才能输出 [@spring.showErrors "" /] 只要不再调用下一个[@spring.formInput 那么即使多次调用[@spring.showErrors "" /] 显示的信息依旧是上一个的 但是开始时候不能先 <td>[@spring.showErrors "" /]</td> 再 [@spring.formInput "term.termId" /]
原文链接:http://doc.okbase.net/yunzhu/archive/83457.html
相关文章推荐
- SpringMVC和FreeMarker整合中使用注解方式的后台数据校验
- springmvc4整合AJAX使用@ResponseBody注解返回JSON数据格式
- JAVAWEB开发之SpringMVC详解(一)——SpringMVC的框架原理、架构简介、与mybatis整合和注解方式的使用、
- JAVAWEB开发之SpringMVC详解(一)——SpringMVC的框架原理、架构简介、与mybatis整合和注解方式的使用、
- springmvc3.2+spring+hibernate4全注解方式整合(四)
- springMVC整合memcached,以注解形式使用
- Entity Framework后台采用分页方式取数据与AspNetPager控件的使用
- 提高生产力:SpringMVC中,使用扩展数据类型TypedMap接收Web请求参数
- springMVC和easyUI结合使用(前后台通过json传递数据)的实例
- SpringMVC使用自定义注解的方式实现session检查
- SpringMVC中使用注解方式的对象验证
- springMVC整合memcached,以注解形式使用
- 使用ODI进行数据整合过程中的数据源、目标与临时区域(staging area)的分布情况与执行方式
- Spring集成Hibernate,使用JPA注解方式,新增数据无法提交
- springMVC整合jedis+redis,以注解形式使用
- EJB通过注解方式注入并使用其他EJB或者服务、配置JBoss数据源
- 提高生产力:SpringMVC中,使用扩展数据类型TypedMap接收Web请求参数
- SpringMVC3.2+JPA使用注解的方式环境搭建
- SpringMVC的controller方法中注解方式传List参数使用@RequestBody
- springMVC使用注解方式进行页面跳转