其他分享
首页 > 其他分享> > 动力节点 SpringMVC P33-43

动力节点 SpringMVC P33-43

作者:互联网

哔哩哔哩视频链接
笔记参考链接

(一)解读中央调度器处理的<url-pattern

1、在web.xml中,在没有特殊要求的情况下,springmvc 的中央调度器 DispatcherServlet 的< url-pattern/ >常使用后缀匹配方式,如写为 *.do 或者 *.action , *.mvc 等。

tomcat本身能处理静态资源的访问,像html,图片,js文件等都是静态资源。
这是因为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>

这个名叫 default 的 servlet 作用:
1)处理静态资源
2)处理未映射到其它servlet的请求

在我们项目的web.xml文件中,如果将<url-pattern属性值由*.do改为“/”,那么将无法访问静态资源,可以访问动态资源。

1.1 第一种静态资源处理方式

怎么样才能让它能访问静态资源和动态资源呢?
(1)在springmvc.xml文件中添加:

<mvc:annotation-driven/>
<mvc:default-servlet-handler/>

(2)在MyController中还要使用@Responsebody注解

2、项目代码
(1)复制一份代码并更改名为ch05 url-pattern,修改了index.jsp,MyController类。在webapp文件夹下新建images目录,里面放了一些图片;新建html文件夹,里面放了一个test.html。
(2)将web.xml中的<url-pattern属性值改为/:

<servlet-mapping>
        <servlet-name>myweb</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

(3)在springmvc文件中添加:

<mvc:default-servlet-handler/>

但是这样的话会默认也把dosome的请求也交给default,所以还要加上:

<mvc:annotation-driven/>

另外,在MyController中还要使用@Responsebody注解。
(4)运行:
成功访问图片!
在这里插入图片描述
动态资源dosome请求正常!
在这里插入图片描述
网页正常显示!
在这里插入图片描述

1.2 第二种静态资源处理方式

1、要在springmvc.xml中同时添加<mvc:resources 标签和<mvc:annotation-driven标签才能同时访问静态资源和动态资源。

 <!--第二种处理静态资源的方式
        mvc:resoures加入后框架会创建ResourceHttpRequestHandler这个处理器对象
        让这个对象处理静态资源的访问,不依赖tomcat服务器。
        mapping:访问静态资源的url地址,使用通配符**,表示这个文件夹下面的所有目录
        location:静态资源在你的项目中的目录位置 当前主目录是webapp

        images/**:表示images/p1.jpg,images/user/logo.gif等
    -->
    <mvc:resources mapping="/images/**" location="/images/" />
    <mvc:resources mapping="/html/**" location="/html/" />
    <mvc:resources mapping="/js/**" location="/js/" />

    <!--mvc:resources和@RequestMapping有一定的冲突-->
    <!--添加注解驱动-->
    <mvc:annotation-driven/>

2、上面这种方式有些繁琐我们一般将静态资源放在static目录下(在webapp右键新建static文件夹),简化为

<mvc:resources mapping="/static/**" location="/static/" />
<!--添加注解驱动-->
<mvc:annotation-driven/>

这时index.jsp中就要将图片的地址改一下:

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

3、运行如下:
能成功显示图片!
在这里插入图片描述以及动态资源:
在这里插入图片描述
输入localhost/ch05_url_pattern/static/html/test.html能成功访问静态网页!

(二)第二章小结

在这里插入图片描述在这里插入图片描述

(三)绝对路径和相对路径

1、地址分类
在这里插入图片描述
2、使用相对地址时可能出现的问题已经解决方案
(1)如果index.jsp中如果访问请求user/some.do前面没有斜杠,那么访问地址就是参考地址+资源组成了路径。
不加斜杠的地址可能导致一种问题:就是当到底一个地址后又回去再点击,可能会多出现前面的user/,导致地址找不到。
那么解决办法只有两种:
在这里插入图片描述
(2)如果index.jsp中如果访问请求/user/some.do前面有斜杠,那么读取资源的时候就会以localhost:8080作为主地址,再加/user/some.do,这样是找不到地址的。解决方案:在资源地址前加${pageContext.request.contextPath}标签。
在这里插入图片描述

(3)写一下三种方式的代码
针对(2)中提到的不加斜杠的方式的解决办法:
1、加入${pageContext.request.contextPath}标签:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <p>第一个springmvc项目</p>
    <p><a href="${pageContext.request.contextPath}/user/some.do">发起some.do的get请求</a></p>
</body>
</html>   

2、在<head部分加一个base标签即可:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <base href="http:localhost:8080/ch06 path"/>
</head>
<body>
    <p>第一个springmvc项目</p>
    <p><a href="user/some.do">发起some.do的get请求</a></p>
</body>
</html>    

3、但base标签要求应用的网址是固定的,因为已经在页面中写死了。如果网址变更,那么又可能找不到地址了。因此又有另一种方法,可以动态获取当前的应用网址:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
    String basePath = request.getScheme() + "://" +
            request.getServerName() + ":" + request.getServerPort() +
            request.getContextPath() + "/";
 %>
<html>
<head>
    <title>Title</title>
    <base href="<%=basePath%>"/>
</head>
<body>
    <p>第一个springmvc项目</p>
    <p><a href="user/some.do">发起some.do的get请求</a></p>
</body>
</html> 

标签:xml,do,SpringMVC,43,springmvc,地址,P33,静态,资源
来源: https://blog.csdn.net/qq_44629163/article/details/123621757