spring mvc使用hibernate validator框架可以實現的功能:
1. 注解java bean聲明校驗規則。
2. 添加message錯誤信息源實現國際化配置。
3. 結合spring form中的errors標簽展現錯誤信息。
優勢:
代碼簡潔。
實現:
1. 使用hibernate validator 至少要引入兩個jar包:
hibernate-validator-5.3.4.Final.jar , validation-api-1.1.0.Final.jar
2. JSR規范定義的注解在validation-api下javax.validation.constraints包下,請自行查看。
3. java bean中使用注解添加檢驗規則
1 public class UserInfo { 2 3 @Size(min = 8,max = 20,message="{username.size}") 4 @Pattern(regexp="[_a-zA-Z0-9]+",message="{username.pattern}") 5 private String username; 6 7 public String getUsername() { 8 return username; 9 } 10 public void setUsername(String username) { 11 this.username = username; 12 } 13 }
Controller的配置
1 @Controller
3 public class UserController { 5 @GetMapping(value = "/register") 6 public String showRegister(Model model){ 7 model.addAttribute("user",new UserInfo()); 8 return "register"; 9 } 10 11 @PostMapping(value = "/register") 12 public String register(@ModelAttribute("user") @Valid UserInfo user, Errors errors) { 13 if (errors.hasErrors()) { 14 return "register"; 15 } 16 return "redirect:/index"; 17 } 25 }
對應的register.jsp文件:
1 <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> 3 <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> 4 <%@taglib uri="http://www.springframework.org/tags/form" prefix="sf"%> 5 <html> 6 <head> 10 <title></title> 26 </head> 27 <body> 84 <sf:form method="POST" commandName="user"> 85 <sf:input path="username"/> 86 <sf:errors path="username"/><br> 88 <sf:password path="password"/> 89 <sf:errors path="password"/><br> 91 <sf:password path="re_password"/> 92 <sf:errors path="re_password" /><br> 94 <sf:input path="email" type="email"/> 95 <sf:errors path="email" /><br> 97 <sf:input path="phone"/> 98 <sf:errors path="phone" /><br> 100 <input type="submit" value="注冊"> 101 </sf:form> 106 </body> 107 </html>
其中需要注意的地方:
- form標簽如果不聲明action屬性,則默認提交到當前請求路徑。
- @Valid注解指定校驗的對象,@ModelAttribute("user")注解聲明模型對象,value需要與commandName屬性的值一致,不然出錯的話<sf:errors>標簽找不到對應的對象;
如果不聲明模型對象名稱,那么默認是userInfo(即類名第一個首字母小寫).
- Errors對象存儲錯誤信息,需要緊跟在@Valid注解的對象之后。
- get方式訪問/register,顯示rigister.jsp,並提供一個對象給jsp, 屬性的key與表單中的commandName屬性的值對應,jsp將表單數據存入對象中。
post提交表單,如果有錯誤信息,返回rigister.jsp,spring的輸入標簽會填入之前輸入的對象數據,即user.username的值,並且<sf:errors>標簽會從Errors對象中獲取user.username錯誤信息(即message指定的信息),將<sf:errors>標簽渲染為<span>標簽(有興趣的話可以研究一下標簽庫的源碼)。
4.spring-dispatcher-servlet.xml配置hibernate validator,並且配置國際化資源
1 <mvc:annotation-driven validator="validator"/> 6 <mvc:default-servlet-handler /> 7 13 <bean id="requestHandler" class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"> 14 <property name="useSuffixPatternMatch" value="false"/><!--關閉自動使用 .* 后綴--> 15 </bean> 16 <bean id="requestAdapter" class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> 20 <property name="synchronizeOnSession" value="true"/> 21 </bean> 2 48 <bean id="hibernate_validator_messages" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> 49 <property name="basenames"> 50 <list> 51 <value>/WEB-INF/hibernate_validator_messages/hibernate_validator_message_zh_CN</value> 52 </list> 53 </property> 54 <property name="fileEncodings"> 55 <props> 56 <prop key="/WEB-INF/hibernate_validator_messages/hibernate_validator_message_zh_CN">UTF-8</prop> 57 </props> 58 </property> 59 </bean> 60 <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"> 61 <property name="providerClass" value="org.hibernate.validator.HibernateValidator" /> 62 <property name="validationMessageSource" ref="hibernate_validator_messages"/> 63 </bean>
配置中需要注意的地方:
-
LocalValidatorFactoryBean :validationMessageSource通過set方法注入,然后轉換為MessageInterpolator對象,如果不配置validationMessageSource
信息源,那么會使用默認的信息源HibernateValidations_xx_xx.properties,位於org.hibernate.validator包下,具體使用哪個文件由Locale.getDefaultLocale()決定。
- ReloadableResourceBundleMessageSource :spring中提供的信息源配置類,支持proerties和xml文件,更改配置無需重啟服務,basenames指定文件位置和名稱(可使用classpath前綴),fileEncodings指定各個文件的編碼方式,spring中首先查找.properties后綴文件,找不到再查找.xml后綴文件。
5.spring-dispatcher-servlet.xml完整配置如下:
1 <?xml version="1.0" encoding="UTF-8"?> 2 3 <beans xmlns="http://www.springframework.org/schema/beans" 4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5 xmlns:context="http://www.springframework.org/schema/context" 6 xmlns:mvc="http://www.springframework.org/schema/mvc" 7 xsi:schemaLocation=" 8 http://www.springframework.org/schema/beans 9 http://www.springframework.org/schema/beans/spring-beans-4.3.xsd 10 http://www.springframework.org/schema/context 11 http://www.springframework.org/schema/context/spring-context-4.3.xsd 12 http://www.springframework.org/schema/mvc 13 http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd 14 "> 22 <context:component-scan base-package="sps.controller"/> 36 <context:annotation-config/> 37 45 <mvc:annotation-driven validator="validator"/> 49 50 <mvc:default-servlet-handler /> 57 <bean id="requestHandler" class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"> 58 <property name="useSuffixPatternMatch" value="false"/><!--關閉自動使用 .* 后綴--> 59 </bean> 60 <bean id="requestAdapter" class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> 64 <property name="synchronizeOnSession" value="true"/> 65 </bean> 66 67 <!-- 68 配置DispatcherServlet的視圖解析器 69 --> 70 <bean id="internalresolver" 71 class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 72 <property name="prefix" value="/WEB-INF/views/"/> 73 <property name="suffix" value=".jsp"/> 74 <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> 75 <property name="exposeContextBeansAsAttributes" value="true"/> 76 </bean> 77 92 <bean id="hibernate_validator_messages" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> 93 <property name="basenames"> 94 <list> 95 <value>/WEB-INF/hibernate_validator_messages/hibernate_validator_message_zh_CN</value> 96 </list> 97 </property> 98 <property name="fileEncodings"> 99 <props> 100 <prop key="/WEB-INF/hibernate_validator_messages/hibernate_validator_message_zh_CN">UTF-8</prop> 101 </props> 102 </property> 103 </bean> 104 <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"> 105 <property name="providerClass" value="org.hibernate.validator.HibernateValidator" /> 106 <property name="validationMessageSource" ref="hibernate_validator_messages"/> 107 </bean> 108 109 </beans>
配置中需要注意的地方:
-
InternalResourceViewResolver 中的 viewClass 配置為JstlView,如果使用spring 標簽庫的話必須 聲明為 JstlView,不然spring標簽庫可能不起作用,甚至引起錯誤。
6.web.xml 中配置servlet就不羅嗦了。