Apache Tiles + Spring MVC在jar文件中提供jsps

时间:2015-08-10 11:25:33

标签: spring-mvc apache-tiles web-fragment

目的
设计一个Web项目的“附加组件”。

网络项目
我有一个打包为WAR的项目,它使用Spring MVC 4.1.6和Apache Tiles 3.0.5作为UI框架。这是应用程序上下文的一个示例:

<bean class="org.springframework.web.servlet.view.tiles3.TilesConfigurer" id="tilesConfigurer">
    <property name="definitions">
        <list>
            <value>/WEB-INF/foo/bar/layouts.xml</value>
            <value>classpath:/META-INF/ext/**/views.xml</value><!-- For add-ons -->
        </list>
    </property>
</bean>

JAR
我有另一个JAR,这是“附加组件”。这个jar需要包含一些jsp文件。一般的想法是,如果我从/ WEB-INF / lib目录中删除此jar,则在重新启动Web服务器时将删除所有相关功能。同样,当我将jar放入lib目录时,所有相关功能都可用。样本图块定义(views.xml):

<!DOCTYPE tiles-definitions PUBLIC "-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN" "http://tiles.apache.org/dtds/tiles-config_3_0.dtd">
<tiles-definitions>
    <definition extends="main" name="space">
        <!-- This does not work -->
        <put-attribute name="body" value="classpath:/META-INF/resources/index.jspx" />
    </definition>
</tiles-definitions>


1.可以在tile定义中定义驻留在JAR文件中的jsp文件吗? 2.这可以使用/不使用网络片段来实现吗?

1 个答案:

答案 0 :(得分:0)

不知何故,我设法找到了解决方案。

  1. 创建一个在jar中实现ServletContainerInitializer的类。覆盖方法并添加servlet映射,如下所示:

    @Override
    public void onStartup(final Set<Class<?>> clazzes, final ServletContext servletContext) throws ServletException {
        final ServletRegistration servletRegistration = servletContext.addServlet("name-of-servlet-declared-in-web.xml", DispatcherServlet.class);
        servletRegistration.addMapping("/name-of-tiles-definition");
    }
    
  2. 在您的jar中的tile定义中,映射#1中添加的定义名称。

    <tiles-definitions>
        <definition extends="main" name="name-of-tiles-definition">
            <put-attribute name="body" value="/path-to-resource/jsp-name.jspx" />
        </definition>
    </tiles-definitions>
    
  3. 创建一个名为&#34; javax.servlet.ServletContainerInitializer&#34;的文件。 in&#34; / META-INF / services&#34;目录。在这个文件里面应该包含ServletContainerInitializer实现的FQDN。

  4. 对于您的JSP,请将它们放在&#34; / META-INF / resources /&#34;目录。例如,如果您的JSP放在&#34; / META-INF / resources / example&#34;,在#2中,&#34; put-attribute&#34;的值。元素将是&#34; /example/jsp-name.jspx"。

  5. 最后,在&#34; / META-INF&#34;中创建您的web-fragment.xml文件。目录。我的web-fragment.xml只包含&#34; display.name&#34;元件。我不确定这个文件是否有必要但是因为它对我有用,我想我会把它放在硬盘里。

  6. 在我的jar中,我也有Controllers和i18n属性文件,它们在servlet-context中定义,在主web.xml中加载和初始化。

    如果这对您有用,请告诉我。 HTH。