SpringMVC和FreeMarker整合中使用注解方式的后台数据校验validate(部分自己扩展)

前提概要

本文主题:

在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>
        <#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>&nbsp;</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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值