這份SpringMVC執(zhí)行原理筆記搔谴,建議做java開發(fā)的好好看看魁袜,總結(jié)的很詳細(xì)!

什么是SpringMVC敦第?

Spring MVC屬于SpringFrameWork的后續(xù)產(chǎn)品峰弹,已經(jīng)融合在Spring Web Flow里面。Spring 框架提供的web模塊芜果,包含了開發(fā)Web 應(yīng)用程序的全功能 MVC 模塊鞠呈。從而在使用Spring進(jìn)行Web開發(fā)時(shí),可以選擇使用Spring的SpringMVC框架师幕。集成其他WEB MVC開發(fā)框架粟按,如Struts、Struts2等霹粥。SpringMVC是Web層的MVC開發(fā)框架灭将,屬于Spring框架的Web模塊中的一個(gè)部分。

基于SpringMVC案例

創(chuàng)建webapp項(xiàng)目后控、完善項(xiàng)目結(jié)構(gòu)庙曙、導(dǎo)入依賴

<!-- 配置開發(fā)SpringMVC所以來的jar包 -->
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-webmvc</artifactId>
  <version>5.1.5.RELEASE</version>
</dependency>
<!-- 配置ServletAPI依賴 -->
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>javax.servlet-api</artifactId>
  <version>3.0.1</version>
  <scope>provided</scope>
</dependency>
<!--配置JSP依賴包-->
<!-- https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api -->
<dependency>
  <groupId>javax.servlet.jsp</groupId>
  <artifactId>javax.servlet.jsp-api</artifactId>
  <version>2.2.1</version>
  <scope>provided</scope>
</dependency>

在web.xml文件中配置中央處理器(DispatcherServlet)

 <servlet>
        <servlet-name>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
 </servlet>
    <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <!-- 注意:/后面沒有* -->
        <url-pattern>/</url-pattern>
    </servlet-mapping>

創(chuàng)建自定義控制器類

package qing;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class StudentController implements Controller {
    @Override
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        ModelAndView mav = new ModelAndView();
        mav.addObject("info", "hello,小李同學(xué)");
        mav.setViewName("test.jsp");
        return mav;
    }
}

在resources文件中編寫SpringMVC.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!-- 配置URL解析器 -->
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
    <!-- 配置控制適配器 -->
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
    <!-- 配置自定義控制器 -->
    <!-- name:自定義控制器訪問路徑  class:包名+類名 -->
    <bean name="/stu" class="qing.StudentController"></bean>
    <!-- 配置視圖解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/"></property>
        <property name="suffix" value=""></property>
    </bean>
</beans>

在web.xml配置文件中加載SpringMVC.xml文件

<servlet>
        <servlet-name>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:SpringMVC.xml</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

創(chuàng)建test.jsp文件

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>歡迎使用SpringMVC</title>
</head>
<body>
    <h1>${info}</h1>
</body>
</html>

部署本地服務(wù)器測(cè)試

http://localhost:8080/stu

SprigMVC的執(zhí)行流程

  • 啟動(dòng)服務(wù)器在web.xml文件中配置中央處理器(DispatcherServlet),初始化完成后加載SpringMVC配置文件。
  • 客戶端瀏覽器發(fā)送http請(qǐng)求浩淘。
  • http請(qǐng)求被中央處理器(DispatcherServlet)攔截捌朴,交給URL解析器解析吴攒。
  • URL解析器將http請(qǐng)求解析,得到具體請(qǐng)求路徑砂蔽。
  • URL解析器將解析得到的具體請(qǐng)求路徑返回給中央處理器(DispatherServlet)洼怔。
  • 中央處理器(DispatherServlet)將得到的具體請(qǐng)求路徑轉(zhuǎn)交給控制適配器。
  • 控制適配器根據(jù)具體路徑在SpringMVC配置文件中查找對(duì)應(yīng)請(qǐng)求處理類左驾。
  • 請(qǐng)求處理類執(zhí)行具體請(qǐng)求處理镣隶,得到ModelAndView對(duì)象,將ModelAndView對(duì)象交給控制適配器诡右,控制適配器將ModelAndView對(duì)象返回給中央處理器(DispatherServlet)安岂。
  • 中央處理器將ModelAndView對(duì)象轉(zhuǎn)交給視圖解析器去解析。
  • 視圖解析器解析ModelAndView對(duì)象帆吻,得到一個(gè)具體數(shù)據(jù)顯示路徑域那,將這個(gè)具體顯示路徑返回給中央處理器(DispatherServlet)。
  • 中央處理器(DispatherServlet)得到具體數(shù)據(jù)顯示路徑猜煮,將路徑代表的資源轉(zhuǎn)換執(zhí)行成一個(gè)html數(shù)據(jù)次员。
  • 將轉(zhuǎn)換執(zhí)行后的html數(shù)據(jù)返回給客戶端。

