Chinaunix首页 | 论坛 | 博客
  • 博客访问: 717289
  • 博文数量: 147
  • 博客积分: 6010
  • 博客等级: 准将
  • 技术积分: 1725
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-22 10:36
文章分类

全部博文(147)

文章存档

2011年(1)

2010年(1)

2009年(35)

2008年(110)

我的朋友

分类: Java

2009-03-01 17:06:58

 servlet高级开发:
servlet和jsp的多线程问题
servlet:
    在默认情况下,单个servlet实例可以处理多个并发请求
    在一个共享的servlet实例中多个线程的执行可能导致数据不一致
方法1:
   .通过同步crirical section能够避免不一致的后果
   .使用"sysnchronized"保护重要的程序代码
     使用同步序列化多个请求的实例:
      Object so=new Object();
      public void service(...request,....response){
        sysnchronized(so){
           ....在某时刻上只有一个线程执行这段代码
        }
      }
方法2:单线程模型
      .通过实现SingleThreadMode接口,可以保证只有一个线程执行Servlet的service()方法
      .weblogic server将从相同的servlets的池中获得一个servlet
      实现SingleThreadModel接口:
      public class MyServlet extends HttpServlet implements SingleThreadModel{
         public void service(...request,...response){
           ....只有一个线程能执行这段代码
         }
      }
jsp的多线程问题:
  .在默认的情况下,jsps能够接手来自不同客户的并发请求
  .对于Critial section中代码必须像servlet那样使用同步机制
  .在page指示中使用SingleThreadModel接口配置jsp
  单线程模型的jsp实例
  <%@ page isThreadSafe="false"%>
  .默认情况下isThreadSafe="true"
 
 
Servlet监听器用于监听一些重要事件的发生,监听器对象可以在事情发生前、发生后可以做一些必要的处理。下面将介绍几种常用的监听器,以及它们都适合运用于那些环境。

分类及介绍:(红色表示重要)

1.  ServletContextListener:用于监听WEB 应用启动和销毁的事件,监听器类需要实现javax.servlet.ServletContextListener 接口。

2.  ServletContextAttributeListener:用于监听WEB应用属性改变的事件,包括:增加属性、删除属性、修改属性,监听器类需要实现javax.servlet.ServletContextAttributeListener接口。

 

3.  HttpSessionListener:用于监听Session对象的创建和销毁,监听器类需要实现javax.servlet.http.HttpSessionListener接口或者javax.servlet.http.HttpSessionActivationListener接口,或者两个都实现。

4.  HttpSessionActivationListener:用于监听Session对象的钝化/活化事件,监听器类需要实现javax.servlet.http.HttpSessionListener接口或者javax.servlet.http.HttpSessionActivationListener接口,或者两个都实现。

5.  HttpSessionAttributeListener:用于监听Session对象属性的改变事件,监听器类需要实现javax.servlet.http.HttpSessionAttributeListener接口。

 

实现监听在线用户:

 

  1. import java.util.HashMap;
    import java.util.Map;
    import javax.servlet.http.HttpSessionAttributeListener;
    import javax.servlet.http.HttpSessionBindingEvent;
    import javax.servlet.http.HttpSessionEvent;
    import javax.servlet.http.HttpSessionListener;
  2. /**
     * Web application lifecycle listener.
     * @author Administrator
     */
  3. public class OnlineUserListener implements HttpSessionListener,HttpSessionAttributeListener {
     private static int activeSessions = 1;
     private static Map online=new HashMap();
     public static Map  getOnline() {
      return online;
     }
  4.  public static int getActiveSessions() {
      return activeSessions;
     }
  5.  public void attributeAdded(HttpSessionBindingEvent event) {
      if (event.getName().equals("userlogin")) {
       System.out.println("User logged in.");
       String username = (String)event.getSession().getAttribute("userlogin");
       online.put(event.getSession().getId(),username);
      }
     }
  6.  public synchronized void  attributeRemoved(HttpSessionBindingEvent event) {
      if (event.getName().equals("userlogin")) {
       online.remove(event.getSession().getId());
      }
     }
  7.  public void attributeReplaced(HttpSessionBindingEvent event) {
     }
  8.  public void sessionCreated(HttpSessionEvent event) {
      activeSessions++;
     }
  9.  public void sessionDestroyed(HttpSessionEvent event) {
      if (activeSessions > 0) {
       activeSessions--;
      }
     }
    }

web.xml配置:

<listener>
      <listener-class>mgc.listener.test.OnlineListener</listener-class>
  </listener>

 

 

阅读(1120) | 评论(1) | 转发(0) |
0

上一篇:视频总结-jdbc

下一篇:Hibernate模板

给主人留下些什么吧!~~

chinaunix网友2009-04-17 19:08:44

好!!!!太好了