1. HttpServlet的继承关系
javax.servlet.servlet接口
↑
javax.servlet.GenericServlet抽象类
↑
javax.servlet.http.HttpServlet抽象子类
2. service生命周期相关方法
//javax.servlet.servlet接口:
void init(config); //1、初始化方法
void service(request,response); //2、服务方法
void destory();//3、销毁方法
默认情况下:
- 第一次接收请求时,这个servlet会调用init(),然后在调用service();
- 从第二次请求开始,每一次都是调用service();
- 当容器关闭时,其中的所有的servlet实例会被销毁,调用 destory();
- 好处:提高系统启动的速度
- 坏处:拖慢了第一次访问的速度
如果需要需要提高响应速度,我们应该设置Servlet的初始化时机,可以通过在web.xml中设置<load-on-startup>1</load-on-startup>
设置servlet的启动先后顺序,数字越小,启动越靠前,最小为0。
3. HttpServlet类的service方法
- String method=req.getMethod();获取请求的方式
- 各种if判断,根据请求方式不同,决定去调用不同的do方法
if (method.equals("GET")) {
this.doGet(req,resp);
} else if (method.equals("HEAD")) {
this.doHead(req, resp);
} else if (method.equals("POST")) {
this.doPost(req, resp);
} else if (method.equals("PUT")) {
}
HttpServlet中这些do方法默认都是405的实现风格-要我们子类去实现对应的方法,否则默认会报405错误,因此,我们在新建servlet时,我们才会去考虑请求方法,从而决定重写哪个do方法。
- 在HttpServlet这个抽象类中,do方法都差不多。
4. servlet的特点
servlet在容器中是单例的,线程不安全的。
尽量的不要在servlet中定义成员变量。如果不得不定义成员变量,那么不要去修改变量的值或根据成员变量的值做一些逻辑判断。