Spring MVC資料繫結概述及原理詳解
資料繫結概述
在執行程式時,Spring MVC根據客戶端請求引數的不同,將請求訊息中的資訊以一定的方式轉換並繫結到控制器類的方法引數中。
這種將請求訊息資料與後臺方法引數建立連線的過程就是 Spring MVC中的資料繫結。
在資料繫結過程中,Spring MVC框架會通過資料繫結元件(DataBinder)將請求引數串的內容進行型別轉換,然後將轉換後的值賦給控制器類中方法的形參,這樣後臺方法就可以正確繫結並獲取客戶端請求攜帶的引數。具體的資訊處理過程的步驟如下。
(1)Spring MVC將ServletRequest物件傳遞給 DataBinder。
(2)將處理方法的入參物件傳遞給 DataBinder。
(3) DataBinder呼叫ConversionService元件進行資料型別轉換、資料格式化等工作,並將 ServletRequest物件中的訊息填充到引數物件中。
(4)呼叫Validator元件對已經綁定了請求訊息資料的引數物件進行資料合法性校驗。
(5)校驗完成後會生成資料繫結結果 BindingResult物件,Spring MVC會將BindingResult物件中的內容賦給處理方法的相應引數。
根據客戶端請求引數型別和個數的不同,將 Spring Mvc中的資料繫結主要分為簡單資料繫結和複雜資料繫結
1.簡單資料繫結
繫結預設資料型別
UserController.java:
package com.ssm.controller; import javax.servlet.http.HttpServletRequest; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class UserController { @RequestMapping(value="/selectUser") public String selectUser(HttpServletRequest request) { String id=request.getParameter("id"); System.out.println("id="+id); return "success"; } }
使用註解方式定義了一個控制器類,同時定義了方法的訪問路徑。在方法引數中使用了HttpServletRequest型別,並通過該物件的 getParameter()方法獲取了指定的引數。為了方便檢視結果,將獲取的引數進行輸出列印,最後返回一個名為“success”的檢視,Spring MVC會通過檢視解析器在“WEB-INF/jsp”路徑下尋找“success.jsp”檔案。
繫結簡單資料型別
簡單資料型別的繫結,就是指Java中幾種基本資料型別的繫結,如int、String、Double等型別。
@RequestMapping(value="/selectUser")
public String selectUser(Integer id) {
System.out.println("id="+id);
return "success";
}
與預設資料型別案例中的 selectUser()方法相比,此方法中只是將 HttpServletrEquest引數型別替換為了 Integer型別。
@RequestParam註解主要用於對請求中的引數進行定義,在使用時可以指定它的4個屬性,具體如表12.1所示。
繫結POJO型別
在使用簡單資料型別繫結時,可以很容易地根據具體需求來定義方法中的形參型別和個數,然而在實際應用中,客戶端請求可能會傳遞多個不同型別的引數資料,如果還使用簡單資料型別進行繫結,那麼就需要手動編寫多個不同型別的引數,這種操作顯然比較煩瑣。此時就可以使用POJO型別進行資料繫結。
POJO型別的資料繫結就是將所有關聯的請求引數封裝在一個POJO中,然後在方法中直接使用該POJO作為形參來完成資料繫結。
@RequestMapping("/toRegister") public String toRegister() { return "register"; } @RequestMapping("/registerUser") public String registerUser(User user) { String username=user.getUserName(); String password=user.getPassword(); System.out.println("username="+username); System.out.println("password="+password); return "success"; }
繫結包裝POJO
使用簡單POJO型別已經可以完成多數的資料繫結,但有時客戶端請求中傳遞的引數會比較複雜。例如,在老師查詢學生時,頁面傳遞的引數可能包括班級名稱和學生號等資訊,這就包含了班級和學生兩個物件的資訊。如果將班級和學生的所有查詢條件都封裝在一個簡單POJO中,顯然會比較混亂,這時就可以考慮使用包裝POJO型別的資料繫結。
所謂的包裝POJO,就是在一個POJO中包含另一個簡單POJO。例如,在學生物件中包含班級物件。這樣在使用時,就可以通過學生查詢到班級資訊。
StudentController. java:
package com.ssm.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import com.ssm.po.Banji; import com.ssm.po.Student; @Controller public class StudentController { //向學生查詢頁面跳轉 @RequestMapping("/tofindStudentWithBanji") public String tofindStudentWithBanji(){ return "student"; } //查詢學生和班級資訊 @RequestMapping("/findStudentWithBanji") public String findStudentWithBanji(Student student){ Integer stu_id=student.getStu_id(); Banji banji=student.getBanji(); String banji_name=banji.getBanji_name(); System.out.println("stu_id="+stu_id); System.out.println("banji_name="+banji_name); return "success"; } }
複雜資料繫結
複雜的資料繫結問題,比如陣列的繫結、集合的繫結
繫結陣列
CourseController.java:
package com.ssm.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class CourseController { @RequestMapping("/toCourse") public String toCourse(){ return "course"; } @RequestMapping("/deleteCourse") public String deleteCourse(Integer[] ids){ if(ids!=null){ //使用輸出語句模擬已經刪除的課程 for(Integer id:ids){ System.out.println("刪除了id為"+id+"的課程"); } }else{ System.out.println("ids=null"); } return "success"; } }
繫結集合
在專案中,前端請求傳遞過來的資料可能就會批量包含各種型別的資料,如 Integer、String等。這種情況使用陣列繫結是無法實現的。針對這種情況,可以使用集合資料繫結,即在包裝類中定義一個包含物件類的集合,然後在接收方法中將引數型別定義為該包裝類的集合。
UserController.java:
//向用戶批量修改頁面跳轉 @RequestMapping("/toUserEdit") public String toUserEdit() { return "user_edit"; } //接收批量修改使用者的方法 @RequestMapping("/editUsers") public String editUsers(UserVo userList){ //將所有使用者資料封裝到集合中 List<User> users=userList.getUsers(); for(User user:users){ if(user.getId()!=null){ System.out.println("刪除了id為"+user.getId()+"的使用者名稱為"+ user.getUsername()); } } return "success"; }
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。