这里又把教材换成了孙卫琴老师的《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里面最常见的一些概念:
顶层的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的生命周期:
初始化阶段:容器加载Servlet类,创建对象,并调用其init()方法。只有在Servlet被第一次请求时,或者Servlet配置了 <load-on-startup>元素, Servlet会被初始化。
运行时阶段:Servlet被初始化之后,就可以通过service()方法重复接受不同的请求。每次的参数ServletRequest和ServletResponse对象会重新创建和销毁。
销毁阶段:当Web应用被终止时,容器会先调用所有Servlet对象的destroy()方法,再销毁这些对象。
Web应用的生命周期
启动阶段:加载Web应用的数据,创建ServletContext对象,对Filter和一些Servlet进行初始化。
运行阶段:所有的Servlet都处于待命状态,随时可以响应客户端的请求。
终止阶段:销毁各种对象和资源。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。