Java 使用SpringMVC在jar文件中显示jsp页面

Java 使用SpringMVC在jar文件中显示jsp页面,java,spring,spring-mvc,jsp,war,Java,Spring,Spring Mvc,Jsp,War,我正在使用SpringMVC3.2.2用java开发一个web应用程序。从jar文件中加载jsp页面时遇到问题 Sring MVC web应用程序具有以下结构: |-META-INF |-WEB-INF |-spring | |- app-config.xml |-classes |-lib | |-external.jar | |-WEB-INF | | |-views | |

我正在使用SpringMVC3.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中的Config

    <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);
}
@控制器
公共类外部控制器{
受保护的最终日志记录器=LogFactory.getLog(getClass());
@请求映射(value=“/external.htm”)
公共模型和视图HandlerRequest(HttpServletRequest请求,HttpServletResponse响应)
抛出ServletException、IOException{
Map myModel=newhashmap();
myModel.put(“msg”,“外部页面加载”);
返回新模型和视图(“外部”、“模型”、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>

Springapp
springapp
org.springframework.web.servlet.DispatcherServlet
上下文配置位置
/WEB-INF/spring/app-config.xml
1.
上下文配置位置
/WEB-INF/spring/app-config.xml
springapp
*.htm

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

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

   @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);
}
  • 将所有JSP放在JAR的
    META-INF/resources
    目录中
  • META-INF
    中包含
    web fragment.xml
    文件。这类似于典型的
    web.xml
    ,但有一些不同。有关详细信息,请参阅。我还发现了一个例子。这是可选的
  • 把你的JAR放在战争的
    WEB-INF/lib

现在,您应该能够在应用程序的上下文中引用这些JSP。基本上,
META-INF/resources
被映射到Web应用程序的文档根目录。查看以了解更多详细信息。请记住,这不仅限于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/
    test/
        ...
    META-INF/
        MANIFEST.MF
    WEB-INF/
        spring/
            ... spring configs ...
        views/
            test.jsp
        lib/
            testModule.jar
        web.xml
testProject.war

    test/
        TestModule.class
    META-INF/
        resources/
            WEB-INF/
                views/
                    testModule.jsp
        MANIFEST.MF
        web-fragment.xml (empty)
    WEB-INF/
        lib/
    test/
        ...
    META-INF/
        MANIFEST.MF
    WEB-INF/
        spring/
            ... spring configs ...
        views/
            test.jsp
        lib/
            testModule.jar
        web.xml
在Glassfish 3.1.2中,Servlet 3.0不处理Eclipse部署场景中的片段可能很重要(它可能在JBoss或其他版本中工作,有待确认)。实际上,我在testProject.war的部署程序集中设置了testModule.jar,当我通过Eclipse部署时,它会生成一个文件夹testModule.jar,而不是一个jar文件

但它在作为战争出口时起作用

编辑:

要使它与Eclipse部署一起工作,您必须选中Glassfish 3.1.2属性中的一个选项:Deployasjar。我认为这是最近在上一个插件版本中实现的一个选项。在开普勒上可见,但在朱诺上不可见。

结构适合我

jar模块(jar)

主要web应用程序模块(war)

和viewsolver配置(我使用的是Thymeleaf):


我是用维文的溶液做的。下面是Eclipse中我的JAR的文件夹结构

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

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

 <configuration><packagingIncludes>WEB-INF/lib/*.jar</packagingIncludes>
 </configuration>
WEB-INF/lib/*.jar
将jsp包含在我的Web项目中,使用:

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


这非常有效,应该是公认的答案。感谢您解释工作结构。这对我真的很有帮助。你和Spring MVC合作过吗?你能给我提供遵循这个结构的viewsolver bean配置吗?