最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring MVC數(shù)據(jù)綁定概述及原理詳解

 更新時(shí)間:2020年06月29日 10:13:41   作者:曾強(qiáng)  
這篇文章主要介紹了Spring MVC數(shù)據(jù)綁定概述及原理詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

數(shù)據(jù)綁定概述

在執(zhí)行程序時(shí),Spring MVC根據(jù)客戶端請(qǐng)求參數(shù)的不同,將請(qǐng)求消息中的信息以一定的方式轉(zhuǎn)換并綁定到控制器類的方法參數(shù)中。

這種將請(qǐng)求消息數(shù)據(jù)與后臺(tái)方法參數(shù)建立連接的過(guò)程就是 Spring MVC中的數(shù)據(jù)綁定。

在數(shù)據(jù)綁定過(guò)程中,Spring MVC框架會(huì)通過(guò)數(shù)據(jù)綁定組件(DataBinder)將請(qǐng)求參數(shù)串的內(nèi)容進(jìn)行類型轉(zhuǎn)換,然后將轉(zhuǎn)換后的值賦給控制器類中方法的形參,這樣后臺(tái)方法就可以正確綁定并獲取客戶端請(qǐng)求攜帶的參數(shù)。具體的信息處理過(guò)程的步驟如下。

(1)Spring MVC將ServletRequest對(duì)象傳遞給 DataBinder。

(2)將處理方法的入?yún)?duì)象傳遞給 DataBinder。

(3) DataBinder調(diào)用ConversionService組件進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換、數(shù)據(jù)格式化等工作,并將 ServletRequest對(duì)象中的消息填充到參數(shù)對(duì)象中。

(4)調(diào)用Validator組件對(duì)已經(jīng)綁定了請(qǐng)求消息數(shù)據(jù)的參數(shù)對(duì)象進(jìn)行數(shù)據(jù)合法性校驗(yàn)。

(5)校驗(yàn)完成后會(huì)生成數(shù)據(jù)綁定結(jié)果 BindingResult對(duì)象,Spring MVC會(huì)將BindingResult對(duì)象中的內(nèi)容賦給處理方法的相應(yīng)參數(shù)。

根據(jù)客戶端請(qǐng)求參數(shù)類型和個(gè)數(shù)的不同,將 Spring Mvc中的數(shù)據(jù)綁定主要分為簡(jiǎn)單數(shù)據(jù)綁定和復(fù)雜數(shù)據(jù)綁定

1.簡(jiǎn)單數(shù)據(jù)綁定

綁定默認(rèn)數(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";
	}
}

使用注解方式定義了一個(gè)控制器類,同時(shí)定義了方法的訪問(wèn)路徑。在方法參數(shù)中使用了HttpServletRequest類型,并通過(guò)該對(duì)象的 getParameter()方法獲取了指定的參數(shù)。為了方便查看結(jié)果,將獲取的參數(shù)進(jìn)行輸出打印,最后返回一個(gè)名為“success”的視圖,Spring MVC會(huì)通過(guò)視圖解析器在“WEB-INF/jsp”路徑下尋找“success.jsp”文件。

綁定簡(jiǎn)單數(shù)據(jù)類型

簡(jiǎn)單數(shù)據(jù)類型的綁定,就是指Java中幾種基本數(shù)據(jù)類型的綁定,如int、String、Double等類型。

@RequestMapping(value="/selectUser")
public String selectUser(Integer id) {
System.out.println("id="+id);
return "success";
}

與默認(rèn)數(shù)據(jù)類型案例中的 selectUser()方法相比,此方法中只是將 HttpServletrEquest參數(shù)類型替換為了 Integer類型。

@RequestParam注解主要用于對(duì)請(qǐng)求中的參數(shù)進(jìn)行定義,在使用時(shí)可以指定它的4個(gè)屬性,具體如表12.1所示。

綁定POJO類型

在使用簡(jiǎn)單數(shù)據(jù)類型綁定時(shí),可以很容易地根據(jù)具體需求來(lái)定義方法中的形參類型和個(gè)數(shù),然而在實(shí)際應(yīng)用中,客戶端請(qǐng)求可能會(huì)傳遞多個(gè)不同類型的參數(shù)數(shù)據(jù),如果還使用簡(jiǎn)單數(shù)據(jù)類型進(jìn)行綁定,那么就需要手動(dòng)編寫多個(gè)不同類型的參數(shù),這種操作顯然比較煩瑣。此時(shí)就可以使用POJO類型進(jìn)行數(shù)據(jù)綁定。

