• WEB应用打成jar包全记录


    内容属原创,转载请注明出处

    题外

       由于项目的需求—不管是怎么产生的这个需求—总之,需要支持把一个web应用打成jar包供其他应用使用,这就有了下面的过程。

           这个过程里用到了Spring和SpringMVC(用到的版本是3.1.4,后面略过此描述)的若干东东,如果不用这玩意的,请飘过。

    要做些什么?

          需要打包的这个Web应用包含下面这些内容:

    1. 静态资源,含 js、css、image
    2. 页面文件:jsp
    3. Jsp标签,含 tld文件和若干java代码
    4. 基于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" />

      这里有下面几个坑:

    1. 进入到这个配置里面的静态资源,需要被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目录呢。想了个办法,处理如下:

    1. 新建一个resource目录,比如命名为 resource
    2. 在resource里新建目录 META-INF
    3. 把tld文件拷贝到META-INF
    4. 在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的注解无效。

        

    成果在哪里

      这么个若干步骤以后,得到了什么呢?

      产出物有如下一些:

    1. 一个普通的jar,且命名为 com.test.base-1.0.0.jar
    2. Jsp的jar,且命名为 com.test.base.jsp-1.0.0.jar
    3. JSP转成servlet的配置文件,且命名为 jspServlet.txt

      如此,只要在要引用这个web应用的工程lib下扔这两个jar(当然同时要扔过去若干个相干的其他jar包),再在 web.xm里把这个 jspServlet引入,大功告成。

    成功了吗?

      如果,如我一般,spring用的3.1.4,web.xml里的版本是3.0,tomcat用的不是版本太旧,我想是会成功的吧。

      恕我未在其他web容器上测试,也未测试其他版本的spring

      谨以此文,感谢在度娘的帮助下给过我帮助的若干人。

    ------------------------------------

    当天空没有颜色的时候,就用自己的双手画出绚烂的彩虹。程序员的天空,永远都是多彩多姿的。

  • 相关阅读:
    javascript运算符
    javascript字符串转数字
    javascript的变量声明和数据类型
    javascript的历史和入门
    CSS中定位
    CSS中盒子模型
    CSS操作表格的边框和表格的属性示例代码
    常用的CSS样式示例代码
    CSS伪类选择器
    CSS选择器
  • 原文地址:https://www.cnblogs.com/kevinYX/p/3865401.html
Copyright © 2020-2023  润新知