第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

Spring MVC 使用原生 Servlet

1. 前言

本節(jié)課程和大家一起聊聊在 Spring MVC 中如何使用原生 Servlet API。通過本節(jié)課程,你將學(xué)習(xí)到:

  • 使用 Servlet API 作為控制器方法的入?yún)ⅲ?/li>
  • 使用 Spring MVCServlet API 代理類作為控制器方法的入?yún)ⅲ?/li>
  • 使用 IO 流對象作為控制器方法的入?yún)ⅰ?/li>

本章節(jié)重點在于理解 Spring MVC 高級組件與低級組件之間的關(guān)系。

2. Servlet API

使用 Spring MVC 框架,可以給開發(fā)者帶來諸多便利性,如自動綁定請求包中的數(shù)據(jù)、自動數(shù)據(jù)驗證……

Spring MVC 構(gòu)建的 WEB 項目中,其實也可以直接使用原生的 Servlet API 。但在真實項目中,還是少用為好,畢竟項目是有工期的。

快速迭代是現(xiàn)代項目開發(fā)所追求的目標(biāo),這也是開發(fā)過程中選擇框架的目的。但是,了解本章節(jié)的知識,對于更好的理解 Spring MVC 有很大的幫助。

先一起回憶幾個常用的 Srevlet API:

  • HttpServletRequest: 用來處理請求包;
  • HttpServletResponse: 用來處理響應(yīng)包;
  • HttpSession: 會話對象;
  • ServletConfig: 配置對象;
  • ServletContext: Servlet 上下文對象。

這幾個 API 應(yīng)該很熟悉。因為 Spring MVC 對原生 Servlet API 進(jìn)行了高級封裝,使用 Spring MVC 開發(fā)時,開發(fā)者不需要直接使用原生 API ,但并不意味著我們不再需要它們,只是換了一種方式使用而已,由 Spring MVC 內(nèi)部組件使用它們。

圖片描述

Spring MVC 雖然封裝了底層 Servlet API 的使用,但并沒有切斷開發(fā)者直接對原生 Servlet API 的調(diào)用之路。對于需要使用原生 Servlet API 的場景,Spring MVC 提供了各種方便。

只需要在控制器的方法中聲明需要使用的原生 API 類型做參數(shù)即可。

@RequestMapping("/testApi01")
public String hello(HttpServletRequest request,HttpServletResponse response) {	
	return "success";
}

這一切都應(yīng)該要感謝 Spring 強(qiáng)大的依賴注入功能。可以說,在 Spring 的世界里,你想要什么就有什么。調(diào)用上面方法時,Spring 就會注入你所需要的 API 對象。至于在方法中如何使用它,相信你一定已經(jīng)游刃有余。

如果你需要使用更多的原生 API。如上面代碼一樣,在方法參數(shù)中告訴 Spring 你所需要的 API 類型就可以了。

@RequestMapping("/testApi02")
public String hello(HttpSession session) {	
	return "success";
}

3. Servlet API 代理類

什么是 Servlet API 代理類?

Spring MVC 在它的 org.springframework.web.context.request 包中提供的有 WebRequest 接口,此接口可以用來代理原生 HttpServletRequest 的功能。

其本質(zhì)就是給原生 HttpServletRequest 加了一個外殼,擴(kuò)充了點功能,實質(zhì)還是在使用 HttpServletRequest 的功能。這個接口或者說是與此類似的接口,大家可以作為常識性知識了解,在企業(yè)開發(fā)過程并不常用。

和使用原生 Servlet API 一樣,只需要在控制器的方法中聲明成參數(shù)便可。

@RequestMapping(value = "/testApi03")
public String hello(WebRequest request) {
 String userName = request.getParameter("userName");
 return "success";
}

4. 使用 IO 流

WEB 程序整體上是 B / S 結(jié)構(gòu),本質(zhì)上是基于底層網(wǎng)絡(luò)的程序,是 C / S 結(jié)構(gòu)體系的升級?;貞浺幌戮W(wǎng)絡(luò)編程的幾個基本要素:

  • 服務(wù)器端建立監(jiān)聽端口;
  • 客戶端向監(jiān)聽端口發(fā)起網(wǎng)絡(luò)連接;
  • 連接成功后建立起雙向的網(wǎng)絡(luò)流傳輸通道;
  • 彼此之間通過網(wǎng)絡(luò)流通道進(jìn)行數(shù)據(jù)交流。

