SpringMVC静态资源访问


一,SpringMVC静态资源拦截问题

SpringMVC的工作机制是:来自浏览器的所有访问都会被前端控制器(DispatcherServlet)捕获,然后前端控制器把请求转交给处理器映射(HandlerMapping),HandlerMapping为请求分配对应的控制器(Controller)进行请求处理。

<servlet>
        <servlet-name>springMVCservlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
        <load-on-startup>1load-on-startup>
    servlet>
    <servlet-mapping>
        <servlet-name>springMVCservlet-name>
        <url-pattern>/url-pattern>
    servlet-mapping>

通过上面的配置,DispatcherServlet将捕获Web容器所有请求,包括静态资源请求。

通过学习HTTP协议我们知道,浏览器访问服务器的一个页面,实际上是包含了很多次请求的。除了请求页面本身,页面上的图片,js等静态资源也是通过请求资源在服务器上的相对地址实现的。但是SpringMVC的环境下,对静态资源的请求也会被前端控制器捕获,并转交给处理器映射。由于我们的代码中不会有对应的控制器处理请求,因此请求无法被相应,导致网页无法加载静态资源。

如上图:当跳转到页面之后,页面会请求静态资源。。。

二,解决静态资源拦截问题

方法一:采用

<mvc:default-servlet-handler default-servlet-name="default"/>*(涉及spring-mvc.xml和web.xml)

在Springmvc-servlet.xml中配置后,会在SpringMVC上下文中定义一个org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler,它会像一个检查员,对进入DispatcherServlet的URL进行筛查,如果发现是静态资源请求,就将该请求转由Web服务器(Tomcat)默认的Servlet处理,如果不是静态资源请求,才由DispatcherServlet继续处理。

一般Web应用服务器默认的servlet名称是“default”,因此DefaultServletHttpRequestHandler可以找到它。如果你的Web应用服务器的默认servlet名称不是default,则需要通过default-servlet-name属性显式指定,在spring-mvc.xml中配置启用默认Servlet:

<mvc:default-servlet-handler default-servlet-name="Web服务器使用的Servlet名称" />

在web.xml中增加对静态资源的处理,比如:

<servlet-mapping>
  <servlet-name>defaultservlet-name>
  <url-pattern>*.jsurl-pattern>
  <url-pattern>*.cssurl-pattern>
  <url-pattern>/assets/*"url-pattern>
  <url-pattern>/images/*url-pattern>
servlet-mapping>

注意:如果使用这种方法,在页面中静态资源的地址需要使用项目的绝对路径。。。 在jsp页面中使用el表达式 ${pageContext.request.contextPath}

方法二:采用 (涉及spring-mvc.xml)

,由springMVC框架自己处理静态资源,并可以添加一些有用的附加功能。

首先,允许静态资源放在任何地方,如WEB-INF目录下、类路径下等,你甚至可以将JavaScript等静态文件打到JAR包中。通过location属性指定静态资源的位置,由于location属性是Resources类型,因此可以使用诸如"classpath:"等的资源前缀指定资源位置。传统Web容器的静态资源只能放在Web容器的根路径下,完全打破了这个限制。

location:本地静态资源所在的目录 ,mappping:将静态资源映射到制定的路径下 

<body background="img/timg.jpg" style=" background-repeat:no-repeat ;>

注意:所有img/XXX  的静态资源的请求 都会到location下去找对应的资源。。。。

方法三 





TRANSLATE with x English
Arabic Hebrew Polish
Bulgarian Hindi Portuguese
Catalan Hmong Daw Romanian
Chinese Simplified Hungarian Russian
Chinese Traditional Indonesian Slovak
Czech Italian Slovenian
Danish Japanese Spanish
Dutch Klingon Swedish
English Korean Thai
Estonian Latvian Turkish
Finnish Lithuanian Ukrainian
French Malay Urdu
German Maltese Vietnamese
Greek Norwegian Welsh
Haitian Creole Persian  
Bing Webmaster Portal Back