SpringMVC 和 Hibernate Validator的结合(初级)- 基于注解后端数据校验
2014-06-15 11:36
771 查看
目录
参考: http://blog.csdn.net/soundfly/article/details/17380755
在Tomcat 中部署需要注意, 正确的将J2EE中 bean-Validator.jar copy到 对应项目的lib目录下,否则会初始失败。 因为myEclipse 不会将j2ee的包自动拷贝到Tomcat下. 当你开发jmail时也会遇到相似的问题.
项目总体目录:
hibernate validator 是对J2EE bean-Validator的实现,下载地址: http://hibernate.org/validator/, 这里因为springMVC 3.1 和 hibernate validator 5.0 .jar有些地方不兼容,因此推荐下载hibernate validator 4.3的版本.
首先是javaBean
其中校验错误提示信息在ValidationMessages-zh-CN.properties文件中提供// 普通bean @Component public class User { //@NotNull @NotEmpty(message="{useraccount.not.empty}")//如果是String类型的要用NotEmpty,如果是integer和double用NotNull @Email(message="{useraccount.email}") private String useraccount; @Size(min=6,max=20,message="{password.length}") private String password; @NotNull @Min(0) @Max(150) private int age; public String getUseraccount() { return useraccount; } public void setUseraccount(String useraccount) { this.useraccount = useraccount; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
控制器1
用于初始化Model, 使regist.jsp能够进行数据的绑定package com.ys.action; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import com.ys.domain.User; @Controller public class Initial { @RequestMapping("/init.do") public String initUser(Model model){ model.addAttribute("user",new User());// "user"对应于request范围的一个实体 return "regist"; } }
控制器1的另一种写法
@Controller public class Initial { @ModelAttribute("user") // 暴露一个model给页面, 这样就不需要在initUser()方法中new User()了. //当访问init.do时,SpringMVC 首先调用getUser()创建model,然后才调用 initUser() public User getUser(){ return new User(); } @RequestMapping("/init.do") public String initUser(Model model){ //model.addAttribute("user",new User());// "user"对应于request范围的一个实体 return "regist"; } }
控制器2
用于regist.jsp 的form表单提交后进行校验和转发@Controller //@RequestMapping("/user") //这里配置的是请求的基路径, 比如你想让请求的url写成/user/regist.do public class GoToNext {// 类名没有什么用 @RequestMapping(value="/regist.do",method=RequestMethod.POST)//请求的子路径, method属性加上的原因是form表单的提交方式是post,而springMVC默认是get public ModelAndView regist(@Valid @ModelAttribute("user") User user, BindingResult result) { //参数user对应表单中的modelAttribute, 表单数据绑定完成后, @Valid能够自动进入User类进行校验 // 执行校验 if (result.hasErrors()) { //返回到原来的页面 return new ModelAndView("regist"); } else { //... return new ModelAndView("success"); } } }
web.xml中的配置
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>SpringValidator2</display-name> <welcome-file-list> <welcome-file>/WEB-INF/pages/index.jsp</welcome-file> </welcome-file-list> <filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class> org.springframework.web.filter.CharacterEncodingFilter </filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- <listener> 这里并没有使用Spring,而是使用的SpringMVC, 因此这个可以不使用 <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> --> <servlet > <servlet-name>springMVC</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>springMVC</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> </web-app>因为没有使用默认生成的applicationContext.xml,我们使用自己定义的, 也是上面springMVC servlet能够起作用所必须的springMVC-servlet.xml,并把它放在WEB-INF目录下,不是ClassPath下.
springMVC-servlet.xml
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd"> <mvc:annotation-driven /> <!-- validator 依赖的jar包是 org.springframework.context. 这个bean会在mvc:annotation-driven下自动生成--> <!-- <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"> <property name="providerClass" value="org.hibernate.validator.HibernateValidator"></property> <property name="validationMessageSource" ref="messageResource"></property> </bean> <bean id="messageResource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> <property name="basename" value="classpath:message"></property> </bean> --> <context:component-scan base-package="com.ys"/> <bean id="baseResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" > <property name="prefix" value="/WEB-INF/pages/"/> <!-- 注意pages后面有个/ --> <property name="suffix" value=".jsp"/> </bean> </beans>
访问页面
regist.jsp<body> <!-- modelAttribute指明表单数据会被绑定到user的属性中(“user”对象必须首先存在, 这里将由/init.do来完成), 当不使用modelAttribute的时候默认是commanClass, 应该提供一个setCommandClass(XXXX.class)来将数据绑定到XXXX的一个实体上 --> <form:form id="form" action="regist.do" method="post" modelAttribute="user"> 添加用户 <form:label path="useraccount">账号:</form:label> <form:input path="useraccount" /> <form:errors path="useraccount" /> <br/> <form:label path="password">密码:</form:label> <form:password path="password" id="pwd" /> <form:errors path="password" cssStyle="color:red"/> <br/> <form:label path="age">年龄:</form:label> <form:input path="age" /> <form:errors path="age" /> <br/> <button type="submit">添加</button> <button type="reset">重置</button> </form:form> </body>
index.jsp
这里使用一个链接来访问init.do(为了不手动输入url : locahost:8080/SpringValidator2/init.do, 而是输入localhost:8080/SpringValidator2/就行了),并由init.do初始化一个model, 然后跳转到regist.jsp
<body> <a href="init.do"> 去注册</a> </body>
success.jsp
注册成功的提示页面
<body> <p style="color:red">welcome,注册成功</p> </body>
部署运行如下:
填写信息有误,结果是:
这是使用hibernate validator自动生成的国际化信息
这是使用自定义的国际化信息, 让hibernate validator加载我们自己写的ValidationMessages.properties,故意命名成和默认相同的文件名
注意这些提示信息是hibernate validator根据Local自动生成的, 并被springMVC调用. 如果需要定义自己的国际化提示信息, properties文件定义如下
ValidationMessages-zh-CN.properties, 这是hibernate validator默认的文件名,我尝试在配置文件中使用自己定义的文件名总是访问不到,暂且就这样了.
如果填写信息正确,结果如下:
如果有问题,欢迎留言.
相关文章推荐
- 基于注解后端数据校验-SpringMVC 、Spring和 Hibernate Validator结合
- springmvc中后端校验@Valid注解
- SpringMVC和FreeMarker整合中使用注解方式的后台数据校验
- 自己写的基于java Annotation(注解)的数据校验框架
- 自己写的基于java Annotation(注解)的数据校验框架
- struts2对数据校验---基于xml配置文件
- spring 启动后执行自我操作(如加入数据进入缓存) 基于注解
- springMVC3 基于注解的输入验证
- 基于注解的SpringMVC整合JPA
- SpringMVC基于注解教程(一)
- SpringMVC 基于注解的Controller @RequestMapping @RequestParam
- 基于注解的springmvc配置例子
- SpringMVC 基于注解的Controller @RequestMapping @RequestParam..
- 基于注解的SpringMVC简单介绍
- 基于注解的 SpringMVC 简单介绍
- SpringMVC 基于注解的Controller @RequestMapping @RequestParam..
- 【SpringMVC】基于注解的SpringMVC简单示例
- 基于注解的SpringMVC简单介绍
- springMVC最佳实践-基于注解的Controller
- springMVC 与jsr 303 结合后端验证问题