Servlet 在部署后给用户访问一直到结束这个服务器关闭,或者 Servlet 类被替换,都只有一个 Servlet 对象,这个对象支配着全部用户的访问。
Servlet 的对象创建自第一个用户对此 Servlet 的访问,创建以后,就一直存在于服务器。
Servlet 的创建会首先调用其子类的构造函数,然后调用 init() 方法,实现初始化,init() 方法在 Servlet 生命周期中也只调用一次,接着调用 public service() 方法,public service() 方法分发客户浏览器的请求给 protected service() 方法,protected service() 方法接受来自 public service() 方法的标准 HTTP 请求,然后分发这些请求给相应的 doXxx() 方法处理。
可以参见 Servlet API:
可以通过覆盖那些方法进行验证:
1: import java.io.IOException; 2: 3: import javax.servlet.ServletException; 4: import javax.servlet.ServletRequest; 5: import javax.servlet.ServletResponse; 6: import javax.servlet.http.HttpServlet; 7: import javax.servlet.http.HttpServletRequest; 8: import javax.servlet.http.HttpServletResponse; 9: 10: public class LoginServlet extends HttpServlet { 11: 12: public LoginServlet() { 13: System.out.println("Constructor..."); 14: } 15: 16: @Override 17: protected void service(HttpServletRequest arg0, HttpServletResponse arg1) 18: throws ServletException, IOException { 19: super.service(arg0, arg1); 20: System.out.println("protected service"); 21: } 22: 23: @Override 24: public void service(ServletRequest arg0, ServletResponse arg1) 25: throws ServletException, IOException { 26: super.service(arg0, arg1); 27: System.out.println("public service"); 28: } 29: 30: @Override 31: public void init() throws ServletException { 32: super.init(); 33: System.out.println("init"); 34: } 35: 36: @Override 37: public void destroy() { 38: System.out.println("Destroyed..."); 39: } 40: 41: @Override 42: public void doGet(HttpServletRequest req, HttpServletResponse resp) 43: throws ServletException, IOException { 44: System.out.println("doGet"); 45: } 46: 47: @Override 48: public void doPost(HttpServletRequest req, HttpServletResponse resp) 49: throws ServletException, IOException { 50: doGet(req,resp); 51: } 52: 53: } .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }在配置好 web.xml 后,用浏览器首次访问,根据上面的分析,得到的结果应该是:
1: Constructor... 2: init 3: public service 4: protected service 5: doGet 然后的每次访问都是: 1: public service 2: protected service 3: doGet .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }但是,但是结果并非如此:
1: Constructor... 2: init 3: doGet 4: protected service 5: public service .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }以后的每次访问结果都是: 1: doGet 2: protected service 3: public service .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }为什么 public service 和 protected service 跑到后面去了呢?分析源代码应该能够找到答案,(⊙o⊙)…,Tomcat 中没有。
应该是 public service() 方法里面有个过程是要得到 protected service() 方法的反馈才继续的,同理 protected service() 方法中也要得到 doXxx() 方法的反馈才能继续。鄙人瞎猜,没有分析源码的胡乱解释。
---EOF---
那本 《Core Java 》我真的看不懂。
