servlet01 项目demo、servlet生命周期
1 环境说明
jdk: 1.8
tomcat: 8.0
2 项目demo
2.1 新建一个动态的web项目
2.2 新建一个servlet类
该类必须继承 HttpServlet
技巧01:HttpServlet 继承自 Servlet
技巧02:@WebServlet("/ServletDemo01") 的作用是设置访问路径,当然也可以在web.xml文件中进行设置;web.xml中的设置方式如下(本实例利用的是前者)
<servlet> <!-- 当前servlet的名称 --> <servlet-name>HelloServlet</servlet-name> <!-- servlet所在的包名跟类名 --> <servlet-class>servlet_demo.controller.ServletDemo01</servlet-class> </servlet> <servlet-mapping> <!-- 必须于上一个servlet标签中的名称保持一致 --> <servlet-name>HelloServlet</servlet-name> <!-- 这是你在浏览器上访问的地址,必须要提 /servlet/xxxx 格式,不然tomcat启动会报错--> <url-pattern>/servlet/helloWorld</url-pattern> </servlet-mapping>
package servlet_demo.controller; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class ServletDemo01 */ @WebServlet("/ServletDemo01") public class ServletDemo01 extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public ServletDemo01() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // TODO Auto-generated method stub PrintWriter out = resp.getWriter(); out.println("hello world,servlet"); out.close(); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub } }
2.3 将项目添加到Tomcat中
前提:在eclipse中设置了Tomcat 参考文档:点击前往
2.4 启动Tomcat
2.5 浏览器访问
http://127.0.0.1:8080/servlet_demo/ServletDemo01
2.6 参考博文
servlet工作原理:点击前往
2.7 baseDemo
3 Servlet生命周期
Servlet是一个供其他Java程序(Servlet引擎)调用的Java类,它不能独立运行,它的运行完全由Servlet引擎来控制和调度。针对客户端的多次Servlet请求,通常情况下,服务器只会创建一个Servlet实例对象,也就是说Servlet实例对象一旦创建,它就会驻留在内存中,为后续的其它请求服务,直至web容器退出,servlet实例对象才会销毁。
技巧01:在Servlet的整个生命周期内,Servlet的init方法只被调用一次。而对一个Servlet的每次访问请求都导致Servlet引擎调用一次servlet的service方法。对于每次访问请求,Servlet引擎都会创建一个新的HttpServletRequest请求对象和一个新的HttpServletResponse响应对象,然后将这两个对象作为参数传递给它调用的Servlet的service()方法,service方法再根据请求方式分别调用doXXX方法。
技巧02:当多个客户端并发访问同一个Servlet时,web服务器会为每一个客户端的访问请求创建一个线程,并在这个线程上调用Servlet的service方法,因此service方法内如果访问了同一个资源的话,就有可能引发线程安全问题。
3.1 init()
技巧01:init() 默认是在第一次调用 Servlet 时被执行,也可以指定在容器启动时被执行
init 方法被设计成只调用一次。它在第一次创建 Servlet 时被调用,在后续每次用户请求时不再调用。因此,它是用于一次性初始化,就像 Applet 的 init 方法一样。Servlet 创建于用户第一次调用对应于该 Servlet 的 URL 时,但是您也可以指定 Servlet 在服务器第一次启动时被加载。当用户调用一个 Servlet 时,就会创建一个 Servlet 实例,每一个用户请求都会产生一个新的线程,适当的时候移交给 doGet 或 doPost 方法。init() 方法简单地创建或加载一些数据,这些数据将被用于 Servlet 的整个生命周期。
3.2 service()
service() 方法是执行实际任务的主要方法。Servlet 容器(即 Web 服务器)调用 service() 方法来处理来自客户端(浏览器)的请求,并把格式化的响应写回给客户端。每次服务器接收到一个 Servlet 请求时,服务器会产生一个新的线程并调用服务。service() 方法检查 HTTP 请求类型(GET、POST、PUT、DELETE 等),并在适当的时候调用 doGet、doPost、doPut,doDelete 等方法。
3.3 destroy()
destroy() 方法只会被调用一次,在 Servlet 生命周期结束时被调用。destroy() 方法可以让您的 Servlet 关闭数据库连接、停止后台线程、把 Cookie 列表或点击计数器写入到磁盘,并执行其他类似的清理活动。