数据绑定流程分析(校验)

Posted 曹军

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据绑定流程分析(校验)相关的知识,希望对你有一定的参考价值。

一:校验

1.校验的步骤

  使用JSP 303验证标准

  加入Hibernate validator的jar

  在springmvc配置文件中加入<mvc:annotation-driven/>

  需要在bean的属性上添加@Valid注解

 

2.添加lib  

  hibernate的lib

  然后需要添加hibernate需要的required中的lib包

 

3.添加验证的注解

  1 package com.spring.it.enties;
  2 
  3 import java.util.Date;
  4 
  5 import javax.validation.constraints.Past;
  6 
  7 import org.hibernate.validator.constraints.Email;
  8 import org.hibernate.validator.constraints.NotEmpty;
  9 import org.springframework.format.annotation.DateTimeFormat;
 10 import org.springframework.format.annotation.NumberFormat;
 11 
 12 public class Employee {
 13     
 14     private Integer id;
 15     @NotEmpty
 16     private String lastName;
 17     @Email
 18     private String email;
 19     //1 male, 0 female
 20     private Integer gender;
 21     private Department department;
 22     //birth
 23     @Past
 24     @DateTimeFormat(pattern="yyyy-MM-dd")
 25     private Date birth;
 26     //salary
 27     @NumberFormat(pattern="###.#")
 28     private Float salary;
 29     
 30     public Employee(Integer id, String lastName, String email, Integer gender,
 31             Department department) {
 32         this.id = id;
 33         this.lastName = lastName;
 34         this.email = email;
 35         this.gender = gender;
 36         this.department = department;
 37     }
 38 
 39     public Employee() {
 40         
 41     }
 42     public Integer getId() {
 43         return id;
 44     }
 45 
 46     public void setId(Integer id) {
 47         this.id = id;
 48     }
 49 
 50     public String getLastName() {
 51         return lastName;
 52     }
 53 
 54     public void setLastName(String lastName) {
 55         this.lastName =lastName;
 56     }
 57 
 58     public String getEmail() {
 59         return email;
 60     }
 61 
 62     public void setEmail(String email) {
 63         this.email = email;
 64     }
 65 
 66     public Integer getGender() {
 67         return gender;
 68     }
 69 
 70     public void setGender(Integer gender) {
 71         this.gender = gender;
 72     }
 73 
 74     public Department getDepartment() {
 75         return department;
 76     }
 77 
 78     public void setDepartment(Department department) {
 79         this.department = department;
 80     }
 81 
 82     public Date getBirth() {
 83         return birth;
 84     }
 85 
 86     public void setBirth(Date birth) {
 87         this.birth = birth;
 88     }
 89 //
 90 
 91     public Float getSalary() {
 92         return salary;
 93     }
 94 
 95     public void setSalary(Float salary) {
 96         this.salary = salary;
 97     }
 98 
 99     @Override
100     public String toString() {
101         return "Employee [id=" + id + ", lastName=" + lastName + ", email=" + email + ", gender=" + gender
102                 + ", department=" + department + ", birth=" + birth + ", salary=" + salary + "]";
103     }
104         
105 }

 

4.保存上添加@Valid注解

 1 /**
 2      * 保存,是submit提交过来的请求,属于Post请求
 3      */
 4     @RequestMapping(value="/emp",method=RequestMethod.POST)
 5     public String save(@Valid Employee employee,BindingResult result) {
 6         System.out.println(employee);
 7         if(result.getErrorCount()>0) {
 8             System.out.println("has error");
 9             for(FieldError error:result.getFieldErrors()) {
10                 System.out.println(error.getField()+":"+error.getDefaultMessage());
11             }
12         }
13         employeeDao.save(employee);
14         return "redirect:/emps";
15     }

 

二:出错跳转页面

1.程序

  这个主要的逻辑是save之后的处理。

  要将department回显,所以save函数中要添加map。

 1 /**
 2      * 保存,是submit提交过来的请求,属于Post请求
 3      */
 4     @RequestMapping(value="/emp",method=RequestMethod.POST)
 5     public String save(@Valid Employee employee,BindingResult result,Map<String,Object> map) {
 6         System.out.println(employee);
 7         if(result.getErrorCount()>0) {
 8             System.out.println("has error");
 9             for(FieldError error:result.getFieldErrors()) {
10                 System.out.println(error.getField()+":"+error.getDefaultMessage());
11             }
12             //如果出错,则转向定制的页面
13             map.put("department", departmentDao.getDepartments());
14             return "input";
15         }
16         employeeDao.save(employee);
17         return "redirect:/emps";
18     }

 

2.效果

  就是提交之后,还是这个页面

  

 

三:在页面上显示这个错误信息

1.input程序

  在每一个要验证的字段后面写上:<form:errors path="birth"></form:errors><br>

 1 <%@ page language="java" contentType="text/html; charset=utf-8"
 2     pageEncoding="utf-8"%>
 3 <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
 4 <%@ page import="java.util.Map"%>
 5 <%@ page import="java.util.HashMap"%>
 6 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
 7 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 8 <html>
 9 <head>
