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();
}
}
我在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();
}
}
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()
static是类级别的变量,你每次改回导致所有的对象都改掉这个值的啊
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,直接拿类名去取,结果也是一样
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配置就不用了吧,就一句话,这个类在启动的时候是肯定走了的
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());
}
不过我们一般不会用servlet去存放初始化数据
一帮都是有一个准们的存放初始化数据的类,然后在一个启动时候加载的servlet中的init方法中初始化类中的变量,你可以这么试试,你现在的这种写法为啥不行,目前也没有头绪
定义成final只是禁止 paramMap 被重新赋值,并不影响你操作其属性,也就是完全不影响put。建议你定义成final,只是想看看是否存在重新对paramMap赋值的情况。
而且也不用这么复杂
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();