從零開始搭建ssm項目(二)配置web.xml

這是我的上一篇缤弦,沒看過的可以在這里點擊閱讀 http://www.reibang.com/p/3431b6dceed3

在mysql建庫建表瞳遍,sql語句統(tǒng)一放在以下目錄茂浮,以便以后修改。


初始建表數(shù)據(jù)如下

-- 創(chuàng)建圖書表
CREATE TABLE `book` (
  `book_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '圖書ID',
  `name` varchar(100) NOT NULL COMMENT '圖書名稱',
  `number` int(11) NOT NULL COMMENT '館藏數(shù)量',
  PRIMARY KEY (`book_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1000 DEFAULT CHARSET=utf8 COMMENT='圖書表';

-- 初始化圖書數(shù)據(jù)
INSERT INTO `book` (`book_id`, `name`, `number`)
VALUES
    (1000, 'Java程序設計', 10),
    (1001, '數(shù)據(jù)結構', 10),
    (1002, '設計模式', 10),
    (1003, '編譯原理', 10);

-- 創(chuàng)建預約圖書表
CREATE TABLE `appointment` (
  `book_id` bigint(20) NOT NULL COMMENT '圖書ID',
  `student_id` bigint(20) NOT NULL COMMENT '學號',
  `appoint_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '預約時間' ,
  PRIMARY KEY (`book_id`, `student_id`),
  INDEX `idx_appoint_time` (`appoint_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='預約圖書表';

配置web.xml如下

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
    version="3.1" metadata-complete="true">
    <!-- 如果是用mvn命令生成的xml纯赎,需要修改servlet版本為3.1 -->
    <!-- 配置DispatcherServlet -->
    <servlet>
        <servlet-name>mvc-dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- 配置springMVC需要加載的配置文件
            spring-dao.xml,spring-service.xml,spring-web.xml
            Mybatis - > spring -> springmvc
         -->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring/spring-*.xml</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>mvc-dispatcher</servlet-name>
        <!-- 默認匹配所有的請求 -->
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

既然說到了web.xml的配置谦疾,那就簡單說一下web.xml的加載(網(wǎng)上找的攻略南蹂,講得挺詳細犬金,我就貼這里了)

一:web.xml加載過程

簡單說一下,web.xml的加載過程六剥。當我們啟動一個WEB項目容器時晚顷,容器包括(JBoss,Tomcat等)。首>先會去讀取web.xml配置文件里的配置疗疟,當這一步驟沒有出錯并且完成之后该默,項目才能正常的被啟動起來。

啟動WEB項目的時候策彤,容器首先會去讀取web.xml配置文件中的兩個節(jié)點:<listener> </listener>和><context-param> </context-param>如圖:

緊接著栓袖,容器創(chuàng)建一個ServletContext(application),這個web項目的所有部分都將共享這個上下文匣摘。容器>以<context-param></context-param>的name作為鍵,value作為值裹刮,將其轉(zhuǎn)化為鍵值對音榜,存入>ServletContext。

容器創(chuàng)建<listener></listener>中的類實例捧弃,根據(jù)配置的class類路徑<listener-class>來創(chuàng)建監(jiān)聽赠叼,在監(jiān)>聽中會有初始化方法,啟動Web應用時违霞,系統(tǒng)調(diào)用Listener的該方法 contextInitialized(ServletContextEvent >args)嘴办,在這個方法中獲得:

ServletContext application =ServletContextEvent.getServletContext();

context-param的值= application.getInitParameter("context-param的鍵");

得到這個context-param的值之后,你就可以做一些操作了买鸽。

舉例:你可能想在項目啟動之前就打開數(shù)據(jù)庫涧郊,那么這里就可以在<context-param>中設置數(shù)據(jù)庫的連
接方式(驅(qū)動、url眼五、user底燎、password),在監(jiān)聽類中初始化數(shù)據(jù)庫的連接弹砚。這個監(jiān)聽是自己寫的一個類双仍,
除了初始化方法,它還有銷毀方法桌吃,用于關閉應用前釋放資源朱沃。比如:說數(shù)據(jù)庫連接的關閉,此時茅诱,調(diào)用
contextDestroyed(ServletContextEvent args)逗物,關閉Web應用時,系統(tǒng)調(diào)用Listener的該方法瑟俭。

接著翎卓,容器會讀取<filter></filter>,根據(jù)指定的類路徑來實例化過濾器摆寄。

以上都是在WEB項目還沒有完全啟動起來的時候就已經(jīng)完成了的工作失暴。如果系統(tǒng)中有Servlet,則>Servlet是在第一次發(fā)起請求的時候被實例化的微饥,而且一般不會被容器銷毀逗扒,它可以服務于多個用戶的請求。>所以欠橘,Servlet的初始化都要比上面提到的那幾個要遲矩肩。總的來說肃续,web.xml的加載順序是: <context-param>
-> <listener> -> <filter> -> <servlet>黍檩。其中叉袍,如果web.xml中出現(xiàn)了相同的元素,則按照在配置文件中出現(xiàn)
的先后順序來加載刽酱。

二:web.xml標簽詳解

1.<web-app></web-app>

<web-app></web-app>是部署描述的根元素畦韭,該元素含23個子元素。在Servlet2.3中肛跌,子元素必須按照>DTD文件描述中指定的順序出現(xiàn)艺配。比如:如果部署描述符中的<web-app>元素有<servlet>和<servlet->mapping>兩個子元素,則<servlet>子元素必須出現(xiàn)在<servlet-mapping>子元素之前衍慎。在Servlet2.4中转唉,順
序并不重要。

2.<display-name></display-name>

<display-name></display-name>定義web應用的名稱稳捆。如<display-name>trk-order-rest</display-name>

3.<distributable/>

<distributable/>可以使用distributable元素來告訴servlet/JSP容器赠法,Web容器中部署的應用程序適合在分布式環(huán)境下運行。

4.<context-param></context-param>

<context-param>元素含有一對參數(shù)名和參數(shù)值乔夯,用作應用的Servlet上下文初始化參數(shù)砖织,參數(shù)名在整個>Web應用中必須是惟一的,在web應用的整個生命周期中上下文初始化參數(shù)都存在末荐,任意的Servlet和jsp都可>以隨時隨地訪問它侧纯。<param-name>子元素包含有參數(shù)名,而<param-value>子元素包含的是參數(shù)值甲脏。作為選擇眶熬,可用<description>子元素來描述參數(shù)。

配置Spring块请,必須需要<listener>娜氏,而<context-param>可有可無,如果在web.xml中不寫<context-param>配置信息墩新,默認的路徑是/WEB-INF/applicationContext.xml贸弥,在WEB-INF目錄下創(chuàng)建的xml文件的名稱必須是applicationContext.xml。如果是要自定義文件名可以在web.xml里加入contextConfigLocation這個context參數(shù):在<param-value>里指定相應的xml文件名海渊,如果有多個xml文件绵疲,可以寫在一起并以“,”號分隔,比如在business-client工程中切省,我們采用了自定義配置方式最岗,<context-param>配置如下:

配置在同一個容器中的多個web項目帕胆,要配置不同的webAppRootKey朝捆,web.xml文件中最好定義webAppRootKey參數(shù),如果不定義懒豹,將會缺省為“webapp.root”芙盘,為防止log4j配置沖突驯用,每個項目配置不同的webAppRootKey。如下:

當然也不能重復儒老,否則報類似下面的錯誤:

Web app root system property already set to different value: 'webapp.root' = [/home/user/tomcat/webapps/project1/] instead of   [/home/user/tomcat/webapps/project2/] - Choose unique values for the 'webAppRootKey' context-param in your web.xml files!

5.<session-config></session-config>

<session-config> 用于設置容器的session參數(shù)蝴乔,比如:<session-timeout>用于指定http session的失效時間。默認時間設置(30minutes)驮樊。<session-timeout>用來指定默認的會話超時時間間隔薇正,以分鐘為單位。該元素值為整數(shù)囚衔。如果 session-timeout元素的值為零或負數(shù)挖腰,則表示會話將永遠不會超時。

6.<filter></filter>見我的博客练湿,這里不在闡述猴仑。(http://www.cnblogs.com/vanl/p/5742501.html)

7.<listener></listener>見我的博客,這里不在闡述肥哎。(http://www.cnblogs.com/vanl/p/5753722.html)

8.<servlet></servlet>

8.1.Servlet介紹

Servlet通常稱為服務端小程序辽俗,是服務端的程序,用于處理及響應客戶的請求篡诽。Servlet是一個特殊的Java類崖飘,創(chuàng)建Servlet類自動繼承HttpServlet¤九客戶端通常只有GET和POST兩種請求方式坐漏,Servlet為了響應這兩種請求,必須重寫doGet()和doPost()方法碧信。大部分時候赊琳,Servlet對于所有的請求響應都是完全一樣的,此時只需要重寫service()方法即可響應客戶端的所有請求砰碴。另外HttpServlet有兩個方法:

init(ServletConfig config):創(chuàng)建Servlet實例時躏筏,調(diào)用該方法初始化Servlet資源。

destory():銷毀Servlet實例時呈枉,自動調(diào)用該方法回收資源趁尼。

通常無需重寫init()和destory()兩個方法,除非需要在初始化Servlet時猖辫,完成某些資源初始化的方法酥泞,才考慮重寫init()方法。如果重寫了init()方法啃憎,應該在重寫該方法的第一行調(diào)用super.init(config),該方法將調(diào)用HttpServlet的init()方法芝囤。如果需要在銷毀Servlet之前,先完先完成某些資源的回收,比如關閉數(shù)據(jù)庫鏈接悯姊,才需要重寫destory()方法羡藐。

8.2.Servlet的生命周期

創(chuàng)建Servlet實例有兩個時機:

客戶端第一次請求某個Servlet時,系統(tǒng)創(chuàng)建該Servlet的實例悯许,大部分Servlet都是這種Servlet仆嗦;

web應用啟動時立即創(chuàng)建Servlet實例,即<load-on-start>1</laod-on-start>(LZ有篇文章詳細說明:http://www.cnblogs.com/vanl/p/5756122.html)

每個Servlet的運行都遵循如下生命周期:

(1)創(chuàng)建Servlet實例先壕。

(2)Web容器調(diào)用Servlet的init()方法瘩扼,對Servlet進行初始化。

(3)Servlet初始化之后垃僚,將一直存在與容器之中邢隧,用于響應客戶端請求,如果客戶端發(fā)送GET請求冈在,容器調(diào)用Servlet的doGet()方法處理并響應請求倒慧;如果客戶端發(fā)送POST請求,容器調(diào)用Servlet的doPost()方法處理并響應請求包券∪伊拢或者統(tǒng)一使用service()方法處理來響應用戶請求。

(4)Web容器決定銷毀Servlet時溅固,先調(diào)用Servlet的destory()方法付秕,通常在關閉Web應用時銷毀Servlet實例。

8.3.Servlet的配置

為了讓Servlet能響應用戶請求侍郭,還必須將Servlet配置在web應用中询吴,配置Servlet需要修改web.xml文件。從Servlet3.0開始亮元,配置Servlet有兩種方式:

(1)在Servlet類中使用基于注解的方式進行配置:@WebServlet

(2)在web.xml文件中進行配置猛计。

我們用web.xml文件來配置Servlet,需要配置<servlet>和<servlet-mapping>爆捞。<servlet>用來聲明一個Servlet奉瘤。<icon>、<display-name>和<description>元素的用法和<filter>的用法相同煮甥。<init-param>元素與<context-param>元素具有相同的元素描述符盗温,可以使用<init-param>子元素將初始化參數(shù)名和參數(shù)值傳遞給Servlet,訪問Servlet配置參數(shù)通過ServletConfig對象來完成成肘,ServletConfig提供如下方法:

java.lang.String.getInitParameter(java.lang.String name):用于獲取初始化參數(shù)

ServletConfig獲取配置參數(shù)的方法和ServletContext獲取配置參數(shù)的方法完全一樣卖局,只是ServletContex是取得當前Servlet的配置參數(shù),而ServletContext是獲取整個web應用的配置參數(shù)双霍。

8.4.配置Spring MVC的Servlet

image

配置Spring MVC砚偶,指定處理請求的Servlet批销,有兩種方式:

(1)默認查找MVC配置文件的地址是:/WEB-INF/${servletName}-servlet.xml。

(2)可以通過修改配置文件的位置蟹演,需要在配置DispatcherServlet時指定MVC配置文件的位置风钻。

我們在平臺項目兩個工程中分別使用了不同的配置方式顷蟀,介紹如下:

我們在business-client工程中按照默認方式查找MVC的配置文件酒请,配置文件目錄為: /WEB-INF/business-servlet.xml。工程目錄結構如下所示:

我們在public-base-server工程中鸣个,通過第2種方式進行配置羞反,把spring-servlet.xml放到src/main/resources/config/spring-servlet.xml,則需要在配置DispatcherServlet時指定<init-param>標簽囤萤。具體代碼如下:

工程目錄結構如下:

image

其中昼窗,classpath是web項目的類路徑,可以理解為classes目錄下面涛舍。因為無論這些配置文件放在哪>里澄惊,編譯之后沒有特殊情況的話都直接在classes下面硝桩。在我們的工程里岛马,經(jīng)過驗證,maven工程這兩個

路徑經(jīng)過編譯后生成的文件都位于classes目錄下饭豹,即這兩個路徑相當于類路徑没佑,在下面創(chuàng)建config文件夾(folder),創(chuàng)建自定義的xml配置文件即可毕贼。

8.5.classpath與classpath*區(qū)別

同名資源存在時,classpath只從第一個符合條件的classpath中加載資源蛤奢,而classpath會從所有的classpath中加載符合條件的資源鬼癣。classpath,需要遍歷所有的classpath啤贩,效率肯定比不上classpath待秃,因此在項目設計的初期就盡量規(guī)劃好資源文件所在的路徑,避免使用classpath*來加載痹屹。

8.6.ContextLoaderListener和DispatcherServlet初始化上下文關系和區(qū)別

從上圖可以看出锥余,ContextLoaderListener初始化的上下文加載的Bean是對于整個應用程序共享的,一般如:DAO層痢掠、Service層Bean驱犹;DispatcherServlet初始化的上下文加載的Bean是只對Spring MVC有效的Bean,如:Controller足画、HandlerMapping雄驹、HandlerAdapter等,該初始化上下文只加載Web相關組件淹辞。

注意:用戶可以配置多個DispatcherServlet來分別處理不同的url請求医舆,每個DispatcherServlet上下文都對應一個自己的子Spring容器,他們都擁有相同的父Spring容器(業(yè)務層,持久(dao)bean所在的容器)蔬将。

9.<welcome-file-list></welcome-file-list>

<welcome-file-list>包含一個子元素<welcome-file>爷速,<welcome-file>用來指定首頁文件名稱。<welcome-file-list>元素可以包含一個或多個<welcome-file>子元素霞怀。如果在第一個<welcome-file>元素中沒有找到指定的文件惫东,Web容器就會嘗試顯示第二個,以此類推毙石。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末廉沮,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子徐矩,更是在濱河造成了極大的恐慌滞时,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,744評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件滤灯,死亡現(xiàn)場離奇詭異坪稽,居然都是意外死亡,警方通過查閱死者的電腦和手機鳞骤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評論 3 392
  • 文/潘曉璐 我一進店門窒百,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人弟孟,你說我怎么就攤上這事贝咙。” “怎么了拂募?”我有些...
    開封第一講書人閱讀 163,105評論 0 353
  • 文/不壞的土叔 我叫張陵庭猩,是天一觀的道長。 經(jīng)常有香客問我陈症,道長蔼水,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,242評論 1 292
  • 正文 為了忘掉前任录肯,我火速辦了婚禮趴腋,結果婚禮上,老公的妹妹穿的比我還像新娘论咏。我一直安慰自己优炬,他們只是感情好,可當我...
    茶點故事閱讀 67,269評論 6 389
  • 文/花漫 我一把揭開白布厅贪。 她就那樣靜靜地躺著蠢护,像睡著了一般。 火紅的嫁衣襯著肌膚如雪养涮。 梳的紋絲不亂的頭發(fā)上葵硕,一...
    開封第一講書人閱讀 51,215評論 1 299
  • 那天眉抬,我揣著相機與錄音,去河邊找鬼懈凹。 笑死蜀变,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的介评。 我是一名探鬼主播库北,決...
    沈念sama閱讀 40,096評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼威沫!你這毒婦竟也來了贤惯?” 一聲冷哼從身側響起洼专,我...
    開封第一講書人閱讀 38,939評論 0 274
  • 序言:老撾萬榮一對情侶失蹤棒掠,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后屁商,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體烟很,經(jīng)...
    沈念sama閱讀 45,354評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,573評論 2 333
  • 正文 我和宋清朗相戀三年蜡镶,在試婚紗的時候發(fā)現(xiàn)自己被綠了雾袱。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,745評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡官还,死狀恐怖芹橡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情望伦,我是刑警寧澤林说,帶...
    沈念sama閱讀 35,448評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站屯伞,受9級特大地震影響腿箩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜劣摇,卻給世界環(huán)境...
    茶點故事閱讀 41,048評論 3 327
  • 文/蒙蒙 一珠移、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧末融,春花似錦钧惧、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至语卤,卻和暖如春追逮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背钮孵。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評論 1 269
  • 我被黑心中介騙來泰國打工骂倘, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人巴席。 一個月前我還...
    沈念sama閱讀 47,776評論 2 369
  • 正文 我出身青樓历涝,卻偏偏與公主長得像,于是被迫代替她去往敵國和親漾唉。 傳聞我的和親對象是個殘疾皇子荧库,可洞房花燭夜當晚...
    茶點故事閱讀 44,652評論 2 354

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