解读静态资源的访问
  TEZNKK3IfmPf 2023年11月13日 19 0

浏览器输入以下地址

http://localhost:8080/ch05_url_pattern/index.jsp :tomcat(jsp会转为servlet)

http://localhost:8080/ch05_url_pattern/js/jquery-3.4.1.js : tomcat

http://localhost:8080/ch05_url_pattern/images/p1.jpg : tomcat

http://localhost:8080/ch05_url_pattern/html/test.html: tomcat

http://localhost:8080/ch05_url_pattern/some.do :  DispatcherServlet(springmvc框架处理的)

tomcat本身能处理静态资源的访问, 像html, 图片, js文件都是静态资源

1.1 源码  33

tomcat的web.xml文件有一个servlet 名称是 default , 在服务器启动时创建的。
 <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>

	  <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>/</url-pattern>  表示静态资源和未映射的请求都这个default处理
    </servlet-mapping>

1.2 default这个servlet作用:   33-34

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).

1.处理静态资源

2.处理未映射到其它servlet的请求。

2. 配置详解  32-33

添加布局和图片资源

解读静态资源的访问

2.1  *.do

在没有特殊要求的情况下,SpringMVC 的中央调度器 DispatcherServlet 的

常使用后辍匹配方式,如写为*.do 或者 *.action, *.mvc 等。

2.2  /   34

可以写为/,因为 DispatcherServlet 会将向静态资源的获取请求,例如.css、.js、.jpg、.png

等资源的获取请求,当作是一个普通的 Controller 请求。中央调度器会调用处理器映射器为

其查找相应的处理器。当然也是找不到的,所以在这种情况下,所有的静态资源获取请求也

均会报 404 错误。

2.2.1 详细解释 使用斜杠 "/"   34

当你的项目中使用了  / ,它会替代 tomcat中的default。

导致所有的静态资源都给DispatcherServlet处理, 默认情况下DispatcherServlet没有处理静态资源的能力。没有控制器对象能处理静态资源的访问。所以静态资源(html,js,图片,css)都是404.

动态资源some.do是可以访问,的因为我们程序中有MyController控制器对象,能处理some.do请求。

保持的值为 *.do,扩展名方式,图片会正常显示。

解读静态资源的访问

index.jsp

<%--index.jsp页面的编写  32--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <script type="text/javascript" src="js/jquery-3.4.1.js"></script>
</head>
<body>
<form action="some.do" method="post">
    姓名:<input type="text" name="name"> <br/>
    年龄:<input type="text" name="age"> <br/>
    <input type="submit" value="提交参数">
</form>

<br/>
<img src="images/p2.jpg" alt="我是一个静态资源,不能显示">
</body>
</html>

将的值修改为 / ,则图片将无法显示。

web.xml

<servlet-mapping>
        <servlet-name>myweb</servlet-name>
        <!-- <url-pattern>*.do</url-pattern>-->
        <url-pattern>/</url-pattern>
    </servlet-mapping>

截图中的图片无法显示(因为图片为静态资源)

解读静态资源的访问

动态资源可访问

解读静态资源的访问

3. 静态资源访问  34

的值并不是说写为/后,静态资源就无法访问了。经过一些配置后,该问

题也是可以解决的。

3.1 第一使用 34-35

声 明 了  后 , springmvc 框 架 会 在 容 器 中 创 建

DefaultServletHttpRequestHandler 处理器对象。它会像一个检查员,对进入 DispatcherServlet的 URL 进行筛查,如果发现是静态资源的请求,就将该请求转由 Web 应用服务器默认的Servlet 处理。一般的服务器都有默认的 Servlet。

在 Tomcat 中,有一个专门用于处理静态资源访问的 Servlet 名叫 DefaultServlet。其为 default。可以处理各种静态资源访问请求。该 Servlet 注册在 Tomcat 服务

器的 web.xml 中。在 Tomcat 安装目录/conf/web.xml。

解读静态资源的访问

3.1.1 案例  34-35

访问静态资源的方式:  

       原理是: 加入这个标签后,框架会创健控制器对象DefaultServletHttpRequestHandler(类似我们自己创建的MyController). DefaultServletHttpRequestHandler这个对象可以把接收的请求转发给 tomcat的default这个servlet。

只需要在 springmvc.xml 中添加标签即可。

springmvc.xml

 <mvc:default-servlet-handler />

<mvc:default-servlet-handler/>表示使用 DefaultServletHttpRequestHandler 处理器对象。而该处理器调用了 Tomcat 的 DefaultServlet 来处理静态资源的访问请求。当然了,要想使用<mvc: …/>标签,需要引入 mvc 约束

解读静态资源的访问

访问http://localhost:8080/ch05_url_pattern/index.jsp 图片静态资源访问成功

解读静态资源的访问

访问http://localhost:8080/ch05_url_pattern/html/test.html 网页静态资源访问成功

解读静态资源的访问

但是我们的some.do请求范文失败

解读静态资源的访问

访问动态资源

因为default-servlet-handler 和 @RequestMapping注解 有冲突, 需要加入annotation-driven 解决问题,需要添加注解驱动解决

<!--    添加注解驱动 -->
<!-- default-servlet-handler 和 @RequestMapping注解 有冲突
, 需要加入annotation-driven 解决问题-->
    <mvc:annotation-driven />

MyController

