生命周期演示代码
//@WebServlet(urlPatterns = "/retetion.let",loadOnStartup = 1)
public class RetetionServlet extends HttpServlet{
public RetetionServlet() {
System.out.println("实例化:"+this);
}
@Override
public void init() throws ServletException {
System.out.println("初始化回调init:"+this);
System.out.println("初始化参数name:"+getInitParameter("yh"));
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=UTF-8");
PrintWriter out = resp.getWriter();//获取字符输出流
out.println("<h1>提供服务</h1>"+Thread.currentThread().getName()+"<br/>"+this);
System.out.println("<h1>提供服务</h1>"+Thread.currentThread().getName()+"<br/>"+this);
out.flush();
out.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
@Override
public void destroy() {
System.out.println("销毁回调destroy:"+this);
}
}
web.xml
<servlet>
<servlet-name>RetetionServlet</servlet-name>
<servlet-class>com.yh.servlet.RetetionServlet</servlet-class>
<init-param>
<param-name>yh</param-name>
<param-value>zf</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
**加粗样式** <servlet-name>RetetionServlet</servlet-name>
<url-pattern>/retetion.let</url-pattern>
</servlet-mapping>
1.初始化阶段:
实例化 - Serlvet.init(SerlvetConfig) - GenericServlet.init() - 自定义的init
发生时间: 第一次访问Servlet的时候
可配置随Tomcat启动而初始化(在< servlet >添加一个< load-on- startup >标签,数值越小优先级越高(只包括正数),默认为0。)
**参数初始化(可有可无): **
init-param
2.提供服务阶段
Servlet.service - HttpServlet.doXXX
3.销毁阶段
javaEE容器(tomcat)关闭之前:destroy
代码进行调用时,init,Service等方法,都是从最顶级的Servlet接口开始调用,一级一级往下走,所以在写Servlet时不一定是要继承HttPServlet,也可继承其他的HttPServlet父类;只不过继承HttPServlet在进行方法书写是会简便一些,因为在HttPServlet对一些方法进行了处理
Servlet的族谱
- Servlet ServletConfig
- GenericServlet
- .HttpServlet
- 自定义的Servlet
注意:Serlvet是单实例多线程的
所以要注意一些线程安全问题