2013-07-09 4 views
3

все Я разрабатываю веб-приложение в Java с помощью Spring MVC 3.2.2. У меня возникают проблемы с загрузкой jsp-страницы из файла jar.Показать jsp-страницу внутри файла jar с помощью Spring MVC

Веб-приложение Sring MVC, что следующая структура:

|-META-INF 
|-WEB-INF 
    |-spring 
    | |- app-config.xml 
    |-classes 
    |-lib 
    | |-external.jar 
    |  |-WEB-INF 
    |  | |-views 
    |  |  |-external.jsp 
    |  |-classes 
    |   |-controller-for-external.class 
    |-views 
     |-... jsp 

конфигурации в приложение-config.xml

<context:annotation-config /> 
<context:component-scan base-package="com" /> 

<bean id="viewResolver" 
    class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <property name="viewClass" 
     value="org.springframework.web.servlet.view.JstlView"></property> 
    <property name="prefix" value="/WEB-INF/views/"></property> 
    <property name="suffix" value=".jsp"></property> 
</bean> 
<mvc:resources mapping="/views/**" location="classpath:/WEB-INF/views/" /> 
<mvc:annotation-driven /> 

Контроллер для external.jsp

@Controller 
    public class ExternalController { 
protected final Log logger = LogFactory.getLog(getClass()); 

@RequestMapping(value="/external.htm") 
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 
    Map<String, Object> myModel = new HashMap<String, Object>(); 
    myModel.put("msg", "External page loaded"); 
    return new ModelAndView("external", "model", myModel); 
} 

}

web.xml файл

<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> 

<display-name>Springapp</display-name> 
<servlet> 
    <servlet-name>springapp</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <init-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/spring/app-config.xml</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>/WEB-INF/spring/app-config.xml</param-value> 
</context-param> 

<servlet-mapping> 
    <servlet-name>springapp</servlet-name> 
    <url-pattern>*.htm</url-pattern> 
</servlet-mapping> 
</web-app> 

Когда попытка показать external.jsp страницу, весна не хочу искать его и показать ошибку HTTP 404 - /springapp/WEB-INF/views/external.jsp

Thanks HLicea

ответ

16

Вы можете сделать это, если используете Servlet 3.0. Тем не менее, это не сработает с тем, как у вас есть ваши JSP-пакеты. Вы должны упаковать ресурсы в файл JAR определенным образом:

  • Положите все ваши JSP-страницы в META-INF/resources директории вашего JAR.
  • Включите файл web-fragment.xml в META-INF. Это похоже на типичный web.xml с некоторыми отличиями. См. here для некоторых деталей. Существует также пример, который я нашел here. Это необязательно.
  • Поместите свой JAR в WEB-INF/lib вашей WAR.

Теперь вы должны иметь возможность обратиться к этим JSP в контексте вашего приложения. В основном META-INF/resources сопоставляется с корнем документа вашего веб-приложения. Посмотрите на this для более подробной информации. Имейте в виду, что это не ограничивается JSP. Вы можете разместить изображения, JavaScript или даже CSS.

+1

Это прекрасно работает и должно быть действительно принятым ответом. – DaveJohnston

7

Спасибо Vivin за ваше решение. Это сработало для меня.

В моем случае, у меня было:

testModule.jar

test/ 
     TestModule.class 
    META-INF/ 
     resources/ 
      WEB-INF/ 
       views/ 
        testModule.jsp 
     MANIFEST.MF 
     web-fragment.xml (empty) 
    WEB-INF/ 
     lib/ 

testProject.war

test/ 
     ... 
    META-INF/ 
     MANIFEST.MF 
    WEB-INF/ 
     spring/ 
      ... spring configs ... 
     views/ 
      test.jsp 
     lib/ 
      testModule.jar 
     web.xml 

Это может быть важно, чтобы сказать, что Servlet 3,0 сделать не обрабатывать фрагменты в сценарии развертывания Eclipse в Glassfish 3.1.2 (возможно, это работает в JBoss или других, что нужно подтвердить). Фактически, я устанавливаю testModule.jar в сборке развертывания testProject.war, и когда я развертываю через Eclipse, он генерирует папку testModule.jar вместо JAR-файла.

Но он работает при экспорте как WAR.

EDIT:

Чтобы заставить его работать с развертыванием Eclipse, вы должны проверить опцию в Glassfish 3.1.2 свойства: Развертывание в банке. Я думаю, что это последняя опция, реализованная в последней версии плагина. Видно на Кеплере, но не на Юноне.

+0

Благодарим вас за разъяснение рабочей структуры. Это действительно помогает мне. –

+0

Ты работал с Spring MVC? Можете ли вы предоставить мне ViewResolver bean config следовать этой структуре? – tranductrinh

1

Структура работает для меня

банку модуля (банку) enter image description here

основной модуль веб-приложение (война) enter image description here

И ViewResolver конфигурации (я использую Thymeleaf) :

@Bean 
public ServletContextTemplateResolver templateResolver() { 
    ServletContextTemplateResolver resolver = new ServletContextTemplateResolver(); 
    resolver.setPrefix("/WEB-INF/template/"); 
    resolver.setSuffix(".html"); 
    resolver.setTemplateMode("HTML5"); 
    resolver.setOrder(1); 
    return resolver; 
} 
2

Я сделал это с помощью решения Vivin. Вот структура папок моего JAR в Eclipse.

enter image description here

В комплекте баночку в WEB-INF/Lib папку моего WAR:

enter image description here

добавил также следующее в моем pom.xml войны:

<configuration><packagingIncludes>WEB-INF/lib/*.jar</packagingIncludes> 
</configuration> 

Включен jsp в мой веб-проект, используя:

<jsp:include page="/myService.jsp" flush="true" />