POJO類型的數(shù)據(jù)綁定就是將所有關(guān)聯(lián)的請(qǐng)求參數(shù)封裝在一個(gè)POJO中,然后在方法中直接使用該P(yáng)OJO作為形參來(lái)完成數(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

使用簡(jiǎn)單POJO類型已經(jīng)可以完成多數(shù)的數(shù)據(jù)綁定,但有時(shí)客戶端請(qǐng)求中傳遞的參數(shù)會(huì)比較復(fù)雜。例如,在老師查詢學(xué)生時(shí),頁(yè)面?zhèn)鬟f的參數(shù)可能包括班級(jí)名稱和學(xué)生號(hào)等信息,這就包含了班級(jí)和學(xué)生兩個(gè)對(duì)象的信息。如果將班級(jí)和學(xué)生的所有查詢條件都封裝在一個(gè)簡(jiǎn)單POJO中,顯然會(huì)比較混亂,這時(shí)就可以考慮使用包裝POJO類型的數(shù)據(jù)綁定。

所謂的包裝POJO,就是在一個(gè)POJO中包含另一個(gè)簡(jiǎn)單POJO。例如,在學(xué)生對(duì)象中包含班級(jí)對(duì)象。這樣在使用時(shí),就可以通過(guò)學(xué)生查詢到班級(jí)信息。

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生查詢頁(yè)面跳轉(zhuǎn)
	@RequestMapping("/tofindStudentWithBanji")
	public String tofindStudentWithBanji(){
		return "student";
	}
	//查詢學(xué)生和班級(jí)信息
	@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";
	}
}

復(fù)雜數(shù)據(jù)綁定

復(fù)雜的數(shù)據(jù)綁定問(wèn)題,比如數(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){
				//使用輸出語(yǔ)句模擬已經(jīng)刪除的課程
				for(Integer id:ids){
					System.out.println("刪除了id為"+id+"的課程");
				}
			}else{
				System.out.println("ids=null");
			}
			return "success";
		}
}

綁定集合

在項(xiàng)目中,前端請(qǐng)求傳遞過(guò)來(lái)的數(shù)據(jù)可能就會(huì)批量包含各種類型的數(shù)據(jù),如 Integer、String等。這種情況使用數(shù)組綁定是無(wú)法實(shí)現(xiàn)的。針對(duì)這種情況,可以使用集合數(shù)據(jù)綁定,即在包裝類中定義一個(gè)包含對(duì)象類的集合,然后在接收方法中將參數(shù)類型定義為該包裝類的集合。

UserController.java:

