1.實驗介紹
-----------------------------------------------------------------------------------------------------------------------------
1.1實驗環境
- Tomcat 7.0.72
- JDK 1.8
- IntelliJ IDEA 2017.2
- Firefox
1.2實驗知識點
- Spring MVC執行流程
- 注解
- 參數綁定
- 數據綁定
- Hibernate-Validator
-----------------------------------------------------------------------------------------------------------------------------
2.實驗介紹
2.1Spring MVC執行流程

1、DispatcherServlet
前端控制器,所有的請求都經過它統一分發,請求會被分給對應的Handler
2、HandlerMapping(處理器映射器)
解析請求鏈接,然后根據請求連接找到執行這個請求的類
3、HandlerAddapter(處理器適配器)
調用具體的方法對用戶發來的請求來進行處理
4、Controller
Controller 將處理用戶請求,Controller 處理完用戶請求,則返回 ModelAndView 對象給 DispatcherServlet 前端控制器。
從宏觀角度考慮,DispatcherServlet 是整個 Web 應用的控制器;從微觀考慮,Controller 是單個 Http 請求處理過程中的控制器。
5、ViewResolver(視圖解析器)
解析 ModelMdoelAndView 中的邏輯視圖名變為一個真正的 View 對象,並將 MdoelAndView 中的 Model 取出
2.2常用注解@Controller
在Spring MVC中,控制器Controoller負責處理有DispatcherServlet分發的請求,它把用戶請求的數據經過業務處理層處理之后封裝成Model,再把Model返回給對應的View進行展示
2.3常用注解@RequestMapping
@RequestMapping注解用來處理請求地址映射,指示Spring用哪個類或方法處理請求
常見屬性:
value:指定請求的實際地址,即value屬性將URL映射到方法上
@RequestMapping(value="/register")
@RequestMapping("/register")
method:指定請求的method類型,即該方法可以處理的HTTP請求方式,如GET,POST
@RequestMapping("/register",method=RequestMethod.POST)
consumes:指定處理請求的提交內容類型(Content-Type),如aoolication/json
@RequestMapping("/register",method=RequestMethod.POST,consumes="application/json")
produces:指定返回的內容類型,僅當request求情頭的(Accept)類型中包含指定類型才返回
@RequestMapping("/register",method=RequestMethod.POST,produces="application/json")
params:指定request中必須包含的參數值
@RequestMapping("/register",method=RequestMethod.POST,params="myParam=Value")
header:指定request中必須包含指定的header值
@RequestMapping("/register",method=RequestMethod.POST,headers="Referer=http://www.shiyanlou.com")
2.4常用校檢注解
這里給出 Hibernate-Validator 主要的校驗注解說明:

-----------------------------------------------------------------------------------------------------------------------------
3.實驗過程
3.1新建項目工程
在WEB-INF下創建lib文件夾,將jar包下載到lib文件夾內,單擊右鍵 Add as Libiary,這里 hibernate-validator最新版的包缺少關聯的jar包,會報錯


3.2配置web.xml文件

3.4SpringMVC-servlet.xml文件
在web/WEB-INF/目錄下新建Spring MVC配置文件

