`

为什么说Servlet是单实例的

 
阅读更多


 单实例让我联想到去年《设计模式》课上的“单例模式”,但现在要说的内容却和它无关,为什么说“Servlet是单实例的呢?”,我们来看一个示例程序:

package cn.edu.ynu.test;
 
import java.io.IOException;
import java.io.PrintWriter;
 
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
public class SingleInstance extends HttpServlet {
private int a = 0;
 
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
int b = 0;
a ++;
b++ ;
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html><head><title>Single Instance Test</title></head>");
out.println("<body>");
out.println("a = " a "<br>");
out.println("b = " b);
out.println("</body></html>");
}
 
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
}
 
}
在该Servlet中,a是一个实例变量,而b则是一个方法里面的局部变量,第一次运行这个Servlet得到的结果为:


 
 
这个是可以理解呢,因为a和b在初始化后都执行了加1的操作,但是第二次执行这个Servlet会出现什么结果呢?
答案是a = 2 b= 1,看下列截图:
 

 
 
解释:当我第一次调用这个Servlet的时候,服务器就会创建一个该Servlet(示例中为SingleInstance)的一个实例(也就是一个对象),此时a和b初始化为0,并且a和b分别执行了加1的操作;而当我们第二次调用该Servlet时,因为Servlet是单实例的,这说明,此时已经有一个SingleServlet的实例,所以实例变量a不在执行初始化,而b因为是一个方法里的局部变量,所以会再次初始化为0,故而在a、b分别执行加1之后,a和b的值分别为2和1。
  • 大小: 18.1 KB
  • 大小: 18 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics