我做了个非常简单的一个例子(这里我暂时用jsp当作servlet)
建立一个test.jsp,代码如下:
<%!String root;%>
<%=this.root%>
<%this.root = "123123";%>首先:我用A机器打开test.jsp,屏幕上应该打印出"null",因为String root 并被有设置值,但在打印出的同时root 被设置成为了"123123"
其次:我用B机器打开test.jsp,竟然直接就打印出"123123"。所以我就想请高手解答下 servlet的生命周期,这个servlet到什么时候才结束呢,为什么用B机器看到的不是"null",而是A机器设置的123123呢?这样给我的感觉有点像在application范围内设置值。小弟菜鸟,问出愚蠢的问题,还请原谅,真的想搞懂,非常感谢!

解决方案 »

  1.   

    public final class jsp1_jsp extends org.apache.jasper.runtime.HttpJspBase
        implements org.apache.jasper.runtime.JspSourceDependent {   String root;
      private static java.util.Vector _jspx_dependants;  public java.util.List getDependants() {
        return _jspx_dependants;
      }  public void _jspService(HttpServletRequest request, HttpServletResponse response)
            throws java.io.IOException, ServletException {
         ...
         out.print(this.root);
         this.root = "123123";

         ...
      }这个是你的jsp生成的对应的servlet的部分代码 . 
    重代码可以看到 String root;是类的成员 .  全局的. 在   _jspService 方法中 先输出root 的值然后 给root赋值. 所以第一次访问应该是为null 的 后面的几次 访问都只会执行 _jspService 方法 但这个 时候root 已经被赋了值 . 所以 就回输出"123123" 
      

  2.   

    ls正解,jsp/servlet默认是多线程的,在内存中只有一个实例,当多个用户请求时,容器会产生多个线程去响应它们。这里你第一次用a机器访问时因为<%! ....%>声明的是成员变量,多个线程都可以访问。而且你这个结果也不一定是一个为null,另一个不为null,有可能两个都为null。
      

  3.   

    <%!String root;%>这是jsp的声明,相当于建立了一个静态的变量。
    如果你用<%String root;%>,每次都是null.
    对于servlet到什么时候才结束,我认为只要你不关服务器或不调用destory就一直会存在