3.5創建實體類
在項目目錄src的包com.SpringMVC.Entity下新建類User.java,包含username,password,age和email屬性,在 User 類要校驗的屬性前添加必要的 Hibernate Validator 注解對前台提交的數據進行驗證,代碼如下:
1 package com.SpringMVC.Entity; 2 3 4 import org.hibernate.validator.constraints.Email; 5 import org.hibernate.validator.constraints.Length; 6 import org.hibernate.validator.constraints.NotBlank; 7 import org.hibernate.validator.constraints.Range; 8 9 public class User { 10 @NotBlank(message = "Username can not be empty") 11 private String username; 12 @Length(min = 6, max = 16, message = "The length of the password must be between 6 and 16 bits") 13 private String password; 14 @Range(min = 18, max = 60, message = "Age must be between 18 and 60 years old") 15 private Integer age; 16 @Email(message = "Please enter a valid email address") 17 private String email; 18 19 20 21 public User(){} 22 public User(String username, String password, int age, String email) { 23 this.username = username; 24 this.password = password; 25 this.age = age; 26 this.email = email; 27 } 28 29 public String getUsername() { 30 return username; 31 } 32 33 public void setUsername(String username) { 34 this.username = username; 35 } 36 37 public String getPassword() { 38 return password; 39 } 40 41 public void setPassword(String password) { 42 this.password = password; 43 } 44 45 public int getAge() { 46 return age; 47 } 48 49 public void setAge(int age) { 50 this.age = age; 51 } 52 53 public String getEmail() { 54 return email; 55 } 56 57 public void setEmail(String email) { 58 this.email = email; 59 } 60 }
3.6Controller類的實現
在項目目錄src的包com.SpringMVC.Controller下新建類UserController.java,代碼如下:
package com.SpringMVC.Controller; import com.SpringMVC.Entity.User; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.Errors; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import javax.validation.Valid; @Controller public class UserController { // 進入注冊頁面 @RequestMapping(value = "/register_form") public String register_form(Model model) { model.addAttribute("user", new User()); return "register"; } // 注冊請求的響應方法 @RequestMapping(value = "/register") public String register(@Valid @ModelAttribute("user") User user, Errors errors, Model model) { if(errors.hasErrors()){ return "/register"; }else { model.addAttribute("user", user); return "success"; } } }
其中 @Valid @ModelAttribute("user") User user 的 @Valid 意思是在把數據綁定到 @ModelAttribute("user") 后就進行驗證。后面跟着 Errors 對象保存校驗信息,如果 errors 中有錯誤信息,則返回 register 頁面,驗證成功則跳轉到 success 頁面
3.7JSP頁面
1、register.jsp
在WEB-INF文件夾下新建page文件夾,和SpringMVC指定的文件目錄相同,並在文件夾下創建register.jsp,添加 <form:errors> 標簽顯示屬性的錯誤信息
1 <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> 2 <%@ page contentType="text/html;charset=UTF-8" language="java" %> 3 <html> 4 <head> 5 <title>Register</title> 6 </head> 7 <body> 8 9 <div id="global"> 10 <form:form modelAttribute="user" method="post" action="register"> 11 <fieldset> 12 <legend>register</legend> 13 <p> 14 <label>name:</label> 15 <form:input path="username" /> 16 <form:errors path="username" cssStyle="color:red"/> 17 </p> 18 <p> 19 <label>password:</label> 20 <form:password path="password" /> 21 <form:errors path="password" cssStyle="color:red"/> 22 </p> 23 <p> 24 <label>age:</label> 25 <form:input path="age" /> 26 <form:errors path="age" cssStyle="color:red"/> 27 </p> 28 <p> 29 <label>email:</label> 30 <form:input path="email" /> 31 <form:errors path="email" cssStyle="color:red"/> 32 </p> 33 <p id="buttons"> 34 <input id="submit" type="submit" value="register"> <input 35 id="reset" type="reset" value="reset"> 36 </p> 37 </fieldset> 38 </form:form> 39 </div> 40 </body> 41 </html>
form 表單中的 modelAttribute="user" 綁定了一個 JavaBean 對象。
2、success.jsp
在WEB-INF/page文件夾下創建success.jsp
1 <%@ page contentType="text/html;charset=UTF-8" language="java" %> 2 <html> 3 <head> 4 <title>success</title> 5 </head> 6 <body> 7 <h5>Registration success, personal information:</h5> 8 name:${user.username}<br /> 9 password:${user.password}<br /> 10 age:${user.age}<br /> 11 email:${user.email}<br /> 12 13 </body> 14 </html>
4.實驗測試
-----------------------------------------------------------------------------------------------------------------------------


