注意:servlet的程序不参与底层数据的收发,或者说不控制

servlet的service方法调用在图中哪里?
包含在ApplicationFilterChain的internalDoFilter方法中。
servlet程序处理请求指的是什么?
根本上servlet程序做的工作就是,根据Request的信息,填充Response信息而已。
servlet程序与Spring MVC是什么关系?
Spring MVC底层还是Serlvet,它是把所有请求都用一个servlet处理,这个servlet叫做DispatcherServlet,而它又把请求分发给对应的@RequestMapping标注的方法进行处理。整体上来说就是完成一个service方法的调用。
那MVC的返回页面,返回REST数据是怎么回事?
返回页面就是把页面数据写入到响应Body中;@ResponseBody注解,实际上就是把@RequestMapping标注的方法的返回值转为JSON字符串写入到响应Body中。这里的响应Body指的就是前文中的OutputBuffer.
Tomcat与Servlet程序的职责
《How Tomcat works》中讲到,Servlet容器(Tomcat就是一种Servlet容器)的任务有概括地讲有三个
1.创建一个Request对象,并填充相关信息(parameters、headers、cookie、uri等)
2.创建一个Response对象
3.调用与此请求关联的Servlet的service方法,把Request和Response传给它。
这里我用自己的话讲一下:当浏览器向服务端发来一个请求时,服务端会将请求数据报的内容解析出来,创建一个填充有请求信息的Request对象,同时创建一个"空的"Response对象,然后把这两个对象传给servlet的service方法,让它来完成Response对象的填充,最后把Response数据发送给客户端。
为什么要传Request对象?
你不传Request对象,Servlet程序就不知道该填充什么。换句话说,它不知道你到底想要什么资源。
Tomcat是如何找到请求关联的Servlet的?
我们知道,Tomcat在开发的时候不可能知道你会往它里面部署什么项目,servlet程序叫什么。所以它不可能硬编码来调用service方法,它所使用的就是反射机制。
想想在使用spring boot框架开发之前,我们是怎么部署项目的?就是把项目打包,然后放到Tomcat的webapp目录下。跑起来后,项目对应的URL就是localhost:8080/projectName/xxx这样是吧。而且,在项目中,不管是注解式的,还是web.xml式,都会配置Servlet程序的映射。把URL映射到某个Servlet类文件。
当请求来临时,先根据projectName找到对应项目,再根据后续的URL映射到对应的Servlet类名。之后Tomcat就会利用反射机制加载Servlet类文件,获取实例,然后再调用service方法。
coyote/Response、connector/Response、connector/ResponseFacade之间的关系?
coyote/Response主要就是跟底层的数据传递挂钩的,而connector/Response是coyote/Response的上层包装,它实现了HttpServletResponse接口。但是如果将它直接传给service方法,则害怕用户直接将HttpServletResponse强转为connector/Response,直接调用底层的一些方法。所以引入了一个使用"Facade模式",将connector/Response除了HttpServletResponse接口定义的public方法都屏蔽掉。也就是说,传递给service的实际上是connector/ResponseFacade对象,就算强转为实际类型,也只能看到HttpServletResponse接口定义的方法。









