使用Spring MVC在jar文件中显示jsp页面

我正在使用Spring MVC 3.2.2在java中开发一个Web应用程序。 我在jar文件中加载jsp页面时遇到问题。

Sring MVC Web应用程序具有以下结构:

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

在app-config.xml中进行配置

           

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 myModel = new HashMap(); myModel.put("msg", "External page loaded"); return new ModelAndView("external", "model", myModel); } 

}

web.xml文件

   Springapp  springapp org.springframework.web.servlet.DispatcherServlet  contextConfigLocation /WEB-INF/spring/app-config.xml  1   contextConfigLocation /WEB-INF/spring/app-config.xml   springapp *.htm   

当试图显示external.jsp页面时,spring不想搜索它并显示错误HTTP 404 – /springapp/WEB-INF/views/external.jsp

如果您使用的是Servlet 3.0,则可以执行此操作。 但是,它不适用于打包JSP的方式。 您必须以特定方式将资源打包到JAR文件中:

  • 将所有JSP放在JAR的META-INF/resources目录中。
  • META-INF包含web-fragment.xml文件。 这类似于典型的web.xml ,但有一些差异。 请看这里了解一些细节。 我在这里找到了一个例子。 这是可选的。
  • 将您的JAR放在WAR的WEB-INF/lib中。

现在,您应该可以在应用程序的上下文中引用这些JSP。 基本上, META-INF/resources被映射到webapp的文档根目录。 看看这个更多细节。 请记住,这不仅限于JSP。 您可以在其中放置图像,JavaScript甚至CSS。

感谢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 不会处理 Glassfish 3.1.2中的Eclipse部署方案中的碎片 (它可能在JBoss或其他工作中有效,有待确认)。 实际上,我在testProject.war的部署程序集中设置了testModule.jar,当我通过Eclipse部署时,它生成一个文件夹testModule.jar而不是JAR文件。

但是当它作为WAR导出时它正在工作。

编辑:

要使其与Eclipse部署一起使用,您必须检查Glassfish 3.1.2属性中的选项:Deploy as jar。 我认为这是最近一个插件版本中实现的最新选项。 在开普勒看到但在Juno上看不到。

我是用Vivin的解决方案做到的。 这是我在Eclipse中的JAR的文件夹结构。

在此处输入图像描述

在我的WAR的WEB-INF / lib文件夹中包含jar:

在此处输入图像描述

还在我的pom.xml中添加了以下内容:

  WEB-INF/lib/*.jar  

使用以下命令将jsp包含在我的Web项目中:

  

结构对我有用

jar模块(jar) 在此处输入图像描述

主要的web应用程序模块(战争) 在此处输入图像描述

和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; }