熟悉session监听器的请进

别人家的老公 2010-11-09 11:30:48
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是可以获得准确的值的,所以应该不是取值问题

在线等 解决立马结账


...全文
252 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
别人家的老公 2010-11-09
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 ousyuryu 的回复:]
引用 10 楼 gudankangti1987 的回复:

引用 9 楼 tianshi1017 的回复:
引用 8 楼 sotom 的回复:
Java code
Object obj = se.getSession().getAttribute("userId");
if(obj!=null)
{
studentBeanDao.deleteStudentLog(obj.toStr……
[/Quote]

删除方法是没有问题的,已经验证过的
ousyuryu 2010-11-09
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 gudankangti1987 的回复:]

引用 9 楼 tianshi1017 的回复:
引用 8 楼 sotom 的回复:
Java code
Object obj = se.getSession().getAttribute("userId");
if(obj!=null)
{
studentBeanDao.deleteStudentLog(obj.toString());
}


这里强转String 就可以了……
[/Quote]

那就是说deleteStudentLog里面出问题了吧~楼主跟过吗?
ousyuryu 2010-11-09
  • 打赏
  • 举报
回复
studentBeanDao对象为空了吧
看看是不是被手动清空了
sotom 2010-11-09
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 gudankangti1987 的回复:]

引用 5 楼 tianshi1017 的回复:
那也就只是studentBeanDao为空了,是注入进来的么???


studentBeanDao是注入进来的,没有问题,是类注册的地方有误,我用的是Spring MVC
这个监听器我注册在web.xml里面,Spring找不到这个类
[/Quote]
我们也用Spring MVC , Spring MVC + ibatis ,配置Servlet 的监听应该和 SpringMVC 的不一样,你找找吧,偶学习。。
别人家的老公 2010-11-09
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 tianshi1017 的回复:]
引用 8 楼 sotom 的回复:
Java code
Object obj = se.getSession().getAttribute("userId");
if(obj!=null)
{
studentBeanDao.deleteStudentLog(obj.toString());
}


这里强转String 就可以了
obj.toString() 可不等于Strin……
[/Quote]

删除方法是没有问题的,已经验证过了
tianshi1017 2010-11-09
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 sotom 的回复:]
Java code
Object obj = se.getSession().getAttribute("userId");
if(obj!=null)
{
studentBeanDao.deleteStudentLog(obj.toString());
}


这里强转String 就可以了
obj.toString() 可不等于String , 他打印的应该是一段地址
[/Quote]
如果是这样,我就怀疑是删除方法里面的逻辑有问题
贴出你的删除方法
sotom 2010-11-09
  • 打赏
  • 举报
回复
Object obj = se.getSession().getAttribute("userId");
if(obj!=null)
{
studentBeanDao.deleteStudentLog(obj.toString());
}


这里强转String 就可以了
obj.toString() 可不等于String , 他打印的应该是一段地址
别人家的老公 2010-11-09
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 tianshi1017 的回复:]
那也就只是studentBeanDao为空了,是注入进来的么???
[/Quote]

studentBeanDao是注入进来的,没有问题,是类注册的地方有误,我用的是Spring MVC
这个监听器我注册在web.xml里面,Spring找不到这个类
sotom 2010-11-09
  • 打赏
  • 举报
回复
at com.wiscom.jwxk.common.ContextListener.sessionDestroyed(ContextListener.java:42)


这个是哪一行?? 说的很清楚了, 空指针, 如果是dao那行就是没有正确注入。
tianshi1017 2010-11-09
  • 打赏
  • 举报
回复
那也就只是studentBeanDao为空了,是注入进来的么???
tianshi1017 2010-11-09
  • 打赏
  • 举报
回复
object 获得了,那是哪个地方报空,总知道吧
tubage408 2010-11-09
  • 打赏
  • 举报
回复
是不是Object obj = se.getSession().getAttribute("userId");
这里有问题呀,此时的session是不是已经被销毁了呀?但是我看api上说
public void sessionDestroyed(HttpSessionEvent se)
Notification that a session is about to be invalidated.
不知道为啥!!!!!!!debug看下
别人家的老公 2010-11-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 tianshi1017 的回复:]
studentBeanDao.deleteStudentLog(obj.toString());

为啥要obj.toString()啊
你不是应该转为你要删的对象么???
[/Quote]

参数是一个String类型的 这个是没问题的
tianshi1017 2010-11-09
  • 打赏
  • 举报
回复
studentBeanDao.deleteStudentLog(obj.toString());

为啥要obj.toString()啊
你不是应该转为你要删的对象么???
别人家的老公 2010-11-09
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 liufeng0209 的回复:]
你的监听器先于spring启动,所以取不到spring管理的bean studentBeanDao
你用这个去取spring的ctx:
ApplicationContext ctx = WebApplicationContextUtils
.getRequiredWebApplicationContext(session.getServletContext());
然后再取你的那个bean……
[/Quote]
非常感谢 我弄好了
liufeng0209 2010-11-09
  • 打赏
  • 举报
回复
你的监听器先于spring启动,所以取不到spring管理的bean studentBeanDao
你用这个去取spring的ctx:
ApplicationContext ctx = WebApplicationContextUtils
.getRequiredWebApplicationContext(session.getServletContext());
然后再取你的那个bean.
试试吧,我没验证.
别人家的老公 2010-11-09
  • 打赏
  • 举报
回复
[Quote=引用楼主 gudankangti1987 的回复:]
public class ContextListener implements HttpSessionListener {

private StudentBeanDao studentBeanDao;

public void setStudentBeanDao(StudentBeanDao studentBeanDao) {
this.studentBeanDao = student……
[/Quote]

我现在找到问题的关键是 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);

}

}
别人家的老公 2010-11-09
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 liufeng0209 的回复:]
我觉得是事务的问题,你用studentBeanService封装studentBeanDao并应用事务,再看看.
[/Quote]

事务没有问题 谢谢
liufeng0209 2010-11-09
  • 打赏
  • 举报
回复
我觉得是事务的问题,你用studentBeanService封装studentBeanDao并应用事务,再看看.
别人家的老公 2010-11-09
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 ousyuryu 的回复:]
studentBeanDao对象为空了吧
看看是不是被手动清空了
[/Quote]

在同一个控制类里,studentBeanDao在sessionDestroyed里面是空的

加载更多回复(1)

67,515

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