史上最簡單的 Spring MVC 教程(二)

1 前言


在史上最簡單的 Spring MVC 教程(一)中,咱們已經(jīng)成功搭建起 Spring MVC 框架吱晒,并且運(yùn)行成功甸饱。在本篇博客中,咱們首先嘗試著對前面的程序進(jìn)行修改仑濒,即修改“action-servlet.xml”配置文件的位置和名稱叹话,修改后的項目結(jié)構(gòu)圖如下:

項目結(jié)構(gòu)圖

如上圖所示,咱們調(diào)整“action-servlet.xml”的位置到“src”目錄下躏精,并修改其名稱為“springmvc-servlet.xml”渣刷,接下來鹦肿,咱們直接重啟tomcat服務(wù)器是可以重啟成功的矗烛,這意味著:

  • Spring MVC 不是隨著容器啟動而啟動,它是在第一次訪問時進(jìn)行加載的。

雖然 tomcat 服務(wù)器啟動成功瞭吃,但在我們訪問 http://localhost:8080/ 的時候就會報錯啦碌嘀!因?yàn)?Java web 項目默認(rèn)的是到“WEB-INF”中尋找配置文件,而我們又調(diào)整了配置文件的位置歪架,報錯也就是顯然的啦股冗!要想解決這個問題,這就需要我們在“web.xml”文件中進(jìn)行初始化參數(shù)的配置:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

    <!-- 配置 DispatcherServlet和蚪,對所有后綴為action的url進(jìn)行過濾 -->
    <servlet>
        <servlet-name>action</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- 修改 Spring MVC 配置文件的位置和名稱 -->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc-servlet.xml</param-value>
        </init-param>
    </servlet>

    <servlet-mapping>
        <servlet-name>action</servlet-name>
        <url-pattern>*.action</url-pattern>
    </servlet-mapping>

    <welcome-file-list> 
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>

</web-app></pre>

這樣止状,當(dāng)我們重新啟動 tomcat 服務(wù)器,并訪問 http://localhost:8080/ 時候攒霹,就會訪問成功啦怯疤!

Spring

2 HandlerMapping


接下來,咱們就介紹常見的 handlerMapping催束,共3種集峦。對于 handlerMapping 的配置,我們將在“springmvc-servlet.xml”中進(jìn)行配置抠刺。

2.1 BeanNameUrlHandlerMapping

<?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-3.2.xsd">

    <!-- 聲明 handlerMapping -->
    <!-- 聲明 BeanNameURI 處理器映射塔淤,其為默認(rèn)的處理器映射 -->
    <bean id="beanNameUrlHandlerMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>

    <!-- 聲明 Controller -->
    <bean name="/home.action" class="spring.mvc.controller.CeshiController" />

    <!-- 內(nèi)部資源視圖解析器,前綴 + 邏輯名 + 后綴 -->
    <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
</beans></pre>

由于 BeanNameUrlHandlerMapping 為默認(rèn)配置的 handlerMapping速妖,所以就算我們重新啟動 tomcat 服務(wù)器高蜂,訪問的地址及頁面也不會出現(xiàn)什么變化,因此作者就不把運(yùn)行結(jié)果貼出來啦罕容!

2.2 SimpleUrlHandlerMapping

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">

    <!-- 聲明 handlerMapping -->
    <!-- 聲明 BeanNameURI 處理器映射妨马,其為默認(rèn)的處理器映射 -->
    <bean id="beanNameUrlHandlerMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>

    <!-- 聲明 SimpleUrlHandlerMapping 處理器映射 -->
    <bean id="simpleUrlHandlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="/a.aciton">homeController</prop>
                <prop key="/b.aciton">homeController</prop>
                <prop key="/c.aciton">homeController</prop>
            </props>
        </property>
    </bean>

    <!-- 聲明 Controller -->
    <bean id="homeController" name="/home.action" class="spring.mvc.controller.CeshiController" />

    <!-- 內(nèi)部資源視圖解析器,前綴 + 邏輯名 + 后綴 -->
    <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>

通過 SimpleUrlHandlerMapping杀赢,我們可以在 property 標(biāo)簽中 prop 配置多個 key 值烘跺,并且通過該 key 值訪問頁面,即我們可以通過 http://localhost:8080/springmvc/a.action 訪問頁面脂崔,其效果同訪問 http://localhost:8080/springmvc/home.action 相同滤淳。當(dāng)然,在這里之前砌左,我們需要在聲明的 Controller 中 bean 標(biāo)簽中添加一個 id 的屬性脖咐,并將其值配置到 prop 標(biāo)簽內(nèi),其訪問結(jié)果如下圖所示:

spring1
spring2