SpringMVC請(qǐng)求的訪問路徑配置

web.xml文件中DispatcherServlet配置的

(1) /
與之對(duì)應(yīng)的spring配置文件的控制器bean元素的name屬性值“/stu”
對(duì)應(yīng): http://localhost:8080/stu
(2) .do
與之對(duì)應(yīng)的spring配置文件的控制器bean元素的name屬性值“stu.do”
對(duì)應(yīng): http://localhost:8080/stu.do
注意:/ 這是一個(gè)錯(cuò)誤的方式

SpringMVC配置文件中的控制器的name屬性值

控制器的name屬性值設(shè)置要與web.xml文件中DispatcherServlet配置的的配置形式一致
(1) web.xml文件中DispatcherServlet配置的/那么SpringMVC配置文件中的控制器的name屬性值應(yīng)該為“/stu”
對(duì)應(yīng): http://localhost:8080/stu
(2) web.xml文件中DispatcherServlet配置的*.do那么springmvc配置文件中的控制器的name屬性值應(yīng)該為“/stu.do”
對(duì)應(yīng): http://localhost:8080/stu.do

請(qǐng)求處理的控制器類中請(qǐng)求處理方法handleRequest的返回值ModelAndView

(1) 創(chuàng)建一個(gè)普通的java類友瘤,實(shí)現(xiàn)import org.springframework.web.servlet.mvc.Controller接口
(2) 重寫handleRequest方法 (處理用請(qǐng)求的方法)
(3) 在SpringMVC的配置文件中配置

<bean name="/stu" class="qing.StudentController"></bean>

例如:

package qing;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class StudentController implements Controller {
    @Override
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        ModelAndView mav = new ModelAndView();
        mav.addObject("info", "hello,小李同學(xué)");
        mav.setViewName("test.jsp");
        return mav;
    }
}

請(qǐng)求處理方法handleRequest的返回值ModelAndView
ModelAndView—java類
組成ModelAndView類的第一部分是一個(gè)Model (模型) 封裝數(shù)據(jù)翠肘、第二部分是一個(gè)View (視圖) 展示數(shù)據(jù)的頁(yè)面元素
ModelAndView類是用來封裝數(shù)據(jù),展示數(shù)據(jù)的頁(yè)面元素辫秧。
構(gòu)造方法ModelAndView()來創(chuàng)建ModelAndView類的對(duì)象 : ModelAndView mav=new ModelAndView();
封裝數(shù)據(jù)的方法addObject(attributeName, attributeValue)相當(dāng)于setAttribute(key,value) :mav.addObject(“info”, “hello,小李同學(xué)”);
設(shè)置展示數(shù)據(jù)的頁(yè)面元素的名稱setViewName(viewName)
mav.setViewName(“test.jsp”);
mav.setViewName(“test”);
mav.setViewName(“test.html”);
mav.setViewName(“控制器對(duì)應(yīng)的請(qǐng)求處理路徑”);
mav.setViewName(“test”);—forword跳轉(zhuǎn)[轉(zhuǎn)發(fā)]
mav.setViewName(“forward:test.jsp”);
mav.setViewName(“redirect:test.jsp”);----sendRedirect跳轉(zhuǎn)[重定向]

視圖解析器

例如:

 <!-- 配置視圖解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 前綴工程訪問路徑 -->
        <property name="prefix" value="/"></property>
        <!-- 后綴工程訪問路徑 -->
        <property name="suffix" value=""></property>
    </bean>

利用請(qǐng)求處理類中的得到的視圖名束倍,通過視圖解析器的前綴和后綴合并得到一個(gè)完整的的訪問路徑。
prefix+視圖名稱+suffix = 完整的元素訪問路徑
例如:ModelAndView mav=new ModelAndView();
mav.setViewName(“test.jsp”);

<!-- 配置視圖解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 前綴工程訪問路徑 -->
        <property name="prefix" value="/"></property>
        <!-- 后綴工程訪問路徑 -->
        <property name="suffix" value=""></property>
    </bean>

經(jīng)過視圖解析器解析以后的完整路徑:http://localhost:8080/test.jsp
例如:ModelAndView mav=new ModelAndView();
mav.setViewName(“test”);

