JAVA基础(未看)读书笔记——《Tomcat与JavaWeb开发详解》

Servlet技术(上)

2019-11-15  本文已影响0人  So_ProbuING

Servlet技术(上)

Tomcat的<CATALINA_HOME>/lib/servlet-api.jar文件为Servlet API的类库文件。Servlet API主要由两个Java包组成:

Servlet接口

所有的Servlet类都必须实现这个接口,Servlet接口中定义了5个方法,其中3个方法都由Servlet容器来调用,容器会在Servlet的生命周期的不同阶段调用特定的方法

Servlet接口还定义了连个返回Servlet的相关信息的方法。Java Web应用中的程序代码可以访问Servlet的这两个方法,从而获取Servlet的配置信息以及其他相关信息:

GenericServlet抽象类

GenericServlet抽象类为Servlet接口提供了通用实现,GenerivcServlet除了实现Servlet接口,还实现了ServletConfig接口和序列化Serializable接口

HttpServlet抽象类

HttpServlet类是GenericServlet类的子类,HttpServlet类为Servlet接口提供了与HTTP协议相关的通用实现。HttpServlet对象社和运行在客户端采用HTTP协议通信的Servlet容器或Web服务器中。

HttpServlet为所有针对特定请求的方式的doXXX()方法提供了默认的实现。在HttpServlet类的默认实现中,doGET()、doPost()、doPut()和doDelete()都可以向客户端返回一个错误:

ServletRequest接口

Servlet接口的Service方法中有一个ServletRequest类型的参数。ServletRequest类表示来自客户端的请求。当Servlet容器接收到客户端要求访问特定Servlet的请求时,容器先解析客户端的原始请求数据,将它包装成一个ServlertRequest对象。当容器调用Servlet对象的service()方法时,就会把ServletRequest对象作为参数传给service()方法

HttpServletRequest接口

HttpServletRequest接口时ServletRequest接口的子接口,HttpServlet类的重载service()方法以及doGet()和doPost()等都有一个HttpServletRequest的形参

HTTPServletResponse接口

Servlet通过ServletResponse对象来生成响应结果,当Servlet容器接收到客户端要求访问特定Servlet的请求时,容器会创建一个ServletResponse对象,并传递给Servlet的service()方法

在Tomcat的实现中,如果Servlet的service()方法没有调用ServletOutputStream或PrintWriter的close()方法,那么Tomcat在调用完Servlet的service()方法后,会关闭ServletOutputStream或PrintWriter

HttpServletResponse接口

HttpServletResponse接口是ServletResponse的子接口。

HttpServletResponse接口提供了与HTTP协议相关的一些方法,Servlet可通过这些方法来设置HTTP响应头或客户端写Cookie

ServletConfig接口

当Servlet容器初始化一个Servlet对象时,会为这个Servlet对象创建一个ServletConfig对象。ServletConfig对象中包含了Servlet的初始化参数信息,ServletConfig还与当前Web应用的ServletContext对象关联。Servlet容器调用Servlet对象的init(ServletConfig config)方法时,会把ServletConfig对象作为参数传给Servlet对象。

HttpServlet继承GenericServlet类,GenericServlet实现ServletConfig接口,因此在HttpServlet类或GenericServlet类以及子类中都可以直接调用ServletConfig接口中的方法

ServletContext接口

ServletContext是Servlet与Servlet容器之间进行通信的接口,Servlet容器在启动一个Web应用时,会为它创建一个ServletContext对象。每个Web应用都有唯一的ServletContext对象。Servlet对象们可以通过这个类来访问Servlet容器中的各种资源

1. 用于在Web应用范围内存取共享数据

2. 访问当前Web应用的资源

3. 访问Servlet容器中的其他Web应用

4. 访问Servlet容器的相关信息

5. 访问服务器端的文件系统资源

6. 输出日志

JavaWeb应用的生命周期

