Spring MVC數(shù)據(jù)綁定概述及原理詳解
數(shù)據(jù)綁定概述
在執(zhí)行程序時,Spring MVC根據(jù)客戶端請求參數(shù)的不同,將請求消息中的信息以一定的方式轉(zhuǎn)換并綁定到控制器類的方法參數(shù)中。
這種將請求消息數(shù)據(jù)與后臺方法參數(shù)建立連接的過程就是 Spring MVC中的數(shù)據(jù)綁定。
在數(shù)據(jù)綁定過程中,Spring MVC框架會通過數(shù)據(jù)綁定組件(DataBinder)將請求參數(shù)串的內(nèi)容進行類型轉(zhuǎn)換,然后將轉(zhuǎn)換后的值賦給控制器類中方法的形參,這樣后臺方法就可以正確綁定并獲取客戶端請求攜帶的參數(shù)。具體的信息處理過程的步驟如下。
(1)Spring MVC將ServletRequest對象傳遞給 DataBinder。
(2)將處理方法的入?yún)ο髠鬟f給 DataBinder。
(3) DataBinder調(diào)用ConversionService組件進行數(shù)據(jù)類型轉(zhuǎn)換、數(shù)據(jù)格式化等工作,并將 ServletRequest對象中的消息填充到參數(shù)對象中。
(4)調(diào)用Validator組件對已經(jīng)綁定了請求消息數(shù)據(jù)的參數(shù)對象進行數(shù)據(jù)合法性校驗。
(5)校驗完成后會生成數(shù)據(jù)綁定結果 BindingResult對象,Spring MVC會將BindingResult對象中的內(nèi)容賦給處理方法的相應參數(shù)。
根據(jù)客戶端請求參數(shù)類型和個數(shù)的不同,將 Spring Mvc中的數(shù)據(jù)綁定主要分為簡單數(shù)據(jù)綁定和復雜數(shù)據(jù)綁定
1.簡單數(shù)據(jù)綁定
綁定默認數(shù)據(jù)類型
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";
}
}
使用注解方式定義了一個控制器類,同時定義了方法的訪問路徑。在方法參數(shù)中使用了HttpServletRequest類型,并通過該對象的 getParameter()方法獲取了指定的參數(shù)。為了方便查看結果,將獲取的參數(shù)進行輸出打印,最后返回一個名為“success”的視圖,Spring MVC會通過視圖解析器在“WEB-INF/jsp”路徑下尋找“success.jsp”文件。
綁定簡單數(shù)據(jù)類型
簡單數(shù)據(jù)類型的綁定,就是指Java中幾種基本數(shù)據(jù)類型的綁定,如int、String、Double等類型。
@RequestMapping(value="/selectUser")
public String selectUser(Integer id) {
System.out.println("id="+id);
return "success";
}
與默認數(shù)據(jù)類型案例中的 selectUser()方法相比,此方法中只是將 HttpServletrEquest參數(shù)類型替換為了 Integer類型。
@RequestParam注解主要用于對請求中的參數(shù)進行定義,在使用時可以指定它的4個屬性,具體如表12.1所示。

綁定POJO類型
在使用簡單數(shù)據(jù)類型綁定時,可以很容易地根據(jù)具體需求來定義方法中的形參類型和個數(shù),然而在實際應用中,客戶端請求可能會傳遞多個不同類型的參數(shù)數(shù)據(jù),如果還使用簡單數(shù)據(jù)類型進行綁定,那么就需要手動編寫多個不同類型的參數(shù),這種操作顯然比較煩瑣。此時就可以使用POJO類型進行數(shù)據(jù)綁定。
POJO類型的數(shù)據(jù)綁定就是將所有關聯(lián)的請求參數(shù)封裝在一個POJO中,然后在方法中直接使用該POJO作為形參來完成數(shù)據(jù)綁定。
@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類型已經(jīng)可以完成多數(shù)的數(shù)據(jù)綁定,但有時客戶端請求中傳遞的參數(shù)會比較復雜。例如,在老師查詢學生時,頁面?zhèn)鬟f的參數(shù)可能包括班級名稱和學生號等信息,這就包含了班級和學生兩個對象的信息。如果將班級和學生的所有查詢條件都封裝在一個簡單POJO中,顯然會比較混亂,這時就可以考慮使用包裝POJO類型的數(shù)據(jù)綁定。
所謂的包裝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 {
//向?qū)W生查詢頁面跳轉(zhuǎn)
@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";
}
}
復雜數(shù)據(jù)綁定
復雜的數(shù)據(jù)綁定問題,比如數(shù)組的綁定、集合的綁定
綁定數(shù)組
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){
//使用輸出語句模擬已經(jīng)刪除的課程
for(Integer id:ids){
System.out.println("刪除了id為"+id+"的課程");
}
}else{
System.out.println("ids=null");
}
return "success";
}
}
綁定集合
在項目中,前端請求傳遞過來的數(shù)據(jù)可能就會批量包含各種類型的數(shù)據(jù),如 Integer、String等。這種情況使用數(shù)組綁定是無法實現(xiàn)的。針對這種情況,可以使用集合數(shù)據(jù)綁定,即在包裝類中定義一個包含對象類的集合,然后在接收方法中將參數(shù)類型定義為該包裝類的集合。
UserController.java:
//向用戶批量修改頁面跳轉(zhuǎn)
@RequestMapping("/toUserEdit")
public String toUserEdit() {
return "user_edit";
}
//接收批量修改用戶的方法
@RequestMapping("/editUsers")
public String editUsers(UserVo userList){
//將所有用戶數(shù)據(jù)封裝到集合中
List<User> users=userList.getUsers();
for(User user:users){
if(user.getId()!=null){
System.out.println("刪除了id為"+user.getId()+"的用戶名為"+
user.getUsername());
}
}
return "success";
}
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
SpringBoot實現(xiàn)application.yml文件敏感信息加密
本文主要介紹了SpringBoot實現(xiàn)application.yml文件敏感信息加密,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-07-07
Quartz+Spring Boot實現(xiàn)動態(tài)管理定時任務
最近做項目遇到動態(tài)管理定時任務的需求,剛拿到這個需求還真不知道從哪下手,經(jīng)過一番思考,終于找出實現(xiàn)思路,接下來通過本文給大家介紹了Quartz+Spring Boot實現(xiàn)動態(tài)管理定時任務的相關知識,需要的朋友可以參考下2018-09-09
IntelliJ Idea 2020.1 正式發(fā)布,官方支持中文(必看)
這篇文章主要介紹了IntelliJ Idea 2020.1 正式發(fā)布,官方支持中文了,本文通過截圖的形式給大家展示,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-04-04
SpringSecurityOAuth2實現(xiàn)微信授權登錄
微信的登錄功能是用戶注冊和使用微信的必經(jīng)之路之一,而微信授權登錄更是方便了用戶的登錄操作,本文主要介紹了SpringSecurityOAuth2實現(xiàn)微信授權登錄,感興趣的可以了解一下2023-09-09
springboot+shiro+jwtsession和token進行身份驗證和授權
最近和別的軟件集成項目,需要提供給別人接口來進行數(shù)據(jù)傳輸,發(fā)現(xiàn)給他token后并不能訪問我的接口,拿postman試了下還真是不行,檢查代碼發(fā)現(xiàn)項目的shiro配置是通過session會話來校驗信息的,修改代碼兼容token和session2024-06-06
解決bufferedReader.readLine()讀到最后發(fā)生阻塞的問題
這篇文章主要介紹了解決bufferedReader.readLine()讀到最后發(fā)生阻塞的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07

