(转)springmvc中处理静态资源的多种方法

     2022-04-26     355

关键词:

处理静态资源,我想这可能是框架搭建完成之后Web开发的”头等大事“了。

因为一个网站的显示肯定会依赖各种资源:脚本、图片等,那么问题来了,如何在页面中请求这些静态资源呢?

还记得Spring MVC中的DispatcherServlet吗?它是Spring MVC中的前置控制器,若配置的拦截路径为“/”,那么所有的请求都将被它拦截。对静态资源的访问也属于一个请求,那么也会被它拦截,然后进入它的匹配流 程,我们知道它是根据HandlerMapping的配置来匹配的。而对于静态资源来说,默认的Spring MVC是没有注册匹配规则的,此时若你去请求一个静态资源,则会报404错误。

 

如何处理静态资源的请求呢?

根据上面介绍的,我们可以配置一个处理静态资源的HandlerMapping

<bean id="resourceHttpRequestHandler" class="org.springframework.web.servlet.resource.ResourceHttpRequestHandler"> 
    <property name="locations" value="classpath:/META-INF/resources/"></property>    
</bean> 
   
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> 
    <property name="mappings"> 
        <props> 
            <prop key="/resources/**">resourceHttpRequestHandler</prop> 
        </props> 
    </property> 
</bean>

其中ResourceHttpRequestHandler就是处理静态资源请求的类,当然如果你愿意,也可以自己尝试写一个。

不过现在这样自己写SimpleUrlHandlerMapping比较少了吧,项目中都是采用的注解配置,只不过是将匹配关系放到注解上

 

 

另外,还可以使用mvc命名空间的resources标签来配置

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

本质上也是把ResourceHttpRequestHandler注册到SimpleUrlHandlerMapping上。

 

 

还有别的方法来处理静态资源请求吗?

Spring MVC还提供了一个配置项:mvc:default-servlet-handler

这个标签对于匹配规则为"/"的DispatcherServlet才生效(因为别的匹配规则一般也不会拦截静态资源)。它会为DefaultServletHttpRequestHandler配置上"/**"的拦截规则和最低的匹配优先级。

DefaultServletHttpRequestHandler处理请求时会将其全部转发到容器的DefaultServlet上。因此它在 HandlerMapping必须是优先级最低的。如果你使用<mvc:annotation-driven>或你使用了自定义的 HandlerMapping实例,确保它们的order值比DefaultServletHttpRequestHandler小 (Integer.MAX)。

另外需要注意的是,这里寻找容器的DefaultServlet是用名字而不是路径。所以首先要搞清楚容器的DefaultServlet的名字, 当然一般主流容器的名字是无需指定的,比如Tomcat, Jetty, JBoss, and GlassFish等。若非常用容器,则可能需要手动指定:

<mvc:default-servlet-handler default-servlet-name="myCustomDefaultServlet"/>

这种方式也是依赖于容器的DefaultServlet的,那么我们是否能直接用容器的DefaultServlet来处理静态资源请求,而不是这样先通过Spring MVC来转发呢?(相比性能上会好很多),答案是肯定的。

 

比如我们将资源文件都放在resouces目录下,那么只需要在web.xml中配置:

