Apache Tiles + Spring MVC обслуживает jsps внутри jar-файлов
Цель
Разработайте "дополнение" к веб-проекту.
Веб-проект
У меня есть проект, упакованный как WAR, который использует Spring MVC 4.1.6 и Apache Tiles 3.0.5 в качестве инфраструктуры пользовательского интерфейса. Это образец контекста приложения:
<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-файлы. Общая идея заключается в том, что если я удалю этот jar из каталога /WEB-INF/lib, все связанные с ним функции будут удалены при перезапуске веб-сервера. Аналогично, все связанные функции будут доступны, когда я поместу 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. Могут ли файлы jsp, которые находятся в файле JAR, быть определены в определении плиток?
2. Может ли это быть достигнуто с / без использования веб-фрагмента?
1 ответ
Каким-то образом мне удалось найти решение.
Создайте класс, который реализует ServletContainerInitializer в вашем банке. Переопределите метод и добавьте отображение сервлета, примерно так:
@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"); }
В своем определении плиток, которое находится в вашем фляге, сопоставьте имя определения, добавленное в #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>
Создайте файл с именем "javax.servlet.ServletContainerInitializer" в каталоге "/META-INF/services". Внутри этого файла должно содержаться полное доменное имя реализации ServletContainerInitializer.
Что касается ваших JSP, поместите их в каталог "/META-INF/resources/". Если, например, ваши JSP помещены в "/META-INF/resources/example", то в #2 значением для элемента "put-attribute" будет "/example/jsp-name.jspx".
Наконец, создайте свой файл web-фрагмент.xml в каталоге "/META-INF". Мой web-фрагмент.xml содержит только элемент "display.name". Я не уверен, нужен ли этот файл, но так как он работал для меня, я решил, что просто оставлю его на своем жестком диске.
В моем банке у меня также есть файлы свойств Controllers и i18n, которые определены в контексте сервлета, загружены и инициализированы в основном файле web.xml.
Дайте мне знать, если это работает для вас. НТН.