Spring MVC - 对静态资源的HTTP GET请求由自定义servlet处理

时间:2011-10-29 14:46:02

标签: spring model-view-controller servlets resources static

我正在处理映射所有请求的代理servlet。 我用以下方式指定了web.xml:

<servlet>
    <servlet-name>appServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>appServlet</servlet-name>
    <url-pattern>/admin/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>appServlet</servlet-name>
    <url-pattern>/home</url-pattern>
</servlet-mapping>

<servlet>
    <description>Servlet to proxy all requests.</description>
    <display-name>ProxyServlet</display-name>
    <servlet-name>ProxyServlet</servlet-name>
    <servlet-class>com.epam.alpha.servlets.ProxyServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>ProxyServlet</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

<welcome-file-list>
    <welcome-file>home</welcome-file>
</welcome-file-list>

这样所有请求都由我的代理servlet处理,除了为主页和管理页面保留的/ home和/ admin / *。这很好用!

现在,我想在我的jsp页面中使用javascript和css文件。它们位于资源文件夹下,因此它们位于正确的位置。

在servlet-context.xml中给出以下内容:

<resources mapping="/resources/**" location="/resources/" />

问题是我的servlet捕获了对静态资源的所有GET请求。如果我注释掉ProxyServlet的servlet映射,那么找到并使用资源,当然代理servlet在这种情况下不起作用。另一方面,如果我没有从jsp引用javascript文件,则代理servlet可以工作(不会发生静态资源请求)。救命啊!

1 个答案:

答案 0 :(得分:0)

我已经能够通过Spring控制器提供页面,并使用类似的配置通过此页面加载JS脚本:

  • 调度程序servlet
  • 映射到/(代理servlet)的servlet

我必须

  • 将path / resources / *映射到web.xml中的调度程序servlet(除了其他映射之外)
  • 使用以下spring上下文文件:

servlet的context.xml中:

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p" 
    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-3.0.xsd
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context-3.0.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">

    <context:component-scan base-package="fr.free.jnizet.springtest"/>
    <mvc:annotation-driven/>
    <mvc:resources location="/resources/**" mapping="/resources"/>
    <mvc:default-servlet-handler/>
</beans>

关键点是<mvc:default-servlet-handler/>元素。没有这个元素,Spring在/ resources /.

中找不到JS文件的任何映射