使用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; }