SOS
我在tomcat启动时自动加载了一个类businessDataInit,目的是为了把一些数据存到内存中,是用一个MAP存放的,但是后面取出来的是空,后来我在这个类里面定义了一个静态变量a,在init()方法里面给这个变量a赋值为333,最后取出来的还是默认值0,谁知道是为什么吗?这段代码在tomcaty启动的时候确实是执行过的,因为我以debug方式启动的时候打断点看了下面是代码private static Map<String,String> paramMap = new HashMap<String, String>();
private static int a = 1;public void init(){
     try {
     super.init();
     businessDataInit.a = 333;
businessDataInit.paramMap.put("obj1", "小刚");
businessDataInit.paramMap.put("obj2", "小明");
} catch (ServletException e) {
e.printStackTrace();
}
    }

解决方案 »

  1.   

    部署没有问题,tomcat启动正常
      

  2.   

    你确定 init() 方法执行过了么?建议增加点日志来跟踪,如果嫌麻烦就直接:System.out.println(businessDataInit.paramMap.get("obj1"));另外,要严格检查下是否有别的地方对 paramMap 重新赋了个 new HashMap();
      

  3.   

    这个是我刚加的一些输出,在启动tomcat时就有打印这些信息
    2012-7-18 21:51:11 org.apache.catalina.startup.HostConfig deployDirectory
    信息: Deploying web application directory H:\apache-tomcat-7.0.23\webapps\docs
    a赋值前=1
    a赋值后=3333333
    2012-7-18 21:51:11 org.apache.catalina.startup.HostConfig deployDirectory
    信息: Deploying web application directory H:\apache-tomcat-7.0.23\webapps\examples
    2012-7-18 21:51:11 org.apache.catalina.core.ApplicationContext log
    信息: ContextListener: contextInitialized()
      

  4.   

    将其定义为 final 再试试看:private static final Map<String,String> paramMap = new HashMap<String, String>();
      

  5.   

    谢谢你,定义成final不就是常量了?是这样的,每次取出来的都是初始化的那个值,如果我初始化a这个值是10,取出来的就是10,感觉赋值没起作用
      

  6.   

    还有你要每个对象的a的值不一样为什么会定义成static的
    static是类级别的变量,你每次改回导致所有的对象都改掉这个值的啊
      

  7.   

    我是这样取值的        @Test
    public void test() {
    System.out.println(businessDataInit.getA());
    System.out.println(businessDataInit.getParammap().get("obj1"));
    //System.out.println(ContextUtil.aaa);
    //System.out.println(ContextUtil.getApplicationContext());
    }我也有试过把这两个静态变量定义为public,直接拿类名去取,结果也是一样
      

  8.   

    很可能,看楼主的代码和他描叙,有疑问, businessDataInit是什么东东,一个普通的类,还是servlet,如果是servlet,为何代码有businessDataInit.a = 333;难道你又new出来一个businessDataInit吗???,可否把代码贴完整
      

  9.   

    谢谢楼上的帮忙看,businessDataInit是一个servlet,我就是想让tomcat启动时加载一些数据到内存
      

  10.   

    这是一个完整的Servlet,我最初是做spring的ApplicationContext注入的,但是取出来一直是NULL,所以就随便写了这个来测试一下取出静态变量package net.common.servlet;import java.util.HashMap;
    import java.util.Map;import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;import org.springframework.context.ApplicationContext;
    import net.common.util.ContextUtil;//目的是为了在tomcat启动时加载一些公用的数据到内存
    public class businessDataInit extends HttpServlet {

    private static Map<String,String> paramMap = new HashMap<String, String>();

    private static int a = 1;  public static int getA() {
    return a;
    } public static Map<String, String> getParammap() {
    return paramMap;
    } public static void setA(int a) {
    businessDataInit.a = a;
    } public businessDataInit() {
            super();
        }    public void init(){
         try {
         super.init();
         System.out.println("a赋值前="+a);
         businessDataInit.a = 3333333;
         System.out.println("a赋值后="+a);
    businessDataInit.paramMap.put("obj1", "小刚");
    businessDataInit.paramMap.put("obj2", "小明");
    } catch (ServletException e) {
    e.printStackTrace();
    }
        } }
    web.xml配置就不用了吧,就一句话,这个类在启动的时候是肯定走了的
      

  11.   

    从你这段看出了一些规范上的问题,其他的应该没问题啊!那个调用的地方的完整代码页贴出来看看吧。我建议啊  类型首字母还是大写的好,不然容易误会,类变量还是定义成public的好
      

  12.   

    嗯,另外我搜索到CSDN上还有另外一个帖子说的也是这个问题
    http://topic.csdn.net/u/20080623/23/9341a915-84f5-4aa9-a7e1-575ed6efe445.html
    不过没有最终答案
    下面是调用的代码@Test
    public void test() {
    System.out.println(businessDataInit.getA());
    System.out.println(businessDataInit.getParammap().get("obj1"));
    //System.out.println(ContextUtil.aaa);
    //System.out.println(ContextUtil.getApplicationContext());
    }
      

  13.   

    不知道这个是什么原因!
    不过我们一般不会用servlet去存放初始化数据
    一帮都是有一个准们的存放初始化数据的类,然后在一个启动时候加载的servlet中的init方法中初始化类中的变量,你可以这么试试,你现在的这种写法为啥不行,目前也没有头绪
      

  14.   


    定义成final只是禁止 paramMap 被重新赋值,并不影响你操作其属性,也就是完全不影响put。建议你定义成final,只是想看看是否存在重新对paramMap赋值的情况。
      

  15.   

    楼主的测试方式是有问题的,应该写个servlet进行测试。建议你在businessDataInit类中加上一个静态代码块static{System.out.println("loding class……");},你会发现当你启动tomcat的时候这个代码块执行了一次,你用test()方法进行测试的时候肯定依然会执行的,这说明启动tomcat时businessDataInit被加载到了jvm的内存,test的方法没有访问jvm的内存(也是不可能的)。自己的想法,楼主可以试一下,希望对你有所帮助!
      

  16.   

    不好意思,写的有问题,都是要访问jvm内存的,只是加载到了不同的地方吧,欢迎指教!
      

  17.   

    测试程序和servlet属于不同的进程,进程之间内存不共享
      

  18.   

    你把这个Map的方法提到一个java里边然后在servlet里边调用java中的map就行了
    而且也不用这么复杂
      

  19.   

    改写这段代码A类
    private static Map<String,String> paramMap;
    public static Map getCommonMap(){
        if(paramMap == null){
            paramMap  = new HashMap();
            paramMap.put("1","1");
            paramMap.put("2","2"); 
    }
    }servlet里调用A.getCommonMap();
      

  20.   

    果然是因为这个原因,我测试是用简单的Java类去测试的,没有WEB环境,今天用Spring的Junit测试就可以了,谢谢大家的帮助
      

  21.   

    你竟然用main方法去测试servlet,没有web环境,init()肯定执行不了了。