Java Web应用的生命周期是由Servlet容器来控制,Java Web应用的生命周期包括三个阶段

启动阶段

Servlet容器在启动JavaWeb应用时,会完成以下操作

  1. 把web.xml文件中的数据加载到内存中
  2. 为JavaWeb应用创建一个ServletContext对象
  3. 对所有的Filter进行初始化,Filter的初始化是在JavaWeb容器启动时完成的
  4. 对需要在Web应用启动时就初始化的Servlet进行初始化。

运行时阶段

在这个阶段,它的所有Servlet都处于待命状态,随时可以响应客户端的特定请求,提供相应的服务。如果客户端请求的Servlet还不存在,Servlet容器会先加载并初始化Servlet,然后再调用它的service()服务方法

终止阶段

Servlet容器在终止JavaWeb应用时,会完成以下操作

  1. 销毁JavaWeb应用中所有处于运行时状态的Servlet。
  2. 销毁JavaWeb应用中所有处于运行状态的Filter
  3. 销毁所有与JavaWeb应用相关的对象,如ServletContext对象等,并且释放Web应用所占用的相关资源

Servlet的生命周期

初始化阶段

  1. Servlet容器加载Servlet类,把它的.class文件中的数据读入到内存中
  2. Servlet容器创建ServletConfig对象。
  3. Servlet容器创建Servlet对象
  4. Servlet容器调用Servlet对象的init方法

经过初始化步骤创建了Servlet对象和ServletConfig对象,并且Servlet对象与ServletConfig对象关联,而ServletConfig对象与当前Web应用的ServletContext对象关联。当Servlet容器初始化完Servlet后,Servlet对象只要通过getServletContext() 就能得到当前Web应用的ServletContext对象

Servlet进入初始化阶段的情况

  1. 当Web应用处于运行时阶段,Servlet被客户端首次请求访问,Servlet会被Servlet容器初始化
  2. 如果在web.xml中为Servlet设置了<load-on-startup>元素,当Servlet容器启动Servlet所属的Web应用时,就会初始化这个Servlet
  3. Web应用被重新启动时,Web应用中的所有Servlet都会重新初始化

运行时阶段

在这个阶段中,Servlet可以随时响应客户端的请求,当Servlet容器接收到要求访问特定Servlet的客户请求,Servlet容器创建针对于这个请求的ServletRequest对象和ServletResponse对象,然后调用相应的Servlet对象的service()方法。service()方法从ServletRequest对象中获得客户请求信息并处理该请求,通过ServletResponse对象生成响应结果。

销毁阶段

当Web应用被终止时,Servlet容器会先调用Web应用中所有Servlet对象的destroy)方法,然后再销毁这些Servlet对象。在destory()方法的实现中,可以释放Servlet所占用的所有资源。

容器还会销毁与Servlet关联的ServletConfig对象

ServletContext与Web应用范围

当Servlet容器在启动一个Web应用时,会为它创建唯一的ServletContext对象。当Servlet容器终止一个Web应用时,就会销毁它的ServletContext对象、

Web应用范围的含义

特点

常用API

ServletContextListener 监听器

Servlet API中有ServletContextListener接口,它能够监听ServletContext对象的生命周期。当Servlet容器启动或终止Web应用,会触发ServletContextEvent事件,该事件由ServletContextListener处理

防止页面被客户端浏览器缓存

浏览器为了快速向用户展示所请求的页面,会将来自服务器端的网页存放在客户端的缓存中。如果浏览器的缓存中已经存在该网页,那么浏览器只需从缓存中获取该网页,而不再请求服务器上的网页

但是有一些情况我们不希望数据被浏览器缓存

服务器端的HttpServlet可通过设置特定HTTP响应头来禁止客户端缓存网页

response.setHeader("Cache-Control","no-cache");
或者
response.setHeader("Expires","0");

Expires用于设定网页过期的时间,如果为0,表示立即过期

上一篇下一篇

猜你喜欢

热点阅读