<!-- 配置視圖解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 前綴工程訪問路徑 -->
        <property name="prefix" value="/"></property>
        <!-- 后綴工程訪問路徑 -->
        <property name="suffix" value=""></property>
    </bean>

經(jīng)過視圖解析器解析以后的完整路徑:http://localhost:8080/test.html

DispatcherServlet中央處理器設(shè)置加載SpringMVC配置文件的設(shè)置

當(dāng)SpringMVC配置文件在resources目錄下時(shí)

web.xml配置文件:

<init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:SpringMVC.xml</param-value>
        </init-param>

當(dāng)SpringMVC配置文件在resources子文件目錄下時(shí)

<init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:file/SpringMVC.xml</param-value>
        </init-param>

當(dāng)springMVC配置文件在WEB-INF目錄下時(shí)

中央控制器對(duì)應(yīng)的servlet-name元素的值-servlet.xml, 在web.xml文件中servlet配置元素中不需要出現(xiàn)配置元素盟戏。

最后

歡迎關(guān)注公眾號(hào):前程有光绪妹,領(lǐng)取一線大廠Java面試題總結(jié)+各知識(shí)點(diǎn)學(xué)習(xí)思維導(dǎo)+一份300頁(yè)pdf文檔的Java核心知識(shí)點(diǎn)總結(jié)!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末柿究,一起剝皮案震驚了整個(gè)濱河市邮旷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蝇摸,老刑警劉巖婶肩,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異貌夕,居然都是意外死亡律歼,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門啡专,熙熙樓的掌柜王于貴愁眉苦臉地迎上來险毁,“玉大人,你說我怎么就攤上這事∨峡觯” “怎么了鲸鹦?”我有些...
    開封第一講書人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)跷跪。 經(jīng)常有香客問我馋嗜,道長(zhǎng),這世上最難降的妖魔是什么域庇? 我笑而不...
    開封第一講書人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任嵌戈,我火速辦了婚禮,結(jié)果婚禮上听皿,老公的妹妹穿的比我還像新娘。我一直安慰自己宽档,他們只是感情好尉姨,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著吗冤,像睡著了一般又厉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上椎瘟,一...
    開封第一講書人閱讀 52,262評(píng)論 1 308
  • 那天覆致,我揣著相機(jī)與錄音,去河邊找鬼肺蔚。 笑死煌妈,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的宣羊。 我是一名探鬼主播璧诵,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼仇冯!你這毒婦竟也來了之宿?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤苛坚,失蹤者是張志新(化名)和其女友劉穎比被,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體泼舱,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡等缀,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了柠掂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片项滑。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出枪狂,到底是詐尸還是另有隱情危喉,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布州疾,位于F島的核電站辜限,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏严蓖。R本人自食惡果不足惜薄嫡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望颗胡。 院中可真熱鬧毫深,春花似錦、人聲如沸毒姨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)弧呐。三九已至闸迷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間俘枫,已是汗流浹背腥沽。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鸠蚪,地道東北人今阳。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像邓嘹,于是被迫代替她去往敵國(guó)和親酣栈。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • SpringMVC介紹 Spring web mvc 和Struts2都屬于表現(xiàn)層的框架汹押,它是Spring框架的一...
    day_Sunny閱讀 753評(píng)論 0 0
  • 前言 做JavaWeb 開發(fā)的你矿筝,一定聽說過SpringMVC的大名,作為現(xiàn)在運(yùn)用最廣泛的Java框架棚贾,它到目前為...
    ITsupuerlady閱讀 1,135評(píng)論 1 15
  • Spring mvc 框架 DispatcherServlet前端控制器 ---- 整個(gè)流程控制的中心窖维,由它調(diào)用其...
    蕊er閱讀 708評(píng)論 0 0
  • 久違的晴天,家長(zhǎng)會(huì)妙痹。 家長(zhǎng)大會(huì)開好到教室時(shí)铸史,離放學(xué)已經(jīng)沒多少時(shí)間了。班主任說已經(jīng)安排了三個(gè)家長(zhǎng)分享經(jīng)驗(yàn)怯伊。 放學(xué)鈴聲...
    飄雪兒5閱讀 7,524評(píng)論 16 22
  • 今天感恩節(jié)哎琳轿,感謝一直在我身邊的親朋好友。感恩相遇!感恩不離不棄崭篡。 中午開了第一次的黨會(huì)挪哄,身份的轉(zhuǎn)變要...
    迷月閃星情閱讀 10,569評(píng)論 0 11