// 研究中央调度器的url-pattern设置为 "/"   32
    @RequestMapping(value = "/some.do")
    public ModelAndView doReturnView(String name, Integer age){
        System.out.println("doSome, name="+name+"   age="+age);
        ModelAndView mv = new ModelAndView();
        mv.addObject("myname",name);
        mv.addObject("myage",age);
        mv.setViewName("show");
        return mv;
    }

show.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h3>/WEB-INF/view/show.jsp从request作用域获取数据</h3><br/>
    <h3>myname数据:${myname}</h3><br/>
    <h3>myage数据:${myage}</h3>
</body>
</html>

再次访问some.do请求,访问成功

解读静态资源的访问

3.2 第二使用 (必须掌握)  37-38

在 Spring3.0 版本后,Spring 定义了专门用于处理静态资源访问请求的处理器

ResourceHttpRequestHandler。并且添加了标签,专门用于解决静态资源无法访问问题。需要在 springmvc 配置文件中添加如下形式的配置:

<mvc:resources mapping="/images/**" location="/images/"/>
<mvc:resources mapping="/html/**" location="/html/"/>
<mvc:resources mapping="/js/**" location="/js/"/>

location 表示静态资源所在目录。当然,目录不要使用/WEB-INF/及其子目录。

mapping 表 示 对 该 资 源 的 请 求 

( 以 /images/ 开 始 的 请 求 , 如 /image/beauty.jpg , /images/car.png 等)。注意,后面是两个星号**。

3.2.1 案例

访问静态资源的方式  37

       mvc:resources 加入后框架会创建 ResourceHttpRequestHandler这个处理器对象。

       让这个对象处理静态资源的访问,不依赖tomcat服务器。

       mapping:访问静态资源的uri地址, 使用通配符 **

       location:静态资源在你的项目中的目录位置。

       images/**:表示 images/p1.jpg  , images/user/logo.gif

        , images/order/history/list.png

springmvc.xml

<mvc:resources mapping="/images/**" location="/images/"/>
<mvc:resources mapping="/html/**" location="/html/"/>
<mvc:resources mapping="/js/**" location="/js/"/>

index.jsp

<%--index.jsp页面的编写  32--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <script type="text/javascript" src="js/jquery-3.4.1.js"></script>
</head>
<body>
<form action="some.do" method="post">
    姓名:<input type="text" name="name"> <br/>
    年龄:<input type="text" name="age"> <br/>
    <input type="submit" value="提交参数">
</form>

<br/>
<img src="images/p3.jpg" alt="我是一个静态资源,不能显示">

<%--<img src="static/images/p1.jpg">--%>
</body>
</html>

test.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title   32</title>
</head>
<body>
    test.html 是一个静态资源, 网页内容hello, 第二种方法处理静态资源
</body>
</html>

图片和网页资源都正常访问到

解读静态资源的访问

解读静态资源的访问

访问动态资源   37-38

同样访问动态资源有问题,需要加注解驱动

解读静态资源的访问

springmvc.xml

<!--mvc:resources和@RequestMapping有一定的冲突  38-->
    <mvc:annotation-driven />

MyController

// 研究中央调度器的url-pattern设置为 "/"   32
    @RequestMapping(value = "/some.do")
    public ModelAndView doReturnView(String name, Integer age){
        System.out.println("doSome, name="+name+"   age="+age);
        ModelAndView mv = new ModelAndView();
        mv.addObject("myname",name);
        mv.addObject("myage",age);
        mv.setViewName("show");
        return mv;
    }

show.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h3>/WEB-INF/view/show.jsp从request作用域获取数据</h3><br/>
    <h3>myname数据:${myname}</h3><br/>
    <h3>myage数据:${myage}</h3>
</body>
</html>

解读静态资源的访问

因为上面要写很多的 标签,我们在WEB-INF下新建一个目录static将静态资源统一放进去

解读静态资源的访问

springmvc.xml

<!--使用一个配置语句,指定多种静态资源的访问  38-->
    <mvc:resources mapping="/static/**" location="/static/" />

index.jsp

<br>
<img src="static/images/p2.jpg">

解读静态资源的访问

3.3 小提示 动态资源路径直接写成some  38

既然使用了    /     /

动态资源的访问就不需要像以前一样some.do一样了,直接改成some就行了

MyController

@RequestMapping(value = "/some")
    public ModelAndView doReturnView(String name, Integer age){
        System.out.println("doSome, name="+name+"   age="+age);
        ModelAndView mv = new ModelAndView();
        mv.addObject("myname",name);
        mv.addObject("myage",age);
        mv.setViewName("show");
        return mv;
    }

index.jsp

<form action="some" method="post">
    姓名:<input type="text" name="name"> <br/>
    年龄:<input type="text" name="age"> <br/>
    <input type="submit" value="提交参数">
</form>

解读静态资源的访问

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月13日 0

暂无评论

推荐阅读
  TEZNKK3IfmPf   2024年03月30日   43   0   0 htmlhtml5
  TEZNKK3IfmPf   14天前   22   0   0 mvc
  TEZNKK3IfmPf   2024年04月26日   31   0   0 htmlScala
  TEZNKK3IfmPf   2024年03月29日   49   0   0 htmlhtml5
  TEZNKK3IfmPf   2024年03月29日   47   0   0 htmljQuery
TEZNKK3IfmPf