程序的本質(zhì)就是解決數(shù)據(jù)從哪里來、如何處理數(shù)據(jù)以及數(shù)據(jù)要去哪里的問題?;诰W(wǎng)絡(luò)的程序也是如此,其數(shù)據(jù)的來來往往是通過 IO 流實現(xiàn)的。

WEB 程序也是網(wǎng)絡(luò)程序,數(shù)據(jù)的來去也是通過 IO 流實現(xiàn)。可能你會說,使用原生 Servlet 規(guī)范開發(fā) WEB 項目時,你從沒有接觸或使用過這樣的流、哪樣的流。

那是因為無論你使用原生 Servlet API 還是使用 Spring MVC 開發(fā) WEB ,兩者已經(jīng)幫你隱藏了其中的細(xì)節(jié)。

圖片描述

HttpServletRequest 其本質(zhì)就是封裝網(wǎng)絡(luò)輸入流的操作。如果你不信,你可以查看 HttpServletRequest 的相關(guān)方法,會看到:

InputStream inStream=request.getInputStream();

觸類旁通,此時你應(yīng)該能理解到 HttpServletResponse 封裝了網(wǎng)絡(luò)輸出流的相關(guān)操作。

OutputStream outputStream= response.getOutputStream();

那么,在 Spring MVC 中我們能不能在控制器的方法中直接引用底層的 IO 流對象?

當(dāng)然可以!

TIps: Spring MVC 既可以把原生的 Servlet API 對象注入到控制器的方法中,也可以把更底層的 IO 流對象注入到控制器方法中。

4.1 注入 InputStream

在控制器的方法中聲明 InputStream 作為入?yún)ⅲ?strong>Spring MVC 就能注入你想要的 InputStream 對象。

@RequestMapping(value = "/testApi04",method = RequestMethod.POST)
public void hello(InputStream inputStream) throws IOException {
    byte[] buff=new byte[128];
	int read= inputStream.read(buff);
	System.out.println(new String(buff,0,read));
}

上面的實例,能讀取到請求包中的數(shù)據(jù),但過于低級,可讀性并不是很好。

Tips: 控制器方法的映射機(jī)制有只接受 POST 方法的限制,如果是 GET 方法的請求包,直接使用 InputStream 對象無法獲取到請求包中的數(shù)據(jù)。

GET 方法的請求數(shù)據(jù)是附加在 URL 上的,InputStream 只能讀取實體部分的數(shù)據(jù)。

4.2 注入 OutputStream

在控制器的方法中注入 OutputStream 對象,只需要在方法中添加參數(shù)聲明。

如下實例:可使用 OutputStream 對象讀取指定文件中的內(nèi)容后直接響應(yīng)給瀏覽器。

@RequestMapping(value = "/testApi05")
public void hello(OutputStream outputStream) throws IOException {
	Resource res = new ClassPathResource("/test.txt");
	FileCopyUtils.copy(res.getInputStream(), outputStream);
}

test.txt 文件的內(nèi)容是”this is a test’。文件直接放在項目的 src/main/java 目錄下。

圖片描述

在瀏覽器中輸入請求路徑 http://localhost:8888/sm-demo/testApi05 。你將在瀏覽器中看到:

圖片描述

有句話叫做 “條條道路通羅馬”,用在 Spring MVC 中真的是合適,依靠 Spring 強(qiáng)大的注入功能,只要原生開發(fā)中能有的對象基本上都能注入進(jìn)去。

5. 小結(jié)

本節(jié)課程和大家講解了在控制器方法中如何直接使用原生 Servlet API 和 更底層的 IO 流對象。

使用起來不難。但通過本節(jié)課程,希望大家能更透徹地理解 Spring MVC 和原生 Servlet API、網(wǎng)絡(luò)編程之間的關(guān)系。

  • Servlet API 是 J2EE 擬定的 企業(yè)級 WEB 應(yīng)用程序開發(fā)規(guī)范,可以認(rèn)為是官方提出來的開發(fā)框架。對 WEB 開發(fā)過程中的更低級的網(wǎng)絡(luò)流操作進(jìn)行了封裝;

  • Spring MVC 則是對原生 Servlet API 進(jìn)一步進(jìn)行了封裝。一切只是為了讓開發(fā)過程更高效。