摘要:總結本章主要分析了接口抽象類以及對自定義的幾個重要屬性進行了測試,希望對大家有幫助,謝謝。
概述
Controller是Spring MVC為我們提供的基礎的控制器接口,和HttpServlet一樣,接收request和response參數處理用戶請求,并返回ModelAndView,從概念上可以類比Struts的Action。
Controller主要實現的如下功能:
接收并處理用戶請求
調用業務方法
返回ModelAndView
基于Controller開發請求處理Handler的特點:
需要實現Controller接口
請求參數需從請求request中獲取
請求處理Handler與Spring深度耦合
就目前項目開發,幾乎不會使用此方式進行開發,除非維護一些歷史項目。目前是基于注解進行開發,從Spring2.5及之后開始支持。編寫本章內容主要是基于知識點的全面性來考慮,大家可以了解了解。
本系列文章是基于Spring5.0.5RELEASE。
接口ControllerSpring提供的Controller接口,定義了一個方法,作用就是處理用戶請求,源碼如下:
package org.springframework.web.servlet.mvc; public interface Controller { /** *接收request和response參數,處理用戶請求 *參數從request中獲取 *方法返回ModelAndView,Model為模型數據,View為視圖 */ ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception; }Spring提供的實現類
Spring提供了如下實現:
AbstractController 控制瀏覽器緩存、支持的請求方法等等
ServletForwardingController 將Spring Handler接收的請求轉發給一個Servlet去執行
ParameterizableViewController 參數化視圖控制器,根據參數的邏輯視圖名直接選擇需要展示的視圖
AbstractUrlViewController 根據請求URL路徑直接轉化為邏輯視圖名的支持基類
UrlFilenameViewController 將請求URL路徑轉換為邏輯視圖名并返回的實現類ServletWrappingController Servlet包裝控制器
以上是Spring MVC為我們提供Controller接口的默認實現,下面我們接著分析這些實現類。
AbstractController該抽象類繼承WebContentGenerator并實現Controller接口,其中WebContentGenerator類用于瀏覽器緩存控制、自定義Controller支持的請求方法類型(默認支持:GET/HEAD/POST)等。
WebContentGenerator類的主要屬性如下:
/** 支持的請求方法類型,默認支持:GET、HEAD、POST */ @Nullable private SetsupportedMethods; @Nullable private String allowHeader; /** 當前請求是否必須有session */ private boolean requireSession = false; @Nullable private CacheControl cacheControl; /** 緩存過期時間,正數表示需要緩存,負數表示不做任何事情 */ private int cacheSeconds = -1; @Nullable private String[] varyByRequestHeaders; /** 是否使用HTTP1.0協議過期響應頭:如果true則會在響應頭添加“Expires:”;需要配合cacheSeconds使用 */ private boolean useExpiresHeader = false; /** 是否使用HTTP1.1協議的緩存控制響應頭,如果true則會在響應頭添加;需要配合cacheSeconds使用 */ private boolean useCacheControlHeader = true; /** 是否使用HTTP 1.1協議的緩存控制響應頭,如果true則會在響應頭添加;需要配合cacheSeconds使用 */ private boolean useCacheControlNoStore = true;
AbstractController類源碼如下:
/** 表示該控制器是否在執行時同步session,從而保證該會話的用戶串行訪問該控制器 */ private boolean synchronizeOnSession = false; /** *實現Controller接口的handleRequest方法 */ @Override @Nullable public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { if (HttpMethod.OPTIONS.matches(request.getMethod())) { response.setHeader("Allow", getAllowHeader()); return null; } // 檢查是否支持請求方法以及必須的session checkRequest(request); // 根據設置準備response prepareResponse(response); // 如果必要順序執行handleRequestInternal方法 if (this.synchronizeOnSession) { HttpSession session = request.getSession(false); if (session != null) { Object mutex = WebUtils.getSessionMutex(session); synchronized (mutex) { return handleRequestInternal(request, response); } } } return handleRequestInternal(request, response); } /** * 需要子類實現的模板方法 */ @Nullable protected abstract ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception;實戰
本章實戰是通過繼承AbstractController類編寫用戶請求handler,測試如下幾點:
繼承AbstractController抽象類,實現handlerRequestInternal方法處理用戶請求
通過前幾篇及上面的分析,SimpleControllerHandlerAdapter類可以適配實現了Controller接口的類,AbstractController實現了Controller接口的handleRequest方法,并預留了handleRequestInternal模板方法供子類實現,用戶處理用戶請求,根據這個思路,我們要使用SimpleControllerHandlerAdapter適配Controller時,只需繼承AbstractController類并實現handleRequestInternal方法即可,具體源碼如下:
自定義Controller源碼:
/** *繼承AbstractController并實現handleRequestInternal方法 */ public class HelloWorldController extends AbstractController { /** *通過response直接回寫數據,也可通過ModelAndView指定邏輯視圖并回寫數據 */ @Override protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { Writer writer = response.getWriter(); writer.write("hello AbstractController"); writer.flush(); return null; } }
配置文件配置如下:
驗證結果
代碼編寫完后,啟動應用進行測試,AbstractController默認支持GET、HEAD、POST方法類型,我們使用Postman進行測試,GET請求結果如下:
HEAD、POST也能處理,但如果發起PUT請求則返回不支持方法類型,如下圖:
指定請求方法類型
AbstractController默認支持GET、HEAD、POST三種請求類型,本例通過設置supportedMethods屬性來設置支持的請求方法類型,代碼如下:
配置文件配置如下:
PUT POST
驗證結果
只需在Controller Bean修改supportMethods屬性接口,測試PUT請求,結果如下:
requireSession前置檢查
當把requireSession屬性設置為true時,訪問Controller需檢查有無session,如果沒有將跑出HttpSessionRequiredException異常,代碼如下:
配置文件配置如下:
GET POST
新增的HelloWorld2Controller與HelloWorldController代碼基礎上增加獲取session的代碼,如下:
request.getSession(true);
測試驗證
首先驗證沒有session情況下,結果如下:
說明在訪問到自定義Controller前檢查session沒有,拋出HttpSessionRequiredException異常
我們增加了一個新的controller用于設置創建session,此時我們訪問一次后,再訪問需要驗證的session的請求,結果如下:
通過結果可見,測試能正常訪問了。
總結本章主要分析了Controller接口、AbstractController抽象類以及對自定義Controller的幾個重要屬性進行了測試,希望對大家有幫助,謝謝。
最后創建了qq群方便大家交流,可掃描加入,同時也可加我qq:276420284,共同學習、共同進步,謝謝!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/69567.html
摘要:概述上篇文章主要分析了提供的及抽象類,本章繼續分析其具體的幾個實現類。源碼由繼承關系繼承抽象類,并實現模板方法,完成將接收的請求進行轉發,源碼如下實現父類模板方法獲取部署文件中定義的,傳入參數。 概述 上篇文章主要分析了Spring提供的Controller及抽象類AbstractController,本章繼續分析其具體的幾個實現類。 本系列文章是基于Spring5.0.5RELEAS...
摘要:接口接口作用是將請求映射到處理程序,以及預處理和處理后的攔截器列表,映射是基于一些標準的,其中的細節因不同的實現而不相同。該參數是類型,作用是檢查所有的映射解析器或使用或為的,默認為,即從上下文中檢查所有的。 概述 在Spring MVC啟動章節https://segmentfault.com/a/1190000014674239,介紹到了DispatcherServlet的onRef...
摘要:類繼承關系如下該類實現接口,實現解析設置主題功能繼承類,以具備操作功能。新增并更換一張不同的圖片。配置文件只要替換即可,代碼如下配置默認的主題文件視圖和控制器視圖和控制器代碼與上一章一致,參考上章代碼。 概述 上節介紹了SessionThemeResolver解析器,本章分析下CookieThemeResolver,兩個解析器實現的功能是一樣的,只是使用的主題載體有區別而已,Sessi...
摘要:概述為我們提供國際化支持,通過設置系統的環境,根據運行環境使用不同的語言顯示。提供接口的作用是解析客戶端使用的地區,目的是為了根據這些信息實現視圖多語言即國際化。接口繼承接口,增加時區支持。 概述 Spring MVC為我們提供國際化支持,通過設置系統的環境,根據運行環境使用不同的語言顯示。Spring提供LocaleResolver接口的作用是解析客戶端使用的地區(Locale),目...
摘要:本系列文章是基于。說這么多就是想解釋下什么是適配器。本節我們主要從整體以及概念上闡述了的,后續會逐個分析提供的四種適配器,希望本節對大家能有幫助,謝謝。最后創建了群方便大家交流,可掃描加入,同時也可加我,共同學習共同進步,謝謝 概述 本章開始,我們分析Spring MVC的另一個重要組件,即HandlerAdapter,從命名上我即可直觀的理解為處理器適配器,那么處理器適配器是什么意思...
閱讀 1010·2021-11-22 13:52
閱讀 924·2019-08-30 15:44
閱讀 570·2019-08-30 15:43
閱讀 2424·2019-08-30 12:52
閱讀 3473·2019-08-29 16:16
閱讀 637·2019-08-29 13:05
閱讀 2943·2019-08-26 18:36
閱讀 1975·2019-08-26 13:46