內容屬原創,轉載請注明出處
題外
由於項目的需求—不管是怎么產生的這個需求—總之,需要支持把一個web應用打成jar包供其他應用使用,這就有了下面的過程。
這個過程里用到了Spring和SpringMVC(用到的版本是3.1.4,后面略過此描述)的若干東東,如果不用這玩意的,請飄過。
要做些什么?
需要打包的這個Web應用包含下面這些內容:
- 靜態資源,含 js、css、image
- 頁面文件:jsp
- Jsp標簽,含 tld文件和若干java代碼
- 基於SpringMVC的其他若干Control和Service
要把web應用打包,需要支持上面的這些文件打包,且打包后要能正常訪問。
解決的方法
靜態資源
SpringMVC提供了一個叫做 mvc:resources 的東東,這個東東使用后可以訪問打在jar里的靜態文件(具體mvc:resources是個什么東東且問度娘)且看配置示例:
dispatcher-servlet.xml 的配置: <mvc:resources mapping="/test/js/**" location="classpath:/staticRes/test/js/" cache-period="31556926" />
這里有下面幾個坑:
- 進入到這個配置里面的靜態資源,需要被spring的servlet攔截到,且看配置:
web.xml的配置: <servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:dispatcher-servlet.xml </param-value> </init-param> <load-on-startup>3</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>/test/js/*</url-pattern> </servlet-mapping>
2. 對於springMVC而言,在上面的配置中,resources的mapping里的路徑,相對的是經過web.xml的servlet-mapping中的url-pattern匹配后的路徑,比如訪問的資源文件是: /test/js/test.js,被weib.xml匹配后,進入到mvc:resources里判斷用的路徑就是 /test.js,而 mapping里配置的是 /test/js/** ,這樣導致匹配不成功,也就不會定位到后面的location中去。
這個坑有點大,基於某種原因,test目錄下除了有js,還有jsp、css等若干文件,最終,修改了springMVC的一點點代碼:
類:org.springframework.web.servlet.handler. AbstractUrlHandlerMapping
方法:getHandlerInternal
原代碼:
修改后的代碼:

有了上面這個配置,需要做的只是把靜態資源打到jar包並配置好相應的映射路徑。
頁面文件
解決了靜態資源,jsp頁面要另外想辦法了。鑒於容器會把jsp文件生成java編譯成class,那么是不是可以考慮把jsp資源生成class打到jar包呢。在度娘的不懈幫助下,這位哥們告訴了我怎么做:
jsp變為jar包:http://mrhouzhibin.blog.163.com/blog/static/19459624120120119445038/
既然有這么好的東東,拿來用唄。
很順利的jar生成了,jsp對應的servlet配置也生成了,但是又碰到了一個問題,這么多jsp的servlet,如果都扔到web.xml,后續維護還不得頭疼死,有沒有辦法把web.xml拆分呢?答案自然是有的,度娘說,請參考下文:
如何在web.xml文件中引入其他的xml文件http://www.blogjava.net/jiangjf/archive/2009/04/13/264685.html
注意了:
考慮到xml文件在eclipse老是會validate出錯,就把生成的jsp對應的servlet的文件名后綴改成了txt,然后再在web.xml里引入,搞定。
JSP標簽
Jsp標簽里的java代碼是沒有什么特別的,就是 *.tld 文件要想想辦法。話說容器解析時好像只解析WEB-INF目錄下的tld和jar包里的META-INF 中的tld文件,怎么樣才能讓tld文件在需要打包的web應用里可用,又打包的時候打到META-INF目錄呢。想了個辦法,處理如下:
- 新建一個resource目錄,比如命名為 resource
- 在resource里新建目錄 META-INF
- 把tld文件拷貝到META-INF
- 在web應用的web.xml里添加如下配置:
<jsp-config> <taglib> <taglib-uri>http://www.test.com/jsp/t</taglib-uri> <taglib-location>classes/META-INF/test.tld</taglib-location> </taglib> </jsp-config>
這樣打出來的jar包中 tld文件在META-INF目錄下,不需要再在web.xml里配置了。
基於Spring的若干代碼
這里就是基本的一些java代碼,本來就該在jar里的,只是有點點小坑,在導出jar包的時候,需要勾選一個東東,否則Spring的注解無效。
成果在哪里
這么個若干步驟以后,得到了什么呢?
產出物有如下一些:
- 一個普通的jar,且命名為 com.test.base-1.0.0.jar
- Jsp的jar,且命名為 com.test.base.jsp-1.0.0.jar
- JSP轉成servlet的配置文件,且命名為 jspServlet.txt
如此,只要在要引用這個web應用的工程lib下扔這兩個jar(當然同時要扔過去若干個相干的其他jar包),再在 web.xm里把這個 jspServlet引入,大功告成。
成功了嗎?
如果,如我一般,spring用的3.1.4,web.xml里的版本是3.0,tomcat用的不是版本太舊,我想是會成功的吧。
恕我未在其他web容器上測試,也未測試其他版本的spring
謹以此文,感謝在度娘的幫助下給過我幫助的若干人。
