一、Tomcat的大体结构以及运行流程
https://blog.csdn.net/w1992wishes/article/details/79242797
https://blog.csdn.net/xlgen157387/article/details/79006434
二、Tomcat和Servlet的关系
我们知道,Servlet是运行在Web容器里的,Tomcat作为容器的一种,在这里自然也要大概说说两者之间的大致关系-子弹和枪的关系
首先,Tomcat是Web应用服务器,是一个Servlet/JSP容器。它负责处理客户请求,把请求传送给Servlet,并将Servlet的响应传回给客户。而Servlet是运行在支持Java语言的服务器上的组件。
从HTTP协议中的请求和响应就可以得知,浏览器发出的请求是一个请求文本,而浏览器接收到的也应该是一个响应文本。而在Web服务器中,容器将其分别封装成了对象,以便于我们进行操作:
- Tomcat将HTTP请求文本 接收并解析,然后封装成HttpServletRequest类型的request对象,所有的HTTP头数据读取可以通过request对象调用对应的方法查询到;
- Tomcat同时将响应的信息封装为HttpServletResponse类型的response对象,通过设置response属性就可以控制要输出到浏览器的内容,然后将response交给Tomcat,Tomcat就会将其变成响应文本的格式发送给浏览器。
1、请求对象的由来
Servlet类中我们往往要覆盖两个方法,doGet()和doPost(),而它们都有两个参数,分别是HttpServletRequest和HttpServletResponse,分别为请求和响应。实际上,这两个类型都是接口,具体的实现类实际上是由容器实现的,其实也就是我们上面已经说明了的,是由Tomcat服务器将请求和响应进行了分别的封装,然后拿给我们使用。
我们可以使用System.out.println方法分别打印doGet和doPost方法中的形参request和response,你可以在控制台看到:
- org.apache.catalina.connector.RequestFacade
- org.apache.catalina.connector.ResposneFacade
2、响应重定向和请求转发
我们知道,请求到达Servlet之后,往往还需要进一步的跳转到其他页面,在Servlet中有两种跳转方式:
- 响应重定向
- 请求转发
(1)、响应重定向:
当client向server发送一个请求,要求获取一个资源时,在server接收到这个请求后发现请求的这个资源实际存放在另一个位置,于是server在返回的response中写入那个请求资源的正确的URL,并设置reponse的状态码为301(表示这是一个要求浏览器重定向的response),当client接受到这个response后就会根据新的URL重新发起请求。重定向有一个典型的特症,即当一个请求被重定向以后,最终浏览器上显示的URL往往不再是开始时请求的那个URL了(浏览器地址会变化)。
可以粗俗的理解为:重新给的方向,所以URL是变化了。
HttpServletResponse中定义了响应重定向的方法 sendRedirect(String path),该方法向目标资源重新发送请求,生成新的响应,并且:
- 重定向使用GET方式提交
- 重定向生成的是新的请求,所以当前请求中的数据不会随着新的请求而传递
(2)、请求转发
它指的是服务器在处理request的过程中将request先后委托多个Servlet或JSP接替进行处理的过程。
最为常见的是先由一个Servlet处理(比如实现业务逻辑的计算),然后forward给一个JSP进行视图的渲染,或者forward给另一个Servlet 进一步处理。使用服务器端重定向,浏览器地址不会发生变化。因为浏览器只执行了对某个页面A的请求,而这个页面的服务器内部的跳转(或许还经过了页面B和页面C的处理)情况浏览器是不知道的,它只知道自己获得的响应是A页面发回来的,甚至不知道服务器中有多个Servlet处理。
可以粗俗的理解为:类似我们转发东西,东西还是原来的东西,没有变化,所以浏览器地址不会发生变化。
在Servlet中,要先使用HttpServletRequest请求中的 getRequestDispatcher(String path) 获取请求转发器对象,然后调用该对象的 forward(request, response) 方法进行跳转。
往往以连写的方式,如下示例:
request.getRequestDispatcher(String path).forward(request, response);
https://www.cnblogs.com/deng-cc/p/7462858.html