10.1? 概述
10.1.1? Spring和Web框架
?????? Spring框架不僅提供了一套自己的Web框架實(shí)現(xiàn),還支持集成第三方Web框架(如Struts1x、Struts2x)。
?
?????? Spring實(shí)現(xiàn)的SpringMVC Web框架將在第十八章詳細(xì)介紹。
?
?????? 由于現(xiàn)在有很大部分公司在使用第三方Web框架,對(duì)于并不熟悉SpringMVC Web框架的公司,為了充分利用開(kāi)發(fā)人員已掌握的技術(shù)并相使用Spring的功能,想集成所使用的Web框架;由于Spring框架的高度可配置和可選擇性,因此集成這些第三方Web框架是非常簡(jiǎn)單的。
?
?????? 之所以想把這些第三方Web框架集成到Spring中,最核心的價(jià)值是享受Spring的某些強(qiáng)大功能,如一致的數(shù)據(jù)訪問(wèn),事務(wù)管理,IOC,AOP等等。
?
?????? Spring為所有Web框架提供一致的通用配置,從而不管使用什么Web框架都使用該通用配置。
?
10.1.2 ?通用配置
Spring對(duì)所有Web框架抽象出通用配置,以減少重復(fù)配置,其中主要有以下配置:
?
1 、Web 環(huán)境準(zhǔn)備:
1.1 、在spring 項(xiàng)目下創(chuàng)建如圖10-1 目錄結(jié)構(gòu):
圖10-1 web目錄結(jié)構(gòu)
1.2 、右擊spring 項(xiàng)目選擇【Propeties 】,然后選擇【Java Build Path 】中的【Source 】選項(xiàng)卡,將類(lèi)輸出路徑修改為“spring/webapp/WEB-INF/classes ”,如圖10-2 所示:
圖10-2 修改類(lèi)輸出路徑
1.3 、web.xml 初始內(nèi)容如下:
?
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> </web-app>
?<web-app version="2.4">表示采用Servlet 2.4規(guī)范的Web程序部署描述格式
?
?
2、? 指定Web 應(yīng)用上下文實(shí)現(xiàn): 在Web環(huán)境中,Spring提供WebApplicationContext(繼承ApplicationContext)接口用于配置Web應(yīng)用,該接口應(yīng)該被實(shí)現(xiàn)為在Web應(yīng)用程序運(yùn)行時(shí)只讀,即在初始化完畢后不能修改Spring Web容器(WebApplicationContext),但可能支持重載。
?
Spring提供XmlWebApplicationContext實(shí)現(xiàn),并在Web應(yīng)用程序中默認(rèn)使用該實(shí)現(xiàn),可以通過(guò)在web.xml配置文件中使用如下方式指定:
?
<context-param> <param-name>contextClass</param-name> <param-value> org.springframework.web.context.support.XmlWebApplicationContext </param-value> </context-param>
? 如上指定是可選的,只有當(dāng)使用其他實(shí)現(xiàn)時(shí)才需要顯示指定。
?
?
3、? 指定加載文件位置:
前邊已經(jīng)指定了Spring Web容器實(shí)現(xiàn),那從什么地方加載配置文件呢?
?
默認(rèn)情況下將加載/WEB-INF/applicationContext.xml配置文件,當(dāng)然也可以使用如下形式在web.xml中定義要加載自定義的配置文件,多個(gè)配置文件用“,”分割:
?
<context-param> <param-name>contextConfigLocation</param-name> <param-value> classpath:chapter10/applicationContext-message.xml </param-value> </context-param>
?
通用Spring配置文件(resources/chapter10/applicationContext-message.xml)內(nèi)容如下所示:
?
<bean id="message" class="java.lang.String"> <constructor-arg index="0" value="Hello Spring"/> </bean>
?
?
4、? 加載和關(guān)閉Spring Web 容器:
我們已經(jīng)指定了Spring Web容器實(shí)現(xiàn)和配置文件,那如何才能讓Spring使用相應(yīng)的Spring Web容器實(shí)現(xiàn)加載配置文件呢?
?
Spring使用ContextLoaderListener監(jiān)聽(tīng)器來(lái)加載和關(guān)閉Spring Web容器,即使用如下方式在web.xml中指定:
?
<listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener>
?
ContextLoaderListener監(jiān)聽(tīng)器將在Web應(yīng)用啟動(dòng)時(shí)使用指定的配置文件初始化Spring Web容器,在Web應(yīng)用關(guān)閉時(shí)銷(xiāo)毀Spring Web容器。
注:監(jiān)聽(tīng)器是從Servlet 2.3才開(kāi)始支持的,因此如果Web應(yīng)用所運(yùn)行的環(huán)境是Servlet 2.2版本則可以使用ContextLoaderServlet來(lái)完成,但從Spring3.x版本之后ContextLoaderServlet被移除了。
?
5、? 在Web 環(huán)境中獲取Spring Web 容器:
既然已經(jīng)定義了Spring Web容器,那如何在Web中訪問(wèn)呢?Spring提供如下方式來(lái)支持獲取Spring Web容器(WebApplicationContext):
?
?
WebApplicationContextUtils.getWebApplicationContext(servletContext); 或 WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);
? ?如果當(dāng)前Web應(yīng)用中的ServletContext 中沒(méi)有相應(yīng)的Spring Web容器,對(duì)于getWebApplicationContext()方法將返回null,而getRequiredWebApplicationContext()方法將拋出異常,建議使用第二種方式,因?yàn)槿笔pring Web容器而又想獲取它,很明顯是錯(cuò)誤的,應(yīng)該拋出異常。
?
?
6、? 通用jar 包,從下載的spring-framework- 3.0.5 .RELEASE-with-docs.zip 中dist 目錄查找如下jar 包:
org.springframework.web-3.0.5.RELEASE.jar? |
此jar包為所有Web框架所共有,提供WebApplicationContext及實(shí)現(xiàn)等。
?
?
7 、Web 服務(wù)器選擇及測(cè)試:
?????? 目前比較流行的支持Servlet規(guī)范的開(kāi)源Web服務(wù)器包括Tomcat、Resin、Jetty等,Web服務(wù)器有獨(dú)立運(yùn)行和嵌入式運(yùn)行之分,嵌入式Web服務(wù)器可以在測(cè)試用例中運(yùn)行不依賴于外部環(huán)境,因此我們使用嵌入式Web服務(wù)器。
?
?????? Jetty是一個(gè)非常輕量級(jí)的Web服務(wù)器,并且提供嵌入式運(yùn)行支持,在此我們選用Jetty作為測(cè)試使用的Web服務(wù)器。
?
7.1 、準(zhǔn)備Jetty 嵌入式Web 服務(wù)器運(yùn)行需要的jar 包:
?
到 http://dist.codehaus.org/jetty/網(wǎng)站下載jetty-6.1.24 ,在下載的 jetty-6.1.24.zip 包中拷貝如下jar包到項(xiàng)目的lib/jetty目錄下,并添加到類(lèi)路徑中:??
7.2 、在單元測(cè)試中啟動(dòng)Web 服務(wù)器:
?
package cn.javass.spring.chapter10; import org.junit.Test; import org.mortbay.jetty.Server; import org.mortbay.jetty.webapp.WebAppContext; public class WebFrameWorkIntegrateTest { @Test public void testWebFrameWork() throws Exception { Server server = new Server(8080); WebAppContext webapp = new WebAppContext(); webapp.setResourceBase("webapp"); //webapp.setDescriptor("webapp/WEB-INF/web.xml"); webapp.setContextPath("/"); webapp.setClassLoader(Thread.currentThread().getContextClassLoader()); server.setHandler(webapp); server.start(); server.join(); //server.stop(); } }
- 創(chuàng)建內(nèi)嵌式Web 服務(wù)器: 使用new Server(8080)新建一個(gè)Jetty服務(wù)器,監(jiān)聽(tīng)端口為8080;
- 創(chuàng)建一個(gè)Web 應(yīng)用: 使用new WebAppContext()新建一個(gè)Web應(yīng)用對(duì)象,一個(gè)Web應(yīng)用可以認(rèn)為就是一個(gè)WebAppContext對(duì)象;
- 指定Web 應(yīng)用的目錄: 使用webapp.setResourceBase("webapp")指定Web應(yīng)用位于項(xiàng)目根目錄下的“webapp”目錄下;
- 指定部署描述符: 使用webapp.setDescriptor("webapp/WEB-INF/web.xml");此處指定部署描述符為項(xiàng)目根目錄下的“webapp/WEB-INF/web.xml”,該步驟是可選的,如果web.xml位于Web應(yīng)用的WEB-INF下。
- 指定Web 應(yīng)用請(qǐng)求上下文: 使用webapp.setContextPath("/")指定請(qǐng)求上下文為“/”,從而訪問(wèn)該Web應(yīng)用可以使用如“http://localhost:8080/hello.do”形式訪問(wèn);
- 指定類(lèi)裝載器:因?yàn)镴etty自帶的ClassLoader在內(nèi)嵌環(huán)境中對(duì)中文路徑處理有問(wèn)題,因此我們使用Eclispe的ClassLoader,即通過(guò)“webapp.setClassLoader(Thread.currentThread().getContextClassLoader()) ”指定;
- 啟動(dòng)Web 服務(wù)器: 使用“server.start()”啟動(dòng)并使用“server.join()”保證Web服務(wù)器一直運(yùn)行;
- 關(guān)閉Web 服務(wù)器: 可以通過(guò)某種方式執(zhí)行“server.stop()”來(lái)關(guān)閉Web服務(wù)器;另一種方式是通過(guò)【Console】控制臺(tái)面板的【Terminate】終止按鈕關(guān)閉,如圖10-3所示:
圖10-3 點(diǎn)擊紅色按鈕關(guān)閉Web服務(wù)器
?
?
原創(chuàng)內(nèi)容,轉(zhuǎn)載請(qǐng)注明出處【 http://sishuok.com/forum/blogPost/list/0/2510.html 】
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