特別注意:當(dāng)有 BeanNameUrlHandlerMapping 方式和 SimpleUrlHandlerMapping 方式聲明沖突時汇歹,也就是有同名的URL屁擅,這時 Spring MVC 框架如何處理?

  • 首先产弹,配置重名不會引起沖突派歌;
  • 其次,出現(xiàn)同名時,按配置文件的順序執(zhí)行胶果,當(dāng)發(fā)現(xiàn)有一個URL滿足匾嘱,就跳出;
  • 最后早抠,Spring MVC 框架支持用戶自定義順序霎烙,增加 order 屬性即可。

在咱們自定義順序的時候蕊连,需要在 proprety 標(biāo)簽中添加order屬性悬垃,即:

<!-- n 為整數(shù),從0開始甘苍,越小優(yōu)先級越高 -->
<proprety name=”order” value=”n”/>

以上在“springmvc-servlet.xml”中配置的示例如下:

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">

    <!-- 聲明 handlerMapping -->
    <!-- 聲明 BeanNameURI 處理器映射盗忱,其為默認(rèn)的處理器映射 -->
    <bean id="beanNameUrlHandlerMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
        <property name="order" value="1"/>
    </bean>

    <!-- 聲明 SimpleUrlHandlerMapping 處理器映射 -->
    <bean id="simpleUrlHandlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="/a.aciton">homeController</prop>
                <prop key="/b.aciton">homeController</prop>
                <prop key="/home.aciton">homeController</prop>
            </props>
        </property>
        <property name="order" value="0"/>
    </bean>

    <!-- 聲明 Controller -->
    <bean id="homeController" name="/home.action" class="spring.mvc.controller.CeshiController" />

    <!-- 內(nèi)部資源視圖解析器,前綴 + 邏輯名 + 后綴 -->
    <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>

2.3 ControllerClassNameHandlerMapping

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">

    <!-- 聲明 handlerMapping -->
    <!-- 聲明 BeanNameUrlHandlerMapping 處理器映射羊赵,其為默認(rèn)的處理器映射 -->
    <bean id="beanNameUrlHandlerMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
        <property name="order" value="1"/>
    </bean>

    <!-- 聲明 SimpleUrlHandlerMapping 處理器映射 -->
    <bean id="simpleUrlHandlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="/a.aciton">homeController</prop>
                <prop key="/b.aciton">homeController</prop>
                <prop key="/hello.aciton">homeController</prop>
            </props>
        </property>
        <property name="order" value="0"/>
    </bean>

    <!-- 聲明 ControllerClassNameHandlerMapping 處理器映射 -->
    <bean id="controllerClassNameHandlerMapping" class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"/>

    <!-- 聲明 Controller -->
    <bean id="homeController" name="/hello.action" class="spring.mvc.controller.CeshiController" />

    <!-- 內(nèi)部資源視圖解析器趟佃,前綴 + 邏輯名 + 后綴 -->
    <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>

控制器類名處理器映射,只需要簡單的聲明即可使用昧捷,值得注意的是其訪問的地址為:http://localhost:8080/springmvc/homeController.action

spring3
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末闲昭,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子靡挥,更是在濱河造成了極大的恐慌序矩,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件跋破,死亡現(xiàn)場離奇詭異簸淀,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)毒返,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進(jìn)店門租幕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人拧簸,你說我怎么就攤上這事劲绪。” “怎么了盆赤?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵贾富,是天一觀的道長。 經(jīng)常有香客問我牺六,道長颤枪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任淑际,我火速辦了婚禮畏纲,結(jié)果婚禮上扇住,老公的妹妹穿的比我還像新娘。我一直安慰自己霍骄,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布淡溯。 她就那樣靜靜地躺著读整,像睡著了一般。 火紅的嫁衣襯著肌膚如雪咱娶。 梳的紋絲不亂的頭發(fā)上米间,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天,我揣著相機(jī)與錄音膘侮,去河邊找鬼屈糊。 笑死,一個胖子當(dāng)著我的面吹牛琼了,可吹牛的內(nèi)容都是我干的逻锐。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼雕薪,長吁一口氣:“原來是場噩夢啊……” “哼昧诱!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起所袁,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤盏档,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后燥爷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蜈亩,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年前翎,在試婚紗的時候發(fā)現(xiàn)自己被綠了稚配。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡港华,死狀恐怖药有,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情苹丸,我是刑警寧澤愤惰,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站赘理,受9級特大地震影響宦言,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜商模,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一奠旺、第九天 我趴在偏房一處隱蔽的房頂上張望蜘澜。 院中可真熱鬧,春花似錦响疚、人聲如沸鄙信。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽装诡。三九已至,卻和暖如春践盼,著一層夾襖步出監(jiān)牢的瞬間鸦采,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工咕幻, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留渔伯,地道東北人。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓肄程,卻偏偏與公主長得像锣吼,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蓝厌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評論 2 345