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 ответ

Решение

Каким-то образом мне удалось найти решение.

  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");
    }
    
  2. В своем определении плиток, которое находится в вашем фляге, сопоставьте имя определения, добавленное в #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. Создайте файл с именем "javax.servlet.ServletContainerInitializer" в каталоге "/META-INF/services". Внутри этого файла должно содержаться полное доменное имя реализации ServletContainerInitializer.

  4. Что касается ваших JSP, поместите их в каталог "/META-INF/resources/". Если, например, ваши JSP помещены в "/META-INF/resources/example", то в #2 значением для элемента "put-attribute" будет "/example/jsp-name.jspx".

  5. Наконец, создайте свой файл web-фрагмент.xml в каталоге "/META-INF". Мой web-фрагмент.xml содержит только элемент "display.name". Я не уверен, нужен ли этот файл, но так как он работал для меня, я решил, что просто оставлю его на своем жестком диске.

В моем банке у меня также есть файлы свойств Controllers и i18n, которые определены в контексте сервлета, загружены и инициализированы в основном файле web.xml.

Дайте мне знать, если это работает для вас. НТН.

Другие вопросы по тегам