我正在使用 Spring MVC 3 开发一个 webapp,并DispatcherServlet像这样(web.xml)捕获所有对“/”的请求:
DispatcherServlet
<servlet> <servlet-name>app</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>app</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
现在这可以像宣传的那样工作,但是我该如何处理静态内容?以前,在使用 RESTful URL 之前,我会捕获所有 *.html 例如并将其发送到DispatcherServlet,但现在它是一个不同的球类游戏。
我有一个 /static/ 文件夹,其中包括 /styles/、/js/、/images/ 等,我想从DispatcherServlet.
现在,当我这样做时,我可以让静态资源正常工作:
<servlet-mapping> <servlet-name>app</servlet-name> <url-pattern>/app/</url-pattern> </servlet-mapping>
但我希望它有很好的 URL(我使用 Spring MVC 3 的重点)而不是登录页面 www.domain.com/app/
我也不想要与 tomcat 或任何其他 servlet 容器耦合的解决方案,因为这是(相对)低流量,我不需要前端的网络服务器(如 apache httpd)。
有一个干净的解决方案吗?
由于我在这个问题上花了很多时间,我想我会分享我的解决方案。从 spring 3.0.4 开始,有一个被调用的配置参数<mvc:resources/>(更多关于参考文档网站上的内容)可以用来提供静态资源,同时仍然在站点的根目录上使用 DispatchServlet。
<mvc:resources/>
为了使用它,请使用如下所示的目录结构:
src/ springmvc/ web/ MyController.java WebContent/ resources/ img/ image.jpg WEB-INF/ jsp/ index.jsp web.xml springmvc-servlet.xml
文件的内容应如下所示:
src/springmvc/web/HelloWorldController.java:
package springmvc.web; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class HelloWorldController { @RequestMapping(value="/") public String index() { return "index"; } }
网页内容/WEB-INF/web.xml:
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
网页内容/WEB-INF/springmvc-servlet.xml:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <!-- not strictly necessary for this example, but still useful, see http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-ann-controller for more information --> <context:component-scan base-package="springmvc.web" /> <!-- the mvc resources tag does the magic --> <mvc:resources mapping="/resources/**" location="/resources/" /> <!-- also add the following beans to get rid of some exceptions --> <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" /> <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"> </bean> <!-- JSTL resolver --> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> <property name="prefix" value="/WEB-INF/jsp/" /> <property name="suffix" value=".jsp" /> </bean> </beans>
网页内容/jsp/index.jsp:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <h1>Page with image</h1> <!-- use c:url to get the correct absolute path --> <img src="<c:url value="/resources/img/image.jpg" />" />