package com.emetacenter.sysadmin;/**
 * <p>Title: </p>
 * <p>Description: </p>
 * <p>Copyright: Copyright (c) 2004</p>
 * <p>Company: </p>
 * @author not attributable
 * @version 1.0
 */
public class LogContext {
  public static final int ACTION_LOGIN = 1;
  public static final int ACTION_RESOURCE_ADD = 2;
  public static final int ACTION_RESOURCE_MODIFY = 3;
  public static final int ACTION_RESOURCE_PUBLISH = 4;
  public static final int ACTION_RESOURCE_CHECKOUT = 5;
  public static final int ACTION_RESOURCE_REMOVE = 6;
  public static final int ACTION_RESOURCE_EXPORT = 7;  public LogContext() {
  }  //线程共享变量
  //根据线程保存日志信息,每一线程保存各自的日志信息,不同线程中的日志信息除会话ID外可能相同。
  private static final ThreadLocal _log = new ThreadLocal();  public static void setLog(Log log) {
    _log.set(log);
  }  //提取参数集合对象
  public static Log getLog() {
   
    Log log = new Log();
    if (_log.get() != null) {
      Log _l = (Log) _log.get();
      log.setUserID(_l.getUserID());
      log.setUserName(_l.getUserName());
      log.setIpAddress(_l.getIpAddress());
    }
    return log;
  }}我在 登陆Servlet中已经set进对象的了  Log log = new Log();
        log.setUserID(userID);
        log.setUserName(user.getUserName());
        log.setIpAddress(request.getRemoteAddr());
        LogContext.setLog(log);请大家帮忙兄弟解决急用啊

解决方案 »

  1.   

    有时候我get()回来的对象里边的属性值是存在的和set()进去的是一样可有时get()出来的对象的属性为空了
      

  2.   

    试试改一下下面的方法
      public static Log getLog() {   
        Log log = (Log)_log.get();
        Log ll = new Log();
        if (log != null) {
          ll.setUserID(log .getUserID());
          ll.setUserName(log .getUserName());
          ll.setIpAddress(log .getIpAddress());
        }
        _log.set(log);
        return ll;
      }
      

  3.   

    这个和应用服务器的线程池有关,Servlet 规范并没有规定同一个 Session 下访问 Servlet 时总是由一个 Java 线程执行。一般应用服务器接到 Browse 的连接请求时,是从线程池中任意取出一个空闲线程来响应,这个线程不一定是访问登录 Servlet 时响应的线程,这时候 ThreadLocal 当然取不到内容了。奇怪,你为什么不用 HttpSession 的 setAttribute/getAttribute 容纳 Log 对象呢?
      

  4.   

    //ThreadLocal的set方法只能改变被initialValue()方法所赋的值
    public class LogContext {
          //..........
          private static Log nextLog = new Log();
          private static ThreadLocal _log = new ThreadLocal() {
             protected synchronized Object initialValue() {
                  return nextLog;
              }
          }; 
          //..........
    }
      

  5.   

    //还要修改setLog,getLog
    public class LogContext {
      //......
      public static void setLog(Log log) {
        nextLog = log;
        _log.set(nextLog);
      }
      //...
      public static Log getLog() {
        return _log.get() ;
      }
    }