這是我的上一篇缤弦,沒看過的可以在這里點擊閱讀 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
配置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>標簽囤萤。具體代碼如下:
工程目錄結構如下:
其中昼窗,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容器就會嘗試顯示第二個,以此類推毙石。