1 环境搭建
默认有一个servlet
package com.itmark.servletRecover01;
import java.io.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
@WebServlet(name = "helloServlet", value = "/hello-servlet")
public class HelloServlet extends HttpServlet {
private String message;
@Override
public void init() {
System.out.println("helloServlet初始化了");
message = "Hello World!";
}
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.setContentType("text/html");
// Hello
PrintWriter out = response.getWriter();
out.println("<html><body>");
out.println("<h1>" + message + "</h1>");
out.println("</body></html>");
}
@Override
public void destroy() {
System.out.println("helloServlet销毁了");
}
}
可以看到servlet的三个生命周期(出生——活着——死亡)相关的函数,void init(),void destroy(),doGet和doPost底层都是调用service()方法。点击访问这个servlet,可以看到servlet被初始化了因此它是懒加载。
容器关闭时候触发销毁生命周期函数
2 配置一个自定义Servlet
/**
* @author mark
* @date 2022年03月07日21:40
*/
public class MyController extends HttpServlet {
private int count;
@Override
public void init() throws ServletException {
System.out.println("MyController我被初始化了");
}
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("我现在有"+(count++)+"个美女微信");
}
@Override
public void destroy() {
System.out.println("MyController我被销毁了");
}
}
紧接着需要在web.xml中配置它
<servlet>
<servlet-name>myController</servlet-name>
<servlet-class>com.itmark.servletRecover01.controller.MyController</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>myController</servlet-name>
<url-pattern>/say</url-pattern>
</servlet-mapping>
启动并访问
http://localhost:8080/servletRecover01_war_exploded/say
此时发现多次请求共享了自定义Servlet的成员变量,而且在设计之初Servlet是单例的,如果在service中使用成员变量这就造成了多线程共享数据,所以在使用过程中尽量在service使用局部变量。
补充:
init()默认在第一次访问的时候才进行初始化,且只初始化一次,那么有没有办法让服务器启动的时候就初始化它呢?只需要配置一下load-on-startup即可。
配置项的取值只能是正整数(包括0),数值越小,表明创建的优先级越高
<servlet>
<servlet-name>myController</servlet-name>
<servlet-class>com.itmark.servletRecover01.controller.MyController</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
小结:servlet的生命周期,servlet的xml配置,servlet单例设计模式