首先说spring modules, 它是为spring定制的一些工具组件,官方地址在https://springmodules.dev.java.net/, 官网上是这样介绍的:Spring Modules is a collection of tools, add-ons and modules to extend the Spring Framework. The core goal of Spring Modules is to facilitate integration between Spring and other projects without cluttering or expanding the Spring core. 里面有很多子项目。其中commons validator是一个可配置的验证框架,使用方式和工作原理都和struts用的ValidatorPlugIn一样。它可以通过配置生成js在客户端验证, 也可以配合具有验证功能的spring controller实现server端验证.
我做得一个小例子在我的资源里大家可以下载http://download.csdn.net/source/3494112
项目是用eclipse做得包含了所有的jar包和文件直接运行即可
1 从https://springmodules.dev.java.net/下载jar包,我们将使用里面的spring-modules-validation.jar;
2 我使用的IDE是eclipse 新建一个web project名字叫做:springValdiateAnonation, 拷贝spring,jakarta-commons等相关的必要jar文件包括spring-modules-validation.jar到WEB-INF/lib/,拷贝c-rt.tld, spring.tld, spring-form.tld到WEB-INF/tld/;做好spring的基础配置工作,包括web.xml, applicationContext.xml, xxx-servlet.xml; 配置好log4j.properties;
3 在src下新建包web.kjt 在该包下建域对象User, 将作为我们的表单对象;
- public class User {
- private String userName;
- private String password;
- public String getUserName() {
- return userName;
- }
- public void setUserName(String userName) {
- this.userName = userName;
- }
- public String getPassword() {
- return password;
- }
- public void setPassword(String password) {
- this.password = password;
- }
- }
4 在web.kjt包下新建一个LoginController,因为使用spring mvc注解配置请求信息,所有就不用继承相应的controller,代码如下
- package com.kjt;
- import java.util.ArrayList;
- import java.util.List;
- import javax.validation.Valid;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Controller;
- import org.springframework.ui.ModelMap;
- import org.springframework.validation.BindingResult;
- import org.springframework.validation.Validator;
- import org.springframework.web.bind.annotation.ModelAttribute;
- import org.springframework.web.bind.annotation.RequestMapping;
- @Controller
- public class LoginController {
- @Autowired(required=false)
- Validator validator; //这个需要在applicationContext.xml中配置bean注射进来
- //客户端验证和后台验证配置的请求
- @RequestMapping("/login.do")
- public String login(@Valid @ModelAttribute("user")User user,BindingResult bindingResult,ModelMap modelMap){
- try {
- System.out.println("11");//看请求能否进来
- if (user.getUserName() ==null) {
- user=new User();
- modelMap.addAttribute(user);
- }
- else {
- validator.validate(user, bindingResult);//这个是对前台提交的数据进行验证
- }
- return"login";
- } catch (Exception e) {
- // TODO: handle exception
- System.out.println("错误信息"+e.getMessage());
- e.printStackTrace();
- return "welcome";
- }
- }
- @RequestMapping(value="/login1.do")//后台验证配置的请求
- public String login1(@Valid @ModelAttribute("user")User user,BindingResult bindingResult,ModelMap modelMap){
- try {
- System.out.println("22");
- if (user.getUserName() ==null) {
- user=new User();
- modelMap.addAttribute(user);
- }
- else {
- validator.validate(user, bindingResult);
- }
- return"login1";
- } catch (Exception e) {
- // TODO: handle exception
- System.out.println("错误信息"+e.getMessage());
- e.printStackTrace();
- return "welcome";
- }
- }
- }
需要说明的是User user,BindingResult bindingResult 这两个对象必须紧挨着,否则出错哦。他们bindingresult是把验证的错误信息存进他得errors属性里了
下面主要讲解springmvc 注解验证怎么配置,其实和springmvc xml验证没什么不同,就是配置请求方式不一样了
5 从springmodules下载包的sample中找validator-rules.xml,validation.xml拷贝到WEB-INF目录下, 打开观察一下这两个文件,你会发现他们和struts的validatorPlugin需要的两个配置文件一模一样 , 你甚至可以从你的struts项目中拷贝这两个文件拿过来修改修改即可工作.
validator-rules.xml预定义了一些验证器,比如required(必填项),minlength(最短长度), maxlength(最大长度), float(可输入小数),integer(可输入整数),mask(输入值要满足正则表达式要求), 这个文件大多数时候都不需要我们更改他们,除非为了拓展功能或者发现bug;
validation.xml定义了一些表单的验证规则,我们需要一个表单的验证功能就要在这个文件中配置一条验证信息. 这两个文件拷贝过来之后就可以配置验证器工厂和验证器了.
在applicationContext.xml中配置validatorFactory和beanValidator(为什么要在applicationContext中配置: 因为验证器可作为应用程序公用的组件,可以被所有的servlet共享):
- <!--
- 名字必须为messageSource,因为springmodules的jar包需要引用验证时需要引用名字为messageSource的bean
- 你可以试验一下把名字改,我试验之后是不是这个名字 前台显示的错误信息validator-rules.xml最上面注释掉的Validator Error Messages的key
- -->
- <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
- <property name="basename" value="messages" />
- </bean>
- <bean id="validatorFactory" class="org.springmodules.validation.commons.DefaultValidatorFactory">
- <property name="validationConfigLocations">
- <list>
- <value>WEB-INF/validator-rules.xml</value>
- <value>WEB-INF/validation.xml</value>
- </list>
- </property>
- </bean>
- <!--
- 在applicationContext.xml中配置validatorFactory和beanValidator
- (为什么要在applicationContext中配置: 因为验证器可作为应用程序公用的组件,可以被所有的servlet共享):
- -->
- <bean id="beanValidator" class="org.springmodules.validation.commons.DefaultBeanValidator">
- <property name="validatorFactory" ref="validatorFactory"/>
- </bean>
- <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
- <property name="prefix" value="WEB-INF/jsp/" />
- <property name="suffix" value=".jsp" />
- </bean>
6 打开validation.xml,在里面添加一个form,
- <form name="user">
- <field property="userName" depends="required"><!--depands 字段是配置需要满足的验证器,可配置多个-->
- <!--
- arg0是该字段的显示名,用于验证失败时显示提示信息
- key是定义在messageResource中的消息的key
- -->
- <arg0 key="用户名" />
- </field>
- <field property="password" depends="maxlength,required">
- <arg0 key="密码" />
- <arg1 name="maxlength" key="${var:maxlength}" resource="false" />
- <var>
- <var-name>maxlength</var-name>
- <var-value>10</var-value>
- </var>
- </field>
- </form>
7 配置需要的message, 为了在验证没通过时显示出错信息, 需要把示例文件validator-rules.xml最上面注释掉的Validator Error Messages拷贝到message.properties中,并且把它放在classpath下.同时需要在applicationContext.xml中配置messageSource,
- <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
- <property name="basename" value="messages" />
- </bean>
同时在message.properties中添加form字段的显示名称, 则本例的messages.properties全文如下:
- #english message file
- errors.required={0} is required.
- errors.minlength={0} can not be less than {1} characters.
- errors.maxlength={0} can not be greater than {1} characters.
- errors.invalid={0} is invalid.
- errors.byte={0} must be a byte.
- errors.short={0} must be a short.
- errors.integer={0} must be an integer.
- errors.long={0} must be a long.
- errors.float={0} must be a float.
- errors.double={0} must be a double.
- errors.date={0} is not a date.
- errors.range={0} is not in the range {1} through {2}.
- errors.creditcard={0} is an invalid credit card number.
- errors.email={0} is an invalid e-mail address.
- common.messages.close=Close
- user.name=userName
- user.password=userPassword
8 编辑jsp表单页面login.jsp,
- <%@ page language="java" contentType="text/html; charset=GB18030" pageEncoding="GB18030"%>
- <%@ taglib uri="/WEB-INF/tld/c-rt.tld" prefix="c"%>
- <%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
- <%@ taglib uri="/WEB-INF/tld/spring-form.tld" prefix="form"%>
- <%@ taglib uri="http://www.springmodules.org/tags/commons-validator" prefix="validator" %>
- <validator:javascript formName="user" staticJavascript="true" xhtml="true" cdata="false" />
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=GB18030">
- <title>登录页面</title>
- </head>
- <body>
- <h1>欢迎访问,登录页面</h1>
- <form action="login.do" method="post" id="user" name="user" onsubmit="return validateUser(this);">
- <table>
- <tr>
- <td>
- 用户名:
- </td>
- <td>
- <spring:bind path="user.userName">
- <input type="text" id="userName" name="userName" value="${status.value}"/>
- <font color="red"><c:out value="${status.errorMessage}"/></font>
- </spring:bind>
- </td>
- </tr>
- <tr>
- <td>
- 密码:
- </td>
- <td>
- <spring:bind path="user.password">
- <input type="text" id="password" name="password" value="${status.value}"/>
- <font color="red"><c:out value="${status.errorMessage}"/></font>
- </spring:bind>
- </td>
- </tr>
- <tr>
- <td>
- <input type="submit" value="登录" >
- </td>
- <td></td>
- </tr>
- </table>
- </form>
- </body>
- </html>
上面的配置是javascript和后台一起验证的
启动javascript验证在页首需要加入
<validator:javascript formName="book" staticJavascript="true" xhtml="true" cdata="false" />
部署到tomcat并测试:http://localhost:8080/springValdiateAnonation/login.do
后台验证界面
客户端验证界面