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源码33tomcatweb.xml文件有servlettet 名称是 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.2defaultservlet功能:33-34Thedefaultservletforallwebapplications,thatservesstaticresources.Itprocessesallrequeststhatarenotmappedtootherservletswithservletmappings(definedeitherhereorinyourownweb.xmlfile).
1.处理静态资源
2.处理未映射到其他servlet的请求。
2.配置详解32-33添加布局和图片资源
2.1*.doSpringMVC的中央调度器DispatcherServlet没有特殊要求
经常使用后辍匹配的方法,如写作*.do或者*.action,*.mvc等。
2.2/34可以写为/,因为Dispatcherservlet将要求获取静态资源,例如.css、.js、.jpg、.png
获取其他资源的请求被视为普通的Controller请求。中央调度器将处理器映射器调用为
它找到了相应的处理器。当然也找不到,所以在这种情况下,所有的静态资源获取请求也是如此。
都会报404个错误。
2.2.使用斜杠详细说明”/“34”在您的项目中使用/,它将取代tomcat中的default。
Dispatcherservlet处理所有静态资源,DispatcherServlet在默认情况下没有处理静态资源的能力。无控制器对象可以处理静态资源的访问。因此,静态资源(html,js,图片,css)都是404.
动态资源someee.do可以访问,因为我们的程序中有Mycontroler控制器对象,可以处理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.静态资源访问344这并不意味着静态资源在写作/后无法访问。经过一些配置后,应该问一下
问题也可以解决。
3.1第一使用34-35声明后,springmvc框架将在容器中创建
defaultservlethttprequesthandler处理器对象。它将像检查员一样筛选进入dispatcherservlet的URL。如果发现是静态资源请求,请求将转移到web应用服务器的默认servlet。一般服务器都有默认的servlet。
在Tomcat中,有一个Servlet,专门用于处理静态资源访问,称为DefaultServlet。它是default。可以处理各种静态资源访问请求。该Servlet在Tomcat服务中注册
器的web.在Tomcat安装目录/conf/web.xml。
3.1.1案例34-35访问静态资源的方式:原理是:添加此标签后,框架将创建控制器对象DefaultServletHttpresthandler(类似于我们自己创建的Mycontroler).defaultservlethttprequesthandler可以将接收请求转发给tomcatdefaultservlet。
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与@requestmaping注释存在冲突,需要加入annotation-driven来解决问题,需要加入注释驱动来解决问题
<!-- 添加注解驱动 --><!-- default-servlet-handler 和 @Requestmaping注释 有冲突, 需要加入annnotation-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-38Spring3.0版本后,Spring定义了专门用于处理静态资源访问请求的处理器
ResourceHttpRequestHandler。并添加了解决静态资源无法访问问题的标签。以下形式的配置需要添加到springmvc配置文件中:
<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和@requestmaping有一定的冲突 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提示动态资源路径直接写成some38既然使用了/////
没有必要像以前那样访问动态资源.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>