框架中的数据校验和表单错误消息提示
1.搭建练习环境
(1)引入jar包,配置web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <!-- 配置字符编码过滤器 --> <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> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>characterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- 处理PUT和DELETE等的请求 --> <filter> <filter-name>hiddenHttpMethodFilter</filter-name> <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> </filter> <filter-mapping> <filter-name>hiddenHttpMethodFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- 核心控制器:作用,分发请求 --> <servlet> <servlet-name>springDispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:/springmvc-context.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springDispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
(2)配置springmvc-context.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!-- 配置要扫描的包 --> <context:component-scan base-package="com.bestgo.springmvc"/> <!-- 视图解析器,默认为转发 --> <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/"/> <property name="suffix" value=".jsp"/> </bean> <!-- 国际化 --> <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> <property name="basename" value="i18n"/> </bean> <!-- 处理静态资源 --> <mvc:default-servlet-handler default-servlet-name="default"/> <mvc:annotation-driven/> </beans>
(3)新建Employee.java
package com.bestgo.springmvc.bean; import com.bestgo.springmvc.bean.Department; import org.springframework.format.annotation.DateTimeFormat; import org.springframework.format.annotation.NumberFormat; import java.util.Date; public class Employee { private Integer id; private String lastName; private String email; //1 male, 0 female private Integer gender; private Department department; @DateTimeFormat(pattern = "yyyy-MM-dd") private Date birthday; @NumberFormat(pattern = "###,###.###") private double salary; public Employee() { } public Employee(Integer id, String lastName, String email, Integer gender, Department department, Date birthday, double salary) { this.id = id; this.lastName = lastName; this.email = email; this.gender = gender; this.department = department; this.birthday = birthday; this.salary = salary; } public double getSalary() { return salary; } public void setSalary(double salary) { this.salary = salary; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public Integer getGender() { return gender; } public void setGender(Integer gender) { this.gender = gender; } public Department getDepartment() { return department; } public void setDepartment(Department department) { this.department = department; } public Employee(Integer id, String lastName, String email, Integer gender, Department department) { super(); this.id = id; this.lastName = lastName; this.email = email; this.gender = gender; this.department = department; } @Override public String toString() { return "Employee{" + "id=" + id + ", lastName='" + lastName + '\'' + ", email='" + email + '\'' + ", gender=" + gender + ", department=" + department + ", birthday=" + birthday + ", salary=" + salary + '}'; } }
(4)新建Department.java
package com.bestgo.springmvc.bean; public class Department { private Integer id; private String departmentName; public Department() { } public Department(int i, String string) { this.id = i; this.departmentName = string; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getDepartmentName() { return departmentName; } public void setDepartmentName(String departmentName) { this.departmentName = departmentName; } @Override public String toString() { return "Department [id=" + id + ", departmentName=" + departmentName + "]"; } }(5)新建EmployeeDao.java
package com.bestgo.springmvc.dao; import java.util.Collection; import java.util.HashMap; import java.util.Map; import com.bestgo.springmvc.bean.Department; import com.bestgo.springmvc.bean.Employee; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; @Repository public class EmployeeDao { private static Map<Integer, Employee> employees = null; @Autowired private DepartmentDao departmentDao; static{ employees = new HashMap<Integer, Employee>(); //只是为了测试,这里充当从数据库查询的数据 employees.put(1001, new Employee(1001, "E-AA", "[email protected]", 1, new Department(101, "D-AA"))); employees.put(1002, new Employee(1002, "E-BB", "[email protected]", 1, new Department(102, "D-BB"))); employees.put(1003, new Employee(1003, "E-CC", "[email protected]", 0, new Department(103, "D-CC"))); employees.put(1004, new Employee(1004, "E-DD", "[email protected]", 0, new Department(104, "D-DD"))); employees.put(1005, new Employee(1005, "E-EE", "[email protected]", 1, new Department(105, "D-EE"))); } private static Integer initId = 1006; public void saveOrUpdate(Employee employee){ if(employee.getId() == null){ employee.setId(initId++); } employee.setDepartment(departmentDao.getDepartment(employee.getDepartment().getId())); employees.put(employee.getId(), employee); } public Collection<Employee> getAll(){ return employees.values(); } public Employee get(Integer id){ return employees.get(id); } public void delete(Integer id){ employees.remove(id); } }
(6)新建DepartmentDao.java
package com.bestgo.springmvc.dao; import com.bestgo.springmvc.bean.Department; import org.springframework.stereotype.Repository; import java.util.Collection; import java.util.HashMap; import java.util.Map; @Repository public class DepartmentDao { private static Map<Integer, Department> departments = null; static{ departments = new HashMap<Integer, Department>(); //只是为了测试,这里充当从数据库查询的数据 departments.put(101, new Department(101, "D-AA")); departments.put(102, new Department(102, "D-BB")); departments.put(103, new Department(103, "D-CC")); departments.put(104, new Department(104, "D-DD")); departments.put(105, new Department(105, "D-EE")); } public Collection<Department> getDepartments(){ return departments.values(); } public Department getDepartment(Integer id){ return departments.get(id); } }
(7)新建EmployeeHandler.java
package com.bestgo.springmvc.handler; import com.bestgo.springmvc.bean.Department; import com.bestgo.springmvc.bean.Employee; import com.bestgo.springmvc.dao.DepartmentDao; import com.bestgo.springmvc.dao.EmployeeDao; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import java.util.Collection; import java.util.Map; @Controller @RequestMapping("/employee") public class EmployeeHandler { @Autowired private EmployeeDao employeeDao; @Autowired private DepartmentDao departmentDao; @RequestMapping(value = "/get_employee_list",method = RequestMethod.GET) public String getEmployeeList(Map map){ Collection<Employee> empList = employeeDao.getAll(); map.put("empList",empList); return "list"; } @RequestMapping("/to_add_emp") public String toAddEmp(Map map){ Collection<Department> departments = departmentDao.getDepartments(); map.put("deptList",departments); map.put("command",new Employee()); return "add"; } @RequestMapping("/do_add_emp") public String doAddEmp(Employee employee){ System.out.println("要添加的员工对象--》"+employee); employeeDao.saveOrUpdate(employee); return "redirect:get_employee_list"; } @RequestMapping(value = "/delete_emp/{id}",method = RequestMethod.DELETE) public String deleteEmp(@PathVariable("id") Integer id){ employeeDao.delete(id); return "redirect:/employee/get_employee_list"; } @RequestMapping(value = "/to_update_emp/{id}",method = RequestMethod.GET) public String toUpdateEmp(@PathVariable("id") Integer id,Map map){ Employee employee = employeeDao.get(id); map.put("employee",employee); Collection<Department> departments = departmentDao.getDepartments(); map.put("departments",departments); return "update"; } @RequestMapping(value = "/do_update_emp",method = RequestMethod.PUT) public String doUpdateEmp(Employee employee){ employeeDao.saveOrUpdate(employee); return "redirect:/employee/get_employee_list"; } @ModelAttribute public void getEmployee(@RequestParam(value = "id",required = false)Integer id,Map map){ if(id != null){ Employee employee = employeeDao.get(id); map.put("employee",employee); } } }
(8)新建web/index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>$Title$</title> </head> <body> <a href="${pageContext.request.contextPath}/employee/get_employee_list">getEmployeeList</a> </body> </html>
(9)新建web/WEB-INF/views/list.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> <!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=UTF-8"> <title>Insert title here</title> <script type="application/javascript" src="${pageContext.request.contextPath}/scripts/jquery-1.9.1.min.js"></script> <script type="application/javascript"> $(function(){ $(".deleteEmp").click(function(){ var href = this.href; $("#deleteEmpForm").attr("action",href).submit(); return false; }); }); </script> </head> <body> 员工列表:<a href="${pageContext.request.contextPath }/employee/to_add_emp">添加员工</a> <hr> <table width="80%" border="1"> <tr> <th>员工编号</th> <th>员工名称</th> <th>邮件地址</th> <th>性别</th> <th>部门名称</th> <th></th> <th></th> </tr> <form id="deleteEmpForm" action="" method="post"> <input type="hidden" name="_method" value="delete"> </form> <c:forEach items="${empList}" var="emp"> <tr> <td>${emp.id }</td> <td>${emp.lastName }</td> <td>${emp.email }</td> <td>${emp.gender==1?"男":"女" }</td> <td>${emp.department.departmentName }</td> <td><a href="${pageContext.request.contextPath}/employee/to_update_emp/${emp.id}">修改</a></td> <td><a class="deleteEmp" href="${pageContext.request.contextPath}/employee/delete_emp/${emp.id}">删除</a></td> </tr> </c:forEach> </table> </body> </html>
(10)新建web/WEB-INF/add.jsp
<%@ page import="java.util.Map" %> <%@ page import="java.util.HashMap" %> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> <!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=UTF-8"> <title>Insert title here</title> </head> <body> <% Map map = new HashMap(); map.put("1","男"); map.put("0","女"); request.setAttribute("genders",map); %> <form:form action="${pageContext.request.contextPath}/employee/do_add_emp"> 员工名称:<form:input path="lastName"/><br> 邮件地址:<form:input path="email"/><br> 性别:<form:radiobuttons path="gender" items="${genders}"/><br> 部门:<form:select path="department.id" items="${deptList}" itemLabel="departmentName" itemValue="id"/><br> 生日:<form:input path="birthday"/><br> 工资:<form:input path="salary"/><br> <input type="submit" value="添加"> </form:form> </body> </html>
2.点击运行,开始。。然后进入员工列表页面。
3.点击【添加员工】,进入添加员工页面,并输入信息
4.点击【添加】,成功后,跳入到列表页面
5.但是如果输入错误,会报400的错误,页面会显得不是很友好,也没有回到添加页面,这时就需要数据校验、回显和错误消息提示
7.首先修改EmployeeHandler.java
@RequestMapping("/to_add_emp") public String toAddEmp(Map map){ Collection<Department> departments = departmentDao.getDepartments(); map.put("deptList",departments); map.put("employee",new Employee()); return "add"; } @RequestMapping("/do_add_emp") public String doAddEmp(Employee employee, BindingResult bindingResult, Map map){ if(bindingResult.getErrorCount() > 0){ System.out.println("类型转换错误!"); List<FieldError> fieldErrors = bindingResult.getFieldErrors(); for(FieldError fieldError : fieldErrors){ System.out.println(fieldError.getField() + "-" + fieldError.getDefaultMessage()); } Collection<Department> departments = departmentDao.getDepartments(); map.put("deptList",departments); return "add"; } employeeDao.saveOrUpdate(employee); return "redirect:get_employee_list"; }
8.然后修改add.jsp的form表单
<form:form action="${pageContext.request.contextPath}/employee/do_add_emp" modelAttribute="employee"> 员工名称:<form:input path="lastName"/><br> 邮件地址:<form:input path="email"/><br> 性别:<form:radiobuttons path="gender" items="${genders}"/><br> 部门:<form:select path="department.id" items="${deptList}" itemLabel="departmentName" itemValue="id"/><br> 生日:<form:input path="birthday"/><br> 工资:<form:input path="salary"/><br> <input type="submit" value="添加"> </form:form>
9.此时再次验证,后台报错,可以回显了。但是注册用户不知道发生了什么。。。这时就需要显示错误提示
10.在Employee.java里面添加注解@NotEmpty,不为空;@Email,验证是否为邮箱格式;@Past,必须是一个过去的时间
11.在EmployeeHandler.java里面要校验的类上,加上@Vaild注解
12.测试,会有如下显示