Servlet与JSP学习笔记(二) Servlet核心(上)

这里又把教材换成了孙卫琴老师的《Tomcat与Java Web开发技术详解》。兜了一圈后发觉这本书真是好。Runoob 太浅,《Head First Servlets and JSP》节奏又太慢,也远离应用。而《Tomcat》这本书虽然没有用Eclipse, 但有结构完整的代码,用Sublime当作项目串起来,跟用Eclipse没有什么代沟。

容器与Web应用及上下文的关系

我觉得这是Servlet最核心的地方。

  • Tomcat就是容器,其它替代者有Jetty、JBoss等等。

  • JavaWeb应用就是包含了一组Servlet、JSP、HTML等各种文件的一个集合。就是一定要在WEB-INF 目录下有个web.xml文件。

下图的Tomcat的组成结构刚好可以解释Java web里面最常见的一些概念:

Servlet与JSP学习笔记(二) Servlet核心(上)

  • 顶层的Server元素代表Tomcat容器

  • 一个Server可以包含多个Service组件

  • 一个Service里面可以有多个负责接受与响应客户请求的Connector组件

  • 一个Service只能包含一个Engine组件

  • 一个Engine组件可以包含多个虚拟主机(Host)组件(localhost是默认创建的主机,你还可以创建更多的虚拟主机,并且只要把DNS指向这台机器,就可以访问这个虚拟主机的URL)

  • 一个Host组件可以包含多个Context。一个Context就代表一个Web应用。

容器在启动一个Web应用时就创建一个ServletContext对象和这个应用对应起来,并且这个对象和Web应用的生命周期一致。因此,可以利用这个对象来存储全局数据。

Servlet API与Servlet 生命周期

Sun公司(现在的Oracle)为javax.servlet.Servlet接口定义了5个方法。其中的3个方法由Servlet容器调用:

  • init()方法: 负责初始化Servlet对象。容器在创建好Servlet对象后,就会调用该方法。

  • service()方法:负责响应客户端的请求。容器收到客户端请求后,就会调用对应Servlet对象的service()方法。

  • destroy()方法:负责释放Servlet对象占用的资源。容器在销毁Servlet对象之前调用该方法。

另外两个方法在这里不是很重要。下面来说一下Servlet的生命周期:

  1. 初始化阶段:容器加载Servlet类,创建对象,并调用其init()方法。只有在Servlet被第一次请求时,或者Servlet配置了 <load-on-startup>元素, Servlet会被初始化。

  2. 运行时阶段:Servlet被初始化之后,就可以通过service()方法重复接受不同的请求。每次的参数ServletRequest和ServletResponse对象会重新创建和销毁。

  3. 销毁阶段:当Web应用被终止时,容器会先调用所有Servlet对象的destroy()方法,再销毁这些对象。

Web应用的生命周期

  1. 启动阶段:加载Web应用的数据,创建ServletContext对象,对Filter和一些Servlet进行初始化。

  2. 运行阶段:所有的Servlet都处于待命状态,随时可以响应客户端的请求。

  3. 终止阶段:销毁各种对象和资源。