10 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
11 <title>Insert title here</title>
12 </head>
13 <body>
14     <form action="testConversionServiceConver" method="POST">
15         
16         <!-- lastname-email-gender-department.id -->
17         <!-- GG-gg@123.com-0-105 -->
18         Employee:<input type="text" name="employee"/>
19         <input type="submit" values="Submit">
20     </form>
21     <br><br>
22     <br><br><br><br><br><br>
23 
24 
25     <!-- id lastName email  gender department -->
26     <!-- modelAttribute默认的bean是command,需要改成对应的bean -->
27     <form:form action="${pageContext.request.contextPath}/emp" method="POST" modelAttribute="employee">
28         <!-- lastName在修改的时候,不能被显示 -->
29         <c:if test="${employee.id == null}">
30             LastName:<form:input path="lastName"/>
31             <form:errors path="lastName"></form:errors><br>
32         </c:if>
33         <c:if test="${employee.id != null}">
34             <form:hidden path="id"/>
35             <!-- 不能使用form标签,因为modelAttribute对应的bean中没有_method这个属性,只能使用input -->
36             <input type="hidden" name="_method" value="PUT"/>
37         </c:if>
38 
39         Email:<form:input path="email"/>
40         <form:errors path="email"></form:errors><br>
41         <%
42             Map<String,String> genders=new HashMap();
43             genders.put("1", "Male");
44             genders.put("0", "Female");
45             request.setAttribute("genders", genders);
46         %>
47         Gender:<form:radiobuttons path="gender" items="${genders}"/><br>
48         Department:<form:select path="department.id" 
49                         items="${department}" itemLabel="departmentName" itemValue="id"></form:select><br>
50                         
51         <!-- 演示格式化 -->
52         Birth:<form:input path="birth"/>
53         <form:errors path="birth"></form:errors><br>
54         Salary:<form:input path="salary"/><br>
55         <input type="submit" values="Submit">
56     </form:form>
57 </body>
58 </html>

 

2.效果

  

 

四:国际化资源文件

1.添加I18n.properties

  注意写法:

  

1 NotEmpty.employee.lastName=\\u4E0D\\u80FD\\u4E3A\\u7A7A
2 Email.employee.email=\\u4E0D\\u662F\\u5408\\u6CD5\\u7684\\u90AE\\u4EF6
3 Past.employee.birth=\\u4E0D\\u80FD\\u662F\\u672A\\u6765\\u7684\\u4E00\\u4E2A\\u65F6\\u95F4

 

2.springmvc.xml中配置国际化

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xmlns:context="http://www.springframework.org/schema/context"
 5     xmlns:mvc="http://www.springframework.org/schema/mvc"
 6     xsi:schemaLocation="http://www.springframework.org/schema/beans 
 7     http://www.springframework.org/schema/beans/spring-beans.xsd
 8         http://www.springframework.org/schema/context 
 9         http://www.springframework.org/schema/context/spring-context-4.0.xsd
10         http://www.springframework.org/schema/mvc 
11         http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
12     <!-- 配置自定义扫描的包 -->               
13     <context:component-scan base-package="com.spring.it" ></context:component-scan>
14     
15     <!-- 配置视图解析器 -->
16     <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
17         <property name="prefix" value="/WEB-INF/views/" />
18           <property name="suffix" value=".jsp" />
19     </bean>    
20     
21     <mvc:annotation-driven></mvc:annotation-driven>
22     
23     <!-- 转换器 -->
24     <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
25         <property name="converters">
26             <set>
27                 <ref bean="employeeConverter"/>
28             </set>
29         </property>
30     </bean>
31     <mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>
32     
33     <mvc:default-servlet-handler/>
34     <mvc:annotation-driven ignore-default-model-on-redirect="true"></mvc:annotation-driven>
35     
36     <!-- 国家化 -->
37     <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
38         <property name="basename" value="i18n"></property>
39     </bean>
40 </beans>

 

3.效果

  

 

以上是关于数据绑定流程分析(校验)的主要内容,如果未能解决你的问题,请参考以下文章

Android 逆向整体加固脱壳 ( DEX 优化流程分析 | DexPrepare.cpp 中 dvmOptimizeDexFile() 方法分析 | /bin/dexopt 源码分析 )(代码片段

数据绑定流程分析

数据绑定流程分析

SpringMVC框架整理

Android 逆向ART 脱壳 ( DexClassLoader 脱壳 | DexClassLoader 构造函数 | 参考 Dalvik 的 DexClassLoader 类加载流程 )(代码片段

Android 逆向ART 脱壳 ( DexClassLoader 脱壳 | DexClassLoader 构造函数 | 参考 Dalvik 的 DexClassLoader 类加载流程 )(代码片段