//向用戶批量修改頁(yè)面跳轉(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";
	}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot實(shí)現(xiàn)application.yml文件敏感信息加密

    SpringBoot實(shí)現(xiàn)application.yml文件敏感信息加密

    本文主要介紹了SpringBoot實(shí)現(xiàn)application.yml文件敏感信息加密,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • Quartz+Spring Boot實(shí)現(xiàn)動(dòng)態(tài)管理定時(shí)任務(wù)

    Quartz+Spring Boot實(shí)現(xiàn)動(dòng)態(tài)管理定時(shí)任務(wù)

    最近做項(xiàng)目遇到動(dòng)態(tài)管理定時(shí)任務(wù)的需求,剛拿到這個(gè)需求還真不知道從哪下手,經(jīng)過(guò)一番思考,終于找出實(shí)現(xiàn)思路,接下來(lái)通過(guò)本文給大家介紹了Quartz+Spring Boot實(shí)現(xiàn)動(dòng)態(tài)管理定時(shí)任務(wù)的相關(guān)知識(shí),需要的朋友可以參考下
    2018-09-09
  • 淺析Mysql中的視圖

    淺析Mysql中的視圖

    這篇文章主要介紹了淺析Mysql中的視圖,視圖是從一個(gè)或者多個(gè)表中導(dǎo)出的表,視圖的行為與表非常相似,在視圖中用戶可以使用SELECT語(yǔ)句查詢數(shù)據(jù),以及使用INSERT、UPDATE和DELETE修改記錄,需要的朋友可以參考下
    2023-05-05
  • SpringBoot+Vue項(xiàng)目新手快速入門指南

    SpringBoot+Vue項(xiàng)目新手快速入門指南

    最近剛剛做了一個(gè)基于vue+springboot的系統(tǒng),于是基于這點(diǎn),對(duì)遇到的一些問(wèn)題進(jìn)行一些配置的匯總,下面這篇文章主要給大家介紹了關(guān)于SpringBoot+Vue項(xiàng)目新手快速入門的相關(guān)資料,需要的朋友可以參考下
    2022-06-06
  • IntelliJ Idea 2020.1 正式發(fā)布,官方支持中文(必看)

    IntelliJ Idea 2020.1 正式發(fā)布,官方支持中文(必看)

    這篇文章主要介紹了IntelliJ Idea 2020.1 正式發(fā)布,官方支持中文了,本文通過(guò)截圖的形式給大家展示,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-04-04
  • SpringSecurityOAuth2實(shí)現(xiàn)微信授權(quán)登錄

    SpringSecurityOAuth2實(shí)現(xiàn)微信授權(quán)登錄

    微信的登錄功能是用戶注冊(cè)和使用微信的必經(jīng)之路之一,而微信授權(quán)登錄更是方便了用戶的登錄操作,本文主要介紹了SpringSecurityOAuth2實(shí)現(xiàn)微信授權(quán)登錄,感興趣的可以了解一下
    2023-09-09
  • springboot+shiro+jwtsession和token進(jìn)行身份驗(yàn)證和授權(quán)

    springboot+shiro+jwtsession和token進(jìn)行身份驗(yàn)證和授權(quán)

    最近和別的軟件集成項(xiàng)目,需要提供給別人接口來(lái)進(jìn)行數(shù)據(jù)傳輸,發(fā)現(xiàn)給他token后并不能訪問(wèn)我的接口,拿postman試了下還真是不行,檢查代碼發(fā)現(xiàn)項(xiàng)目的shiro配置是通過(guò)session會(huì)話來(lái)校驗(yàn)信息的,修改代碼兼容token和session
    2024-06-06
  • 解決Spring Security的權(quán)限配置不生效問(wèn)題

    解決Spring Security的權(quán)限配置不生效問(wèn)題

    這篇文章主要介紹了解決Spring Security的權(quán)限配置不生效問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • 解決bufferedReader.readLine()讀到最后發(fā)生阻塞的問(wèn)題

    解決bufferedReader.readLine()讀到最后發(fā)生阻塞的問(wèn)題

    這篇文章主要介紹了解決bufferedReader.readLine()讀到最后發(fā)生阻塞的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • 關(guān)于Java父類沒(méi)有無(wú)參構(gòu)造方法子類處理方法

    關(guān)于Java父類沒(méi)有無(wú)參構(gòu)造方法子類處理方法

    父類無(wú)參構(gòu)造方法,子類不寫,其實(shí)會(huì)默認(rèn)調(diào)用父類的無(wú)參構(gòu)造方法也就是用super(),編譯運(yùn)行后,會(huì)打印出"子類會(huì)調(diào)用Father的第一個(gè)構(gòu)造方法,這篇文章給大家介紹關(guān)于Java父類沒(méi)有無(wú)參構(gòu)造方法子類處理方法,感興趣的朋友一起看看吧
    2024-01-01

最新評(píng)論

郴州市| 六盘水市| 进贤县| 安化县| 玉田县| 资溪县| 东乡族自治县| 霍州市| 额济纳旗| 乐昌市| 佛山市| 江油市| 太和县| 安吉县| 山西省| 珲春市| 东乌珠穆沁旗| 西贡区| 和田市| 师宗县| 枣阳市| 分宜县| 耒阳市| 呼伦贝尔市| 壶关县| 蕉岭县| 基隆市| 石屏县| 察隅县| 金门县| 曲沃县| 浪卡子县| 怀宁县| 黎川县| 民县| 通辽市| 湘潭县| 巴里| 密云县| 会昌县| 丹凤县|