摘要:概述上篇文章主要分析了提供的及抽象類(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.5RELEASE。
ServletForwardingController作用
ServletForwardingController實(shí)現(xiàn)的功能是將接收的用戶(hù)請(qǐng)求轉(zhuǎn)發(fā)給你一個(gè)命名的servlet去處理,該命名servlet需在部署描述(web.xml)文件中定義。
源碼
由繼承關(guān)系ServletForwardingController繼承AbstractController抽象類(lèi),并實(shí)現(xiàn)模板方法handleRequestInternal,完成將接收的請(qǐng)求進(jìn)行轉(zhuǎn)發(fā),源碼如下:
/** *實(shí)現(xiàn)父類(lèi)模板方法 */ @Override protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { ServletContext servletContext = getServletContext(); Assert.state(servletContext != null, "No ServletContext"); // 獲取部署文件中定義的servlet,傳入servelet name參數(shù)。 RequestDispatcher rd = servletContext.getNamedDispatcher(this.servletName); if (rd == null) { throw new ServletException("No servlet with name "" + this.servletName + "" defined in web.xml"); } // 判斷是否是include請(qǐng)求 if (useInclude(request, response)) { // 是include請(qǐng)求,繼續(xù)使用include rd.include(request, response); if (logger.isDebugEnabled()) { logger.debug("Included servlet [" + this.servletName + "] in ServletForwardingController "" + this.beanName + """); } } else { // 非include請(qǐng)求,進(jìn)行轉(zhuǎn)發(fā) rd.forward(request, response); if (logger.isDebugEnabled()) { logger.debug("Forwarded to servlet [" + this.servletName + "] in ServletForwardingController "" + this.beanName + """); } } return null; }
實(shí)戰(zhàn)
編寫(xiě)servlet,代碼如下:
public class ForwardServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.getWriter().write("hello ForwardServlet..."); } }
配置部署描述文件,代碼如下:
forwording com.github.dalianghe.controller.ForwardServlet
配置Spring配置文件,代碼如下:
測(cè)試
編寫(xiě)完以上代碼,啟動(dòng)系統(tǒng)并請(qǐng)求,地址:http://localhost:8086/forwardToServlet,請(qǐng)求將通過(guò)ServletForwardingController轉(zhuǎn)發(fā)到Servlet進(jìn)行處理,最終在界面如圖:
ParameterizableViewController作用
根據(jù)參數(shù)的邏輯視圖名直接選擇需要展示的視圖,只支持GET、HEAD請(qǐng)求方法類(lèi)型。
源碼
核心處理方法源碼如下:
/** *處理請(qǐng)求 */ @Override protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { //獲取配置的viewName屬性 String viewName = getViewName(); ... ... // 把視圖邏輯名設(shè)置到ModelAndView中 if (getViewName() != null) { modelAndView.setViewName(viewName); } else { modelAndView.setView(getView()); } return (isStatusOnly() ? null : modelAndView); }
實(shí)戰(zhàn)
因?yàn)榇瞬糠质褂胘sp視圖,故需引入jstl支持,在pom文件中添加依賴(lài)坐標(biāo),如下:
javax.servlet jstl 1.2
在Spring配置文件中,添加相關(guān)配置,如下:
在WEB-INF下新建jsp文件夾及test.jsp文件,文件內(nèi)容如下:
My Frist JSP hello jsptest
測(cè)試
啟動(dòng)服務(wù),進(jìn)行測(cè)試,訪(fǎng)問(wèn)/helloJSP,結(jié)果如下:
測(cè)試結(jié)果表明,我們并未編寫(xiě)Controller,通過(guò)配置接口實(shí)現(xiàn)通過(guò)Spring轉(zhuǎn)發(fā)到視圖。
UrlFilenameViewController作用
作用與ParameterizableViewController一樣,但功能強(qiáng)大很多,支持模式匹配。
示例
以下提供兩種示例,可做為參考,如下:
本類(lèi)不做演示了,有興趣的可以自行驗(yàn)證,有問(wèn)題可以留言或加入qq群反饋。
總結(jié)本章主要分析并演示了Spring提供Controller接口的實(shí)現(xiàn)類(lèi),目前來(lái)說(shuō)用的很多,有些我也不是很明白,有講解錯(cuò)誤的地方,還望指定,真心的希望能與大家一起進(jìn)步。
最后創(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://www.ezyhdfw.cn/yun/69586.html
摘要:概述上篇學(xué)習(xí)了視圖解析器作用及處理流程,為我們提供了豐富的視圖解析器見(jiàn)下圖本系列文章是基于。該視圖解析器是根據(jù)處理器返回的邏輯視圖名稱(chēng),在應(yīng)用上下文中查找該名稱(chēng)的視圖對(duì)象視圖對(duì)象就是的對(duì)象。 概述 上篇學(xué)習(xí)了Spring MVC ViewResolver視圖解析器作用及處理流程,Spring為我們提供了豐富的視圖解析器(見(jiàn)下圖):showImg(https://segmentfault...
摘要:類(lèi)實(shí)現(xiàn)接口,使用用戶(hù)會(huì)話(huà)中的主題。新增并更換一張不同的圖片。通過(guò)關(guān)閉瀏覽器,然后再訪(fǎng)問(wèn)進(jìn)行測(cè)試總結(jié)本章通過(guò)攔截器和結(jié)合實(shí)現(xiàn)了通過(guò)請(qǐng)求參數(shù)控制會(huì)話(huà)主題。 概述 本章繼續(xù)分析ThemeResolver的另一個(gè)實(shí)現(xiàn)類(lèi)SessionThemeResolver,需要了解Spring MVC Theme情況的,可參考上一篇文章https://segmentfault.com/a/119000001...
摘要:概述上一篇就默認(rèn)的進(jìn)行了分析,詳細(xì)請(qǐng)參考,本節(jié)我們繼續(xù)分析學(xué)習(xí),主要分析解析器類(lèi)繼承關(guān)系如下圖由上面類(lèi)圖可知,繼承并實(shí)現(xiàn)接口,主要是操作的工具類(lèi),繼承接口,增加了信息操作。即通過(guò)實(shí)現(xiàn)的選擇。 概述 上一篇就Spring MVC默認(rèn)的LocaleResovler(AcceptHeaderLocaleResolver)進(jìn)行了分析,詳細(xì)請(qǐng)參考https://segmentfault.com/...
摘要:總結(jié)本章主要分析了接口抽象類(lèi)以及對(duì)自定義的幾個(gè)重要屬性進(jìn)行了測(cè)試,希望對(duì)大家有幫助,謝謝。 概述 Controller是Spring MVC為我們提供的基礎(chǔ)的控制器接口,和HttpServlet一樣,接收request和response參數(shù)處理用戶(hù)請(qǐng)求,并返回ModelAndView,從概念上可以類(lèi)比Struts的Action。 Controller主要實(shí)現(xiàn)的如下功能: 接收并處理用...
摘要:默認(rèn)支持該策略。以上是對(duì)的宏觀(guān)分析,下面我們進(jìn)行內(nèi)部細(xì)節(jié)分析。整體流程一通過(guò)實(shí)現(xiàn)接口,完成攔截器相關(guān)組件的初始化調(diào)用類(lèi)的方法??偨Y(jié)本文主要分析了的初始化過(guò)程,希望對(duì)大家有幫助。隨著學(xué)習(xí)的深入,后面有時(shí)間在分析下期中涉及的關(guān)鍵,比如等等。 概述 本節(jié)我們繼續(xù)分析HandlerMapping另一個(gè)實(shí)現(xiàn)類(lèi)ReqeustMappingHandlerMapping,該類(lèi)是我們?nèi)粘i_(kāi)發(fā)中使用最多的...
閱讀 2657·2023-04-25 16:42
閱讀 1359·2021-11-22 14:45
閱讀 2557·2021-10-19 13:10
閱讀 2970·2021-09-29 09:34
閱讀 3572·2021-09-23 11:21
閱讀 2269·2021-08-12 13:25
閱讀 2447·2021-07-30 15:15
閱讀 3628·2019-08-30 15:54