1. 发起的请求是由哪些服务器程序处理的。33
浏览器输入以下地址
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>