4

我正在使用 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 中配置

    <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 页面时,spring 不想搜索它并显示错误 HTTP 404 - /springapp/WEB-INF/views/external.jsp

4

4 回答 4

19

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

  • 将所有 JSP 放入META-INF/resourcesJAR 目录中。
  • 将文件包含web-fragment.xmlMETA-INF. 这与典型的相似,但web.xml有一些不同。请参阅此处了解一些详细信息。还有一个我在这里找到的例子。这是可选的。
  • 将您的 JAR 放入您WEB-INF/lib的 WAR 中。

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

于 2013-07-09T20:27:44.160 回答
8

感谢 Vivin 的解决方案。它对我有用。

就我而言,我有:

测试模块.jar

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

测试项目.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 属性中的一个选项:部署为 jar。我认为这是在最后一个插件版本中实现的最新选项。在开普勒上可见,但在朱诺上不可见。

于 2013-11-27T11:18:42.290 回答
2

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

在此处输入图像描述

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

在此处输入图像描述

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

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

使用以下方法在我的 Web 项目中包含 jsp:

<jsp:include page="/myService.jsp" flush="true" />
于 2017-03-19T12:46:13.763 回答
1

结构对我有用

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

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

和 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;
}
于 2015-12-01T10:26:57.210 回答