Spring MVC基本配置

前言

原創(chuàng)文章轉(zhuǎn)載請注明出處,文中錯誤歡迎指正也切。

使用Spring MVC已經(jīng)有很長一段時間了腰湾,但在使用中還有存在一些模棱兩可的細(xì)節(jié)费坊,趁這次機會爭取將所有的這些問題一一解決旬痹,以便今后更加熟練地使用這個框架來解決問題。

創(chuàng)建一個基于Maven的Web項目

使用的IDE是IDEA永毅,簡單介紹一下步驟:

  1. 新建一個空的maven類型的module人弓;
  2. 為這個module添加web支持(本質(zhì)上是在src/main/下面添加了一個webapp目錄,其中webapp目錄包含WEB-INF/web.xml目錄和文件)意蛀。事實上健芭,webapp這個目錄的名字可以隨便取慈迈,但是需要在IDEA中配置這個目錄的路徑,以便于在打包的時候谴麦,IDEA可以幫你將該目錄中的內(nèi)容復(fù)制到項目的根目錄下伸头;
基于maven的web項目的目錄結(jié)構(gòu)

添加Spring MVC的maven依賴

使用maven管理jar包依賴非常的方便熊锭。對于Spring MVC而言雪侥,只需要引入一個依賴速缨。在項目的pom.xml文件中添加spring-webmvc的依賴:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>3.2.3.RELEASE</version>
</dependency>

之后代乃,maven會自動解決依賴,并把其依賴的所有jar包引入原茅,如下圖所示:

maven自動引入了所有依賴的jar包

由上圖可見擂橘,在Spring3.2.3中摩骨,Spring MVC依賴了如下幾個包:

  • spring-beans:
  • spring-context:
  • spring-aop:
  • spring-core:
  • spring-web:
  • spring-expression:
  • commons-logging:
  • aopalliance:

配置Spring MVC

首先,在resources目錄下面添加一個config目錄昌罩,在config目錄中創(chuàng)建一個名為spring-mvc-config.xml的文件(resouces/config/spring-mvc-config.xml)來作為Spring MVC的配置文件灾馒。這個文件的名字可以隨便取,因為之后我們可以在web.xml文件中自定義指定這個文件的位置和名稱绘搞。

配置web.xml文件

Spring MVC之所以可以整合到web應(yīng)用中傅物,是通過名為一個由框架提供的名為DispatcherServlet的servlet攔截請求實現(xiàn)的。因此蒿褂,在web.xml中添加這個servlet卒暂,如下:

<?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">
    <servlet>
        <servlet-name>springmvc-app</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:config/spring-mvc-config.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>springmvc-app</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

需要注意兩點:

  • <init-param>中指定了該servlet啟動時的參數(shù)contextConfigLocation也祠,這個參數(shù)的值用來指定Spring MVC的配置文件的位置。
  • <load-on-startup>通常應(yīng)為正整數(shù)堪旧,指定啟動順序削葱,值越小優(yōu)先級越高析砸。此處設(shè)置為1表示第一個啟動爆袍。

<url-pattern>寫成//*的區(qū)別

