摘要:概述用久了,深受其約定大于配置的便利性毒害之后,我想回歸到時代,看看開發(fā)模式中用戶是如何參與的。備注當然本文所使用的全是非注解的配置方法,即需要在中進行配置并且需要遵循各種實現(xiàn)原則。而更加通用主流的基于注解的配置方法將在后續(xù)文章中詳述。
概述
用久了SpringBoot,深受其約定大于配置的便利性 “毒害” 之后,我想回歸到SpringMVC時代,看看SpringMVC開發(fā)模式中用戶是如何參與的。本文就來體驗一下SpringMVC時代開發(fā)的流程。
注: 本文首發(fā)于 My 公眾號 CodeSheep ,可 長按 或 掃描 下面的 小心心 來訂閱 ↓ ↓ ↓SpringMVC架構(gòu)模式
一個典型的SpringMVC請求流程如圖所示,詳細分為12個步驟:
用戶發(fā)起請求,由前端控制器DispatcherServlet處理
前端控制器通過處理器映射器查找hander,可以根據(jù)XML或者注解去找
處理器映射器返回執(zhí)行鏈
前端控制器請求處理器適配器來執(zhí)行hander
處理器適配器來執(zhí)行handler
處理業(yè)務(wù)完成后,會給處理器適配器返回ModeAndView對象,其中有視圖名稱,模型數(shù)據(jù)
處理器適配器將視圖名稱和模型數(shù)據(jù)返回到前端控制器
前端控制器通過視圖解析器來對視圖進行解析
視圖解析器返回真正的視圖給前端控制器
前端控制器通過返回的視圖和數(shù)據(jù)進行渲染
返回渲染完成的視圖
將最終的視圖返回給用戶,產(chǎn)生響應(yīng)
整個過程清晰明了,下面我們將結(jié)合實際實驗來理解這整個過程。SpringMVC項目搭建
實驗環(huán)境如下:
IntelliJ IDEA 2018.1 (Ultimate Edition)
SpringMVC 4.3.9.RELEASE
Maven 3.3.9
這里我是用IDEA來搭建的基于Maven的SpringMVC項目,搭建過程不再贅述,各種點擊并且下一步,最終創(chuàng)建好的項目架構(gòu)如下:
添加前端控制器配置使用了SpringMVC,則所有的請求都應(yīng)該交由SpingMVC來管理,即要將所有符合條件的請求攔截到SpringMVC的專有Servlet上。
為此我們需要在 web.xml 中添加SpringMVC的前端控制器DispatcherServlet:
mvc-dispatcher org.springframework.web.servlet.DispatcherServlet contextConfigLocation classpath:mvc-dispatcher.xml mvc-dispatcher *.action
該配置說明所有符合.action的url,都交由mvc-dispatcher這個Servlet來進行處理
編寫SpringMVC核心XML配置文件從上一步的配置可以看到,我們定義的mvc-dispatcher Servlet依賴于配置文件 mvc-dispatcher.xml,在本步驟中我們需要在其中添加三個方面的配置
0x01. 添加處理器映射器
SpringMVC的處理器映射器有多種,這里的使用的BeanNameUrlHandlerMapping其映射規(guī)則是將bean的name作為url進行處理
0x02. 添加處理器適配器
SpringMVC的處理器適配器也有多種,這里的使用的SimpleControllerHandlerAdapter是Controller實現(xiàn)類的適配器類,其本質(zhì)是執(zhí)行Controller中的handleRequest方法。
0x03. 添加試圖解析器
這里配置了InternalResourceViewResolver視圖解析器后,其會根據(jù)controller方法執(zhí)行之后返回的ModelAndView中的視圖的具體位置,來加載對應(yīng)的界面并綁定數(shù)據(jù)
編寫控制器這里模擬的是一個打印學生名單的Service,我們編寫的控制器需要將查詢到的學生名單數(shù)據(jù)通過ModelAndView渲染到指定的JSP頁面中
public class TestController implements Controller { private StudentService studentService = new StudentService(); @Override public ModelAndView handleRequest( HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception { List編寫視圖文件studentList = studentService.queryStudents(); ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject("studentList",studentList); modelAndView.setViewName("/WEB-INF/views/studentList.jsp"); return modelAndView; } } class StudentService { public List queryStudents() { List studentList = new ArrayList (); Student hansonwang = new Student(); hansonwang.setName("hansonwang99"); hansonwang.setID("123456"); Student codesheep = new Student(); codesheep.setName("codesheep"); codesheep.setID("654321"); studentList.add(hansonwang); studentList.add(codesheep); return studentList; } }
這里的視圖文件是一個jsp文件,路徑為:/WEB-INF/views/studentList.jsp
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>學生名單 學生列表
姓名 | 學號 |
${student.name} | ${student.ID} |
結(jié)合本步驟和上一步驟,視圖和控制器都已編寫完成,由于我們之前配置的處理器映射器為:BeanNameUrlHandlerMapping,因此接下來我們還需要在mvc-dispatcher.xml文件中配置一個可被url映射的controller的bean,供處理器映射器BeanNameUrlHandlerMapping查找:
實驗測試
啟動Tomcat服務(wù)器,然后瀏覽器輸入:
http://localhost:8080/test.action
數(shù)據(jù)渲染OK。
備注:當然本文所使用的全是非注解的配置方法,即需要在XML中進行配置并且需要遵循各種實現(xiàn)原則。而更加通用、主流的基于注解的配置方法將在后續(xù)文章中詳述。
呼,長舒一口氣,這么個小Demo用SpringMVC完成的話,各種XML配置了半天,真麻煩啊,算了,還是回SpringBoot好了!
后記作者更多的原創(chuàng)文章在此,歡迎觀賞
My Personal Blog
作者更多的SpringBt實踐文章在此:
Spring Boot應(yīng)用監(jiān)控實戰(zhàn)
SpringBoot應(yīng)用部署于外置Tomcat容器
ElasticSearch搜索引擎在SpringBt中的實踐
初探Kotlin+SpringBoot聯(lián)合編程
Spring Boot日志框架實踐
SpringBoot優(yōu)雅編碼之:Lombok加持
如果有興趣,也可以抽點時間看看作者一些關(guān)于容器化、微服務(wù)化方面的文章:
利用K8S技術(shù)棧打造個人私有云 連載文章
從一份配置清單詳解Nginx服務(wù)器配置
Docker容器可視化監(jiān)控中心搭建
利用ELK搭建Docker容器化應(yīng)用日志中心
RPC框架實踐之:Apache Thrift
RPC框架實踐之:Google gRPC
微服務(wù)調(diào)用鏈追蹤中心搭建
Docker容器跨主機通信
Docker Swarm集群初探
高效編寫Dockerfile的幾條準則
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/69722.html
摘要:中添加攔截器配置如下攔截所有請求,也就是,只攔截開頭的請求。在中并沒有提供配置文件的方式來配置攔截器,因此需要使用的代碼式配置,配置如下這個屬性通常并不需要手動配置,高版本的會自動檢測第四點講下靜態(tài)資源映射。 以下內(nèi)容,如有問題,煩請指出,謝謝 上一篇講解了springboot的helloworld部分,這一篇開始講解如何使用springboot進行實際的應(yīng)用開發(fā),基本上尋著sprin...
摘要:問題來了,我們到底還在用嗎答案是,不全用。后者是初始化的配置,主要是的配置。啟動類測試啟動項目后,在瀏覽器里面輸入。通過查詢已裝載的,并且支持該而獲取的。按照前面對的描述,對于而言,這個必定是。的核心在的方法中。 之前已經(jīng)分析過了Spring的IOC(《零基礎(chǔ)帶你看Spring源碼——IOC控制反轉(zhuǎn)》)與AOP(《從源碼入手,一文帶你讀懂Spring AOP面向切面編程》)的源碼,本次...
摘要:概述約定大于配置的功力讓我們?nèi)玢宕猴L,在我之前寫的文章從到也對比過和這兩個框架,不過最終以超高的代碼信噪比和易上手性讓我們映像頗深。至于,我想在非時代大家應(yīng)該不陌生吧,作用是配置容器,也即形式的容器的配置類所使用。 showImg(https://segmentfault.com/img/remote/1460000015822144); 概 述 SpringBoot 約定大于配置...
摘要:開啟自動配置功能后文詳解這個注解,學過的同學應(yīng)該對它不會陌生,就是掃描注解,默認是掃描當前類下的。簡單來說,這個注解可以幫助我們自動載入應(yīng)用程序所需要的所有默認配置。簡單理解這二者掃描的對象是不一樣的。 前言 只有光頭才能變強。 文本已收錄至我的GitHub倉庫,歡迎Star:https://github.com/ZhongFuCheng3y/3y 回顧前面Spring的文章(以學習...
閱讀 2076·2021-11-11 16:54
閱讀 1053·2021-10-12 10:12
閱讀 391·2019-08-30 15:43
閱讀 655·2019-08-29 13:15
閱讀 1085·2019-08-29 13:12
閱讀 1537·2019-08-26 12:09
閱讀 1667·2019-08-26 10:24
閱讀 2273·2019-08-26 10:15