Servlet之ServletContext

来源:互联网 发布:埃迪 琼斯数据 编辑:程序博客网 时间:2024/04/29 02:12
Servlet容器在启动时会加载Web应用,并为每个Web应用创建唯一的ServletContext对象。可以把ServletContext看成是一个Web应用的服务器端组件的共享内存。在ServletContext中可以存放共享数据,它提供了4个读取或设置共享数据的方法。

1)setAttribute(String name,Object object):把一个对象和一个属性名绑定,将这个对象存储在ServletContext中;

2)getAttribute(String name):根据指定的属性名返回所绑定的对象;

3)removeAttribute(String name):根据给定的属性名从ServletContext中删除相应的操作;

4)getAttributeNames():返回Enumeration对象,它包含了存储在ServletContext对象中的所有属性名。

下面通过一个例子,说明ServletContext和Web应用的关系。

package mypack;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;

public class CounterServlet extends HttpServlet
{
 public static final String CONTENT_TYPE="text/html;charset=GB2312";

 public void init(ServletConfig config)throws ServletException{
  super.init(config);
 }

 public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{
  doPost(request,response);
 }

 public void doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{
  //获得ServletContext的引用
  ServletContext context=getServletContext();
  //从ServletContext读取count属性
  Integer count=(Integer)context.getAttribute("count");

  //如果count属性还没有设置,那么创建count属性,初始值为0
  //one and add it to the ServletContext
  if(count==null){
   count=new Integer(0);
   context.setAttribute("count",new Integer(0));
  }

  response.setContentType(CONTENT_TYPE);
  PrintWriter out=response.getWriter();
  out.println("<HTML>");
  out.println("<HEAD><TITLE>点击计数</TITLE></HEAD>");
  out.println("<BODY>");
  //输出当前的count属性值
  out.println("<P>当前计数是:"+count+"</P>");
  out.println("</BODY></HTML>");

  //创建新的count对象,其值增1
  count=new Integer(count.intValue()+1);
  //将新的count属性存储到ServletContent中
  context.setAttribute("count",count);
 }
 public void destroy(){
 }
}

在web.xml中为CounterServlet类加上<servlet>和<servlet-mapping>元素

  <servlet>
   <servlet-name>CounterServlet</servlet-name>
   <servlet-class>mypack.CounterServlet</servlet-class>
  </servlet>
  <servlet-mapping>
   <servlet-name>CounterServlet</servlet-name>
   <url-pattern>/counter</url-pattern>
  </servlet-mapping>

测试通过。

1)刷新页面,count加1;

2)关闭浏览器,再打开新浏览器还是在原来基础上加1(即便由IE换成Opera);

3)如果重启Tomcat服务器,再访问CounterServlet,则count又初始化为0;

4)复制helloapp应用,改为helloapp1,再发布helloapp1,通过不同的浏览器窗口分别访问helloapp及helloapp1中的CounterServlet,发现这两个Web应用拥有各自独立的count属性。

即ServletContext对象只在Web应用被关闭时才被销毁;不同的Web应用,ServletContext各自独立存在。 

原创粉丝点击