注意到,<servlet-mapping>中的<url-pattern>參數(shù)為/弦疮,而如果寫成/*又有什么區(qū)別呢蜘醋?

先看結(jié)論:

  • <url-pattern>/</url-pattern>:會匹配到/springmvc這樣的路徑型url政钟,不會匹配到模式為*.jsp這樣的后綴型url万皿。
  • <url-pattern>/*</url-pattern>:會匹配所有的url:路徑型的和后綴型的url(包括/springmvc无蜂,.jsp斥季,.js和*.html等)累驮。

下面是關(guān)于這個問題在stack overflow上的解釋:
原文鏈接:http://stackoverflow.com/questions/4140448/difference-between-and-in-servlet-mapping-url-pattern
簡單的翻譯如下:
<url-pattern>/*</url-pattern>這種形式將會覆蓋所有其它的servlet。不管你發(fā)出了什么樣的請求躁锡,最終都會在這個servlet中結(jié)束置侍。因此,對于servlet來說杠输,這是一個很糟糕的URL模式秕衙。通常來講,你只會想要在一個Filter中使用這種模式鹦牛。它可以通過調(diào)用doFilter()方法來使請求繼續(xù)搞糕。
<url-pattern>/</url-pattern>這種形式不會覆蓋任何其它的servlet寞宫。它僅僅替換了servlet容器中內(nèi)建的默認(rèn)servlet拉鹃。這種形式通常只用來請求靜態(tài)資源(CSS/JS/image等)和展示目錄的列表。servlet容器內(nèi)建的默認(rèn)servlet同樣可以處理HTTP cache請求钥屈、媒體(聲音/視頻)流以及文件的下載坝辫。通常來說,你不會想要覆蓋這個默認(rèn)的servlet竭业,否則及舍,你將不得不自己處理一些瑣碎的任務(wù)。因此咐柜,對于sevlet來說攘残,這同樣是一個糟糕的URL模式。說到為什么JSP頁面的請求并不會命中這個servlet遗契,那是因為servlet容器內(nèi)建的JSP servlet將會被調(diào)用病曾,而這個容器內(nèi)建的JSP servlet已經(jīng)默認(rèn)地映射在了*.jsp上。
<url-pattern></url-pattern>這種空串的形式捷兰。當(dāng)上下文的根被請求的時候负敏,它將被調(diào)用。這與<welcome-file>的方式是不同的顶考,因為這種形式在當(dāng)任何子目錄被請求的時候不會被調(diào)用。當(dāng)你期望一個“首頁servlet”的時候艘策,這種URL模式就是適合你的。

配置spring-mvc-config.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"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd">

    <context:component-scan base-package="me.johnshen.springmvc.controller"/>

    <bean id="viewResolver"
          class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/views/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>

使用注解標(biāo)識Controller類

package me.johnshen.springmvc.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/springmvc")
public class HelloWorldController {
    @RequestMapping("/helloworld")
    public String sayHello(){
        System.out.println("Hello World!");
        return "helloworld";
    }
}

@Controller表示該類作為項目的控制器組件;
類級別@RequestMapping表示所有該類中方法級別@RequestMapping都要相對于這個類級別@RequestMapping的值驯妄;
方法級別@RequestMapping相對于類級別@RequestMapping的映射路徑合砂。

請求的處理過程

當(dāng)有請求http://localhost:8080/springmvc/helloworld時,請求會被Spring MVC的DispatcherServlet攔截翩伪,并映射到HelloWorldControllersayHello()方法上處理。

返回的helloworld將被交給配置在spring-mvc-config.xml文件中的InternalResourceViewResolver視圖處理器處理凛剥。

這個處理器的配置將controller中返回的字符串"success"囊颅,加上前綴"/WEB-INF/views/jsp/"傅瞻,加上后綴".jsp",拼成資源的完整路徑"/WEB-INF/views/jsp/helloworld.jsp"嗅骄,最后返回該jsp視圖溺森。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市医窿,隨后出現(xiàn)的幾起案子炊林,更是在濱河造成了極大的恐慌,老刑警劉巖独榴,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件棺榔,死亡現(xiàn)場離奇詭異,居然都是意外死亡郎笆,警方通過查閱死者的電腦和手機当船,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門德频,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人竞思,你說我怎么就攤上這事钞护。” “怎么了课梳?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵余佃,是天一觀的道長爆土。 經(jīng)常有香客問我,道長步势,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任盅抚,我火速辦了婚禮妄均,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘丛晦。我一直安慰自己,他們只是感情好匹层,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布升筏。 她就那樣靜靜地躺著瘸爽,像睡著了一般您访。 火紅的嫁衣襯著肌膚如雪灵汪。 梳的紋絲不亂的頭發(fā)上柑潦,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天览露,我揣著相機與錄音譬胎,去河邊找鬼差牛。 笑死,一個胖子當(dāng)著我的面吹牛堰乔,可吹牛的內(nèi)容都是我干的偏化。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼浩考,長吁一口氣:“原來是場噩夢啊……” “哼夹孔!你這毒婦竟也來了被盈?” 一聲冷哼從身側(cè)響起析孽,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎只怎,沒想到半個月后袜瞬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡身堡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了季稳。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片景鼠。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖浓恶,靈堂內(nèi)的尸體忽然破棺而出包晰,到底是詐尸還是另有隱情杜窄,我是刑警寧澤塞耕,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站筛谚,受9級特大地震影響驾讲,放射性物質(zhì)發(fā)生泄漏吮铭。R本人自食惡果不足惜谓晌,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一溺欧、第九天 我趴在偏房一處隱蔽的房頂上張望姐刁。 院中可真熱鬧龙填,春花似錦岩遗、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽测僵。三九已至捍靠,卻和暖如春榨婆,著一層夾襖步出監(jiān)牢的瞬間良风,已是汗流浹背烟央。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工篙议, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人香璃。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像眯牧,于是被迫代替她去往敵國和親学少。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

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