日期:2014-05-18  浏览次数:20594 次

servlet 中ServletContext获得HashMap<String,Object>出问题!
我在写springmvc时,ServletContext获得HashMap<String,Object>出问题,求指教!
-------具体如下:------
首先,这是我在spring的ServletContextListener中写的:
public class CreateServletContext implements ServletContextListener {
private static ServletContext servletContext = null ;
public ServletContext getServletContext() {
return servletContext;
}
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("init and create ServletContext");
if( null == CreateServletContext.servletContext )
CreateServletContext.servletContext = sce.getServletContext();
                ..........无关紧要的就懒得贴了...........
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
..........无关紧要的就懒得贴了...........
}
}

然后是方便调用的代码:
public class GetServletContext {
private static ServletContext servletContext = null ;
public static ServletContext getServletContext(){
if( null == servletContext ){
CreateServletContext createServletContext = new CreateServletContext();
servletContext
 = createServletContext.getServletContext();
}
servletContext.setAttribute("userNameRecord", new HashMap<String,Object>());
return servletContext ;
}
}

然后,是我的登入代码:
private void _prepareSession(UserInf userInf,HttpServletRequest req){
..........无关紧要的就懒得贴了...........
ServletContext sc = GetServletContext.getServletContext();/**获取ServletContext*/
HashMap<String,Object> userNameRecord = (HashMap<String,Object>)sc.getAttribute("userNameRecord");
userNameRecord.put(userInf.getUserName(), userInf.getUserName());
ServletContext ss = GetServletContext.getServletContext();
HashMap<String,Object> record = (HashMap<String,Object>)ss.getAttribute("userNameRecord");
System.out.println("userNameRecord="+userNameRecord+"record == "+record);
}

结果:userNameRecord={admin,admin}record == null
-----------------------
问题:我定义时,ServletContext的对象是static的,那么获取的ServletContext是相同的,同时,ServletContext是全局的,那么ServletContext.getAttribute()同一个名字应该获取同一个内存的地址引用!可是,为什么我前后两次HashMap<..,..>的结果却不同?
------解决方案--------------------
你俩次取到的ServletContext 不是一个, 你不是每次都创建一个,这个东西不用每次都创建的 。
------解决方案--------------------
ServletContext那个位置出错,不停的new了,,,
------解决方案--------------------
HashMap<String,Object> record = (HashMap<String,Object>)ss.getAttribute("userNameRecord"); 
换成:
HashMap<String,Object> record = (HashMap<String,Object>)sc.getAttribute("userNameRecord"); 
试试呢,再检查下userNameRecord大小写、空格啥的。
------解决方案--------------------
本来你put进去了,你getServletContext时会又set一个new的对象
servletContext.setAttribute("userNameRecord", new HashMap<String,Object>());

------解决方案--------------------
放在request里面不是更好么。。