【SpringMVC06】SpringMVC处理静态资源

所谓的静态资源就是内容不会改变的资源,所有用户访问静态资源得到的响应都是一致的;与静态资源相对的是动态资源,动态资源就是Java程序(Servlet、JSP),不同的用户访问动态资源会得到不同的响应;

常见的静态资源有:html文件、js文件、css文件、图片文件、视频文件等;

1 访问静态资源的问题

创建几个静态资源以供访问:

html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>Hello !!!</h1>
</body>
</html>

css:

.acb{
    color: red;
}

启动服务器后访问,发现均不能访问到:

查看Idea的target文件夹,静态资源均存在:

2 问题原因

我们能够访问动态资源(Servlet)的原因是我们为其配置了url-pattern,但静态资源是不能配置url-pattern的,所以默认是访问不到的;

之前没有使用SpringMVC能够访问到是因为Tomcat配置文件中配置了一个全局的Servlet org.apache.catalina.servlets.DefaultServlet,查看Tomcat的conf目录下的web.xml可以看到:

<!-- The default servlet for all web applications, that serves static     -->
<!-- resources.  It processes all requests that are not mapped to other   -->
<!-- servlets with servlet mappings (defined either here or in your own   -->
<!-- web.xml file).  This servlet supports the following initialization   -->
<!-- parameters (default values are in square brackets):                  -->
......
<servlet>
    <servlet-name>default</servlet-name>
    <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
    <init-param>
        <param-name>debug</param-name>
        <param-value>0</param-value>
    </init-param>
    <init-param>
        <param-name>listings</param-name>
        <param-value>false</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
......
<!-- The mapping for the default servlet -->
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

这个Tomcat的默认Servlet的url-pattern被配置为/,是全局的默认Servlet,所以每一个项目中不能匹配的静态资源会由这个默认Servlet来处理,因而可以访问到静态资源;

但是在SpirngMVC中,我们配置了DispatcherServlet,也采用了/作为url-pattern,这就导致了Tomcat的默认Servlet失效,从而不能访问到静态资源:

<servlet>
    <servlet-name>mvc_qiang</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:mvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>mvc_qiang</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

3 解决方案

3.1 方案一:修改DispatcherServlet的url-pattern

这是最直接的解决方法,修改以后Tomcat的默认Servlet便会生效,这样就可以访问静态资源了;

例如:

<servlet>
    <servlet-name>mvc_qiang</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:mvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>mvc_qiang</servlet-name>
    <url-pattern>*.action</url-pattern>
</servlet-mapping>

修改以后表示SpringMVC前端控制器只会处理以.action结尾的请求,重启服务器后便可以访问静态资源:

但是,这样子修改的话会导致所有的访问handler的路径都需要以.action结尾,不然的话就不能访问,不方便;

@Controller
@RequestMapping("/action")
public class ActionController {
    @RequestMapping("test1.action")
    public String test1Action(){
        System.out.println("Hello test1.action");
        return "index";
    }

    @RequestMapping("test1")
    public String test1(){
        System.out.println("test1");
        return "index";
    }
}

如上,只能访问/action/test1.action的handler,不能访问/action/test1的handler:

3.2 方案二:配置默认handler

将web.xml配置修改回来:

<servlet>
    <servlet-name>mvc_qiang</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:mvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>mvc_qiang</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

在SpringMVC配置文件中配置一个默认handler:

<mvc:default-servlet-handler/>
  • 默认handler的requestMapping是/**,代表可以匹配到任意的请求

  • 默认handler的优先级是最低的,只有当其他配置好了的handler都匹配不上的时候才会来匹配这个默认的handler;

  • 默认handler的处理方式:将请求转发到tomcat中名为default的Servlet;

重启服务器访问静态资源:

3.3 方案三:配置静态资源访问路径

在SpringMVC配置文件中配置mvc:resources的标签:

<mvc:resources mapping="/html/**" location="/html/"/>
  • mapping="/html/**":mapping代表访问的请求路径,此处的含义是所有以/html/打头的请求;

  • location="/html/":mapping代表静态资源存放路径,此处的含义是将请求定位到项目的/html/文件夹下;

在/html/目录下新建一个html文件做测试:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>Hello in html directory</h1>
</body>
</html>

将Idea中的target目录删除,重启服务器访问:

版权声明:
作者:jackqiang
链接:http://www.jackqiang.com/framework/springmvc/2205/mvc_static/
来源:JackQiang's
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>
文章目录
关闭
目 录