1. Servlet 运行图
1) 建立连接
浏览器根据 IP 地址和端口号(port)和服务器建立连接
2) 打包
浏览器将请求数据按 HTTP 协议打成数据包 (http 请求数据包)
http 请求数据包包含“ helloweb/sayHello” (请求资源路径)
3) 发送请求
浏览器向服务器发送请求数据包
4) 创建 Request 对象
Servlet 引擎(Tomcat 负责通讯的模块)创建请求对象(Request),方便我们自定义的 Servlet获得请求数据包中的内容该对象符合 HttpRequest 接口
5) 创建 Response 对象
Servlet 引擎(Tomcat 负责通讯的模块)创建相应对象(Response)
该对象符合 HttpResponse 接口
6) 创建 HelloServlet 对象
服务器通过反射的方式创建 Servlet 实例
7) 调用 Servlet 实例的 service(request , response)方法
7.1)访问参数
在 service()方法中访问 Request 对象,获得用户提交的一些参数
7.2)处理结果
在 service()方法中将处理结果放入 Response 对象
8) 取数据
Servlet 引擎从 Response 对象中取出数据
9) 打包
Servlet 引擎将取出的数据打包,该数据包符合 http 协议要求
10) 发送响应
浏览器将响应数据包中的数据取出,生成界面
在程序开发过程中,我们只需要注意(7.1)从 Request 对象中访问参数、(7.2)将处理结果放置到 Response 对象中、(7.3)HelloServlet 实例处理这三部分即可。
2. Servlet 生命周期及核心接口与类
1) Servlet 接口
ü init(ServletConfig config)
ü destroy()
ü service(ServletRequest res,ServletResponse rep)
1) GenericServlet 抽象类
实现了 Servlet 接口中的 init、destroy 方法。
2) HttpServlet 抽象类
继承了 GenericServlet,实现了 service 方法。
3) ServletRequest 与 ServletResponse 接口
4) HttpServletRequest 与 HttpServletRequest 接口
5) ServletConfig 接口
String getInitParameter(String paraName);
3. Servlet 的生生命周期
所谓生命周期,指的是 servlet 容器如何创建 servlet 实例、分配其资源、调用其方法、并销毁其实例的整个过程。
阶段一:
实例化(就是创建 servlet 对象,调用构造器)在如下两种情况下会进行对象实例化。
第一种情况:
当请求到达容器时,容器查找该 servlet 对象是否存在,如果不存在,才会创建实例。
第二种情况:
容器在启动时,或者新部署了某个应用时,会检查 web.xml 当中,servlet 是否有 load-on-starup 配置。如果有,则会创建该 servlet 实例。 load-on-starup 参数值 越小,优先级越高(最小值为 0,优先级最高)。
阶段二:
初始化为 servlet 分配资源,调用 init(ServletConfig config);方法config 对象可以用 来访问 servlet 的初始化参数。初始化参数是使用 init-param 配置的参数。init 可以 override。
阶段三:
就绪/调用
有请求到达容器,容器调用 servlet 对象的 service()方法。
HttpServlet 的 service()方法,会依据请求方式来调用 doGet()或者 doPost()方法。
但是,这两个 do 方法默认情况下,会抛出异常,需要子类去 override。
阶段四:
销毁
容器依据自身的算法,将丌再需要的 servlet 对象删除掉。在删除之前,会调用 servlet 对象的 destroy()方法。destroy()方法用于释放资源。在 servlet 的整个生命周期当中,init,destroy 只会执行一次,而 service 方法会执行多次。
4. 重定向
1) 什么是重定向?
服务器向浏览器发送一个状态码 302 及一个消息头 location,浏览器收到后,会立即向 location 所指向的地址发送请求。
2) 如何重定向
response.sendRedirect(String url); 其中,url 是重定向的地址。
3) 编程要注意的问题
ü 重定向之前,不能够有 out.close()或者 out.flush()操作。
ü 重定向之前,如果 response 对象缓存有数据,则这些数据会被清空。
4) 重定向的特点
ü 重定向的地址是任意的
ü 重定向之后,浏览器地址栏的地址变成了 location 所指定的地址。
5. 转发
1) 什么是转发?
一个 web 组件(jsp/servlet)将未完成的处理转交给另一个 web 组件继续处理。转发的各个组件会共享 request 和 response 对象。
2) 如何转发?
step1
先绑订数据
request.setAttribute(String name,Object obj);
跟绑订相关的另外两个方法
//如果 name 对应的值不存在,返回 null。
Object request.getAttribute(String name);
request.removeAttribute(String name);
step2
获得转发器,转发
RequestDispatcher rd = request.getRequestDispatcher(String uri);
rd.forward(request,response);
3) 编程中要注意的问题
转发之前,不能够执行 out.close 戒者 out.flush。
转发之前,会将 response 中缓存的数据先清空。
4) 转发的特点
a. 转发的目的地只能是同一个应用内部的某个组件
b. 转发之后,浏览器地址栏的地址没有变化
c. 转发所涉及的各个组件可以共享同一个 request,response 对象