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