我正在使用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
答案 0 :(得分:19)
如果您使用的是Servlet 3.0,则可以执行此操作。但是,它不适用于打包JSP的方式。您必须以特定方式将资源打包到JAR文件中:
META-INF/resources
目录中。web-fragment.xml
中加入META-INF
个文件。这类似于典型的web.xml
,但有一些差异。有关详细信息,请参阅here。还有一个我找到here的例子。这是可选的。WEB-INF/lib
。 现在,您应该可以在应用程序的上下文中引用这些JSP。基本上META-INF/resources
映射到您的webapp的文档根目录。请查看this了解更多详情。请记住,这不仅限于JSP。您可以在其中放置图像,JavaScript甚至CSS。
答案 1 :(得分:8)
感谢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
可能很重要的是,在Glassfish 3.1.2中,Servlet 3.0 不处理Eclipse部署方案中的片段(它可能适用于JBoss或其他工作,需要确认)。实际上,我在testProject.war的部署程序集中设置了testModule.jar,当我通过Eclipse部署时,它会生成一个文件夹testModule.jar而不是JAR文件。
但是当它作为WAR导出时它正在工作。
修改强>
要使其与Eclipse部署一起使用,您必须检查Glassfish 3.1.2属性中的选项:Deploy as jar。我认为这是最近一个插件版本中实现的最新选项。在开普勒可见但在朱诺上没有。
答案 2 :(得分:2)
我是使用Vivin的解决方案做到的。这是我在Eclipse中的JAR的文件夹结构。
将jar包含在WAR的WEB-INF / lib文件夹中:
还在我的pom.xml中添加了以下内容:
<configuration><packagingIncludes>WEB-INF/lib/*.jar</packagingIncludes>
</configuration>
使用以下命令在我的Web项目中包含jsp:
<jsp:include page="/myService.jsp" flush="true" />
答案 3 :(得分:1)