<servlet-mapping> 
    <servlet-name>default</servlet-name> 
    <url-pattern>/resource/*</url-pattern> 
</servlet-mapping>

并将它放在所有Servlet的最前面(为了让它最先匹配),这样的话性能上应该比较好

但是这样还会有个问题,就是无法访问到classpath下的资源文件,看了tomcat的DefaultServlet的配置项,似乎也没有可以指定目录的地方。

 

所以,综上所述,性能最好的应该是直接利用容器的DefaultServlet,让它最先拦截静态资源请求,这样就避免了后续的转发等操作,提高了 性能,但是无法访问classpath下的资源文件。而通过mvc:resources标签可以简单配置匹配规则和资源文件路径,应该说是最简单快捷的一 种方式,当然这大概也是mvc命名空间设计的初衷。

另外,若想结合两者的话,自己倒是可以尝试写一个Servlet来处理,不过估计有难度且麻烦。

处理静态资源

   若将DispatcheServlet请求映射设置为/,则SpringMvc将捕获WEB容器的所有请求,包括静态资源的请求,SpringMvc会将它们当成一个普通的请求处理,那么将会出现因找不到对应的处理器将导致错误。可在SpringMvc的配置中配置&... 查看详情

springmvc处理请求释放静态资源的三种方式(代码片段)

方式一在SpringMVC的配置文件中添加如下语句<mvc:default-servlet-handler/>说明:当SpringMVC前端控制器对静态资源进行拦截后,在通过处理器映射器找不到相关处理器的情况下该请求会被tomcat中web.xml中默认配置的Servlet拦截。方式二S... 查看详情

处理静态资源

...源会有问题存在一般将DispatcherServlet请求映射配置为/,则SpringMVC将捕获当作一个普通请求处理,所以就会找不到对应的处理器发生错误3.如何解决?可以在SpringMVC配置文件中配置<mvc:default-servlet-handler/>的方式解决静态资源问题... 查看详情

springmvc访问静态资源的三种方式(转)

本文转自:http://www.iigrowing.cn/springmvc_fang_wen_jing_tai_zi_yuan_de_san_zhong_fang_shi.html如何你的DispatcherServlet拦截*.do这样的URL,就不存在访问不到静态资源的问题。如果你的DispatcherServlet拦截“/”,拦截了所有的请求,同时对*.js,*.j 查看详情

springmvc的静态资源拦截器怎么配置

...初学者基本上使用1,2,3方案:所有请求全部拦截,都在springmvc处理,静态资源如下配置<mvc:resourcesmapping="/images/**"location="/images/"cache-period="31556926"/> 所有请求全部拦截,但是在web.xml中添加对静态... 查看详情

SpringMVC:@RequestMapping 和静态资源服务的优先级

】SpringMVC:@RequestMapping和静态资源服务的优先级【英文标题】:SpringMVC:Theprecedenceof@RequestMappingandStaticResourceserving【发布时间】:2016-03-0904:13:26【问题描述】:我对控制器处理程序方法有以下映射:@RequestMapping(value="login.html")public... 查看详情

springmvc和springboot静态资源处理详细总结(代码片段)

SpringMVC和springboot静态资源处理详细总结springmvc1)采用<mvc:default-servlet-handler/>2)采用<mvc:resources/>示例:springboot1)webapp目录下的资源文件2)springboot默认的静态资源目录:3& 查看详情

静态资源处理

 为什要处理静态资源呢?因为我们使用了springmvc框架,springmvc框架的流程我们都知道,它的核心处理器(dispacherSerlet)拦截所有url,通过组件handlerMapping的映射使访问的url和对应的controller(adapterHandler,我们写的控制器)匹... 查看详情

springmvc静态资源处理

<!--不处理静态内容--><mvc:default-servlet-handler/><!--前端控制器,哪些静态资源不拦截--><mvc:resourceslocation="/css/"mapping="/css/**"/><mvc:resourceslocation="/images/"mapping="/images/**"/> 查看详情

springmvc返回json数据以及文件上传过滤静态资源

...把数据处理好并通过相应的接口返回数据给前端即可。在SpringMVC中,我们可以通过@ResponseBody注解来返回JSON数据或者是XML数据。这个注解的作用是将控制器方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response... 查看详情

springboot静态资源处理

...置的地方可以通过配置文件修改。但是如果你想完全控制SpringMVC,你可以在@Configuration注解的配置类上增加@EnableWebMvc,增加该注解以后WebMvcAutoCo 查看详情

springmvc访问静态资源的三种方式

如果你的DispatcherServlet拦截*.do这样的URL,就不存在访问不到静态资源的问题。如果你的DispatcherServlet拦截“/”,拦截了所有的请求,同时对*.js,*.jpg的访问也就被拦截了。 目的:可以正常访问静态文件,不要找不到静态... 查看详情

springmvc访问静态资源的三种方式

  如何你的DispatcherServlet拦截*.do这样的URL,就不存在访问不到静态资源的问题。如果你的DispatcherServlet拦截“/”,拦截了所有的请求,同时对*.js,*.jpg的访问也就被拦截了。 方案一:激活Tomcat的defaultServlet来处理静态... 查看详情

解决springmvc拦截器拦截静态资源的两种方式

1、是采用<mvc:default-servlet-handler/>,(一般Web应用服务器默认的Servlet名称是"default",所以这里我们激活Tomcat的defaultServlet来处理静态文件在web.xml中配置<servlet-mapping>    <servlet-name>default</servlet- 查看详情

springmvc访问静态资源的问题,.js.jpg.css

如果你的DispatcherServlet拦截*.do这样的URL,就不存在访问不到静态资源的问题。如果你的DispatcherServlet拦截“/”,拦截了所有的请求,同时对*.js,*.jpg的访问也就被拦截了。方案一:激活Tomcat的defaultServlet来处理静态文件Xml代码 ... 查看详情

springmvc异常处理

SpringMVC异常处理 由David发表在天码营 SpringMVC框架提供了多种机制用来处理异常,初次接触可能会对他们用法以及适用的场景感到困惑。现在以一个简单例子来解释这些异常处理的机制。假设现在我们开发了一个博客应用... 查看详情

springmvc程序中怎么得到静态资源文件css,js,图片文件的路径问题

问题描述在用springmvc开发应用程序的时候。对于像我一样的初学者,而且还是自学的人,有一个很头疼的问题。那就是数据都已经查出来了,但是页面的样式仍然十分简陋,加载不了css.js,图片等资源文件,如果你输入某个css的... 查看详情

springmvc静态资源访问问题(代码片段)

刚开始使用springmvc,出现了各种意想不到的问题。今天遇到了一个:在springmvc下静态资源无法被前端访问到,出现这种问题的原因如下:在web.xml中配置springmvc的DispatcherServlet一般如下: <servlet> <servlet-na... 查看详情