目的
设计一个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.这可以使用/不使用网络片段来实现吗?
答案 0 :(得分:0)
不知何故,我设法找到了解决方案。
创建一个在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");
}
在您的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>
创建一个名为&#34; javax.servlet.ServletContainerInitializer&#34;的文件。 in&#34; / META-INF / services&#34;目录。在这个文件里面应该包含ServletContainerInitializer实现的FQDN。
对于您的JSP,请将它们放在&#34; / META-INF / resources /&#34;目录。例如,如果您的JSP放在&#34; / META-INF / resources / example&#34;,在#2中,&#34; put-attribute&#34;的值。元素将是&#34; /example/jsp-name.jspx"。
最后,在&#34; / META-INF&#34;中创建您的web-fragment.xml文件。目录。我的web-fragment.xml只包含&#34; display.name&#34;元件。我不确定这个文件是否有必要但是因为它对我有用,我想我会把它放在硬盘里。
在我的jar中,我也有Controllers和i18n属性文件,它们在servlet-context中定义,在主web.xml中加载和初始化。
如果这对您有用,请告诉我。 HTH。