public class ContextListener implements HttpSessionListener {
private StudentBeanDao studentBeanDao;
public void setStudentBeanDao(StudentBeanDao studentBeanDao) {
this.studentBeanDao = studentBeanDao;
} public void sessionCreated(HttpSessionEvent se) {
System.out.println("session创建:" + new java.util.Date());
} public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("--------------sessionDestroyed------------");
Object obj = se.getSession().getAttribute("userId");
if(obj!=null)
{
studentBeanDao.deleteStudentLog(obj.toString());
}
System.out.println("session销毁:" + new java.util.Date());
}
}
public class OnlineList implements HttpSessionAttributeListener {
private StudentBeanDao studentBeanDao;
private static int count = 0;
public void attributeAdded(HttpSessionBindingEvent se) {
count++;
System.out.println("--------attributeAdded------------");
System.out.println(count);
} public void attributeRemoved(HttpSessionBindingEvent se) {
count--;
System.out.println("--------attributeRemoved------------");
System.out.println(count); } public void attributeReplaced(HttpSessionBindingEvent se) {
} public void setStudentBeanDao(StudentBeanDao studentBeanDao) {
this.studentBeanDao = studentBeanDao;
}
public static int getCount() {
return count;
}
}
公司有个需求是sessionDestroyed的时候删除登陆日志表里面的一条记录,不过此时会报一个空指针的错误java.lang.NullPointerException
at com.wiscom.jwxk.common.ContextListener.sessionDestroyed(ContextListener.java:42)
at org.apache.catalina.session.StandardSession.expire(StandardSession.java:702)
at org.apache.catalina.session.StandardSession.isValid(StandardSession.java:592)
at org.apache.catalina.session.ManagerBase.processExpires(ManagerBase.java:680)
at org.apache.catalina.session.ManagerBase.backgroundProcess(ManagerBase.java:665)
at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1316)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1601)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1610)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1610)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1590)
at java.lang.Thread.run(Thread.java:619)
obj是可以获得准确的值的,所以应该不是取值问题 在线等 解决立马结账
private StudentBeanDao studentBeanDao;
public void setStudentBeanDao(StudentBeanDao studentBeanDao) {
this.studentBeanDao = studentBeanDao;
} public void sessionCreated(HttpSessionEvent se) {
System.out.println("session创建:" + new java.util.Date());
} public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("--------------sessionDestroyed------------");
Object obj = se.getSession().getAttribute("userId");
if(obj!=null)
{
studentBeanDao.deleteStudentLog(obj.toString());
}
System.out.println("session销毁:" + new java.util.Date());
}
}
public class OnlineList implements HttpSessionAttributeListener {
private StudentBeanDao studentBeanDao;
private static int count = 0;
public void attributeAdded(HttpSessionBindingEvent se) {
count++;
System.out.println("--------attributeAdded------------");
System.out.println(count);
} public void attributeRemoved(HttpSessionBindingEvent se) {
count--;
System.out.println("--------attributeRemoved------------");
System.out.println(count); } public void attributeReplaced(HttpSessionBindingEvent se) {
} public void setStudentBeanDao(StudentBeanDao studentBeanDao) {
this.studentBeanDao = studentBeanDao;
}
public static int getCount() {
return count;
}
}
公司有个需求是sessionDestroyed的时候删除登陆日志表里面的一条记录,不过此时会报一个空指针的错误java.lang.NullPointerException
at com.wiscom.jwxk.common.ContextListener.sessionDestroyed(ContextListener.java:42)
at org.apache.catalina.session.StandardSession.expire(StandardSession.java:702)
at org.apache.catalina.session.StandardSession.isValid(StandardSession.java:592)
at org.apache.catalina.session.ManagerBase.processExpires(ManagerBase.java:680)
at org.apache.catalina.session.ManagerBase.backgroundProcess(ManagerBase.java:665)
at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1316)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1601)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1610)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1610)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1590)
at java.lang.Thread.run(Thread.java:619)
obj是可以获得准确的值的,所以应该不是取值问题 在线等 解决立马结账
解决方案 »
- 创建SessionFactory是错误,大家帮我看看
- java.lang.IllegalStateException: Folder is not Open
- select:option默认值问题
- 权限管理是如何做的
- Java Web 程序员工作内容和工作流程以及薪金待遇
- web service,client端为什么传String可以,int就不行?
- 不重起weblogic清除服务器缓存问题
- Tomcat下JSP、Servlet和JavaBean环境的配置问题
- resin中怎么配置session监听器???急啊!在线等!!
- 初学ejb,使用j8,请教各位,为什么不能建立ejb module????
- struts的一个问题,求解
- 问个java页面转向的问题
你不是应该转为你要删的对象么???
参数是一个String类型的 这个是没问题的
这里有问题呀,此时的session是不是已经被销毁了呀?但是我看api上说
public void sessionDestroyed(HttpSessionEvent se)
Notification that a session is about to be invalidated.
不知道为啥!!!!!!!debug看下
studentBeanDao是注入进来的,没有问题,是类注册的地方有误,我用的是Spring MVC
这个监听器我注册在web.xml里面,Spring找不到这个类
if(obj!=null)
{
studentBeanDao.deleteStudentLog(obj.toString());
}这里强转String 就可以了
obj.toString() 可不等于String , 他打印的应该是一段地址
看看是不是被手动清空了
那就是说deleteStudentLog里面出问题了吧~楼主跟过吗?
在同一个控制类里,studentBeanDao在sessionDestroyed里面是空的
我现在找到问题的关键是 studentBeanDao是null,注入失败我的注入bena是
<bean id="contextListener" class="com.wiscom.jwxk.common.ContextListener">
<property name="studentBeanDao" ref="studentBeanDaoImpl"/>
</bean>在web.xml注册的监听器是
<listener>
<listener-class>com.wiscom.jwxk.common.ContextListener</listener-class>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>public class ContextListener implements HttpSessionListener { private StudentBeanDao studentBeanDao;
private static int countOnlineList = 0; public void setStudentBeanDao(StudentBeanDao studentBeanDao) {
this.studentBeanDao = studentBeanDao;
} public void sessionCreated(HttpSessionEvent se) {
HttpSession session = se.getSession();
session.setMaxInactiveInterval(60);
synchronized (this) {
countOnlineList++;
}
String id = session.getId();
Date now = new Date();
String message = new StringBuffer("New Session created on ").append(
now.toString()).append("\nID: ").append(id).append("\n")
.append("There are now ").append("" + countOnlineList).append(
" live sessions in the application.").toString(); System.out.println(message);
System.out.println("目前在线人数为:"+countOnlineList);
}
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("--------------sessionDestroyed------------");
Object obj = se.getSession().getAttribute("userId");
if (obj != null) {
studentBeanDao.deleteStudentLog(obj.toString());
}
// countOnlineList--;
// System.out.println("目前在线人数为:"+countOnlineList);
// System.out.println("session销毁:" + new java.util.Date());
HttpSession session = se.getSession();
//
String id = session.getId();
synchronized (this) {
--countOnlineList;
}
String message = new StringBuffer("Session destroyed"
+ "\nValue of destroyed session ID is").append("" + id).append(
"\n").append("There are now ").append("" + countOnlineList)
.append(" live sessions in the application.").toString();
System.out.println(message);
System.out.println("目前在线人数为:"+countOnlineList);
}}
你用这个去取spring的ctx:
ApplicationContext ctx = WebApplicationContextUtils
.getRequiredWebApplicationContext(session.getServletContext());
然后再取你的那个bean.
试试吧,我没验证.