当前位置:编程学习 > JAVA >>

jsp隐式对象session的疑惑

一个jsp页面有如下代码:
<%
1.String id1=session.getId();
2.String id2=request.getSession().getId();
3.out.print("id1:"+id1+"<br/>"+"id2:"+id2);
4.session.invalidate();
5.out.print("id1:"+id1+"<br/>);
6.out.print("id2:"+request.getSession(false).getId());
%>
运行后,第三行输出id1与id2相同,这是正常的,不正常得在第五六行,
第四行invalidate()后,第五行竟然仍然能正常输出......可第六行却报nullpointerexception了,
这是为什么呢? --------------------编程问答-------------------- 少写了一行
第四和第五行之间还有一行
id1=session.getId();

问题一样 --------------------编程问答-------------------- session对象肯定还存在,因为你自己还引用着,
但是request已经没有这个session对象的引用了。 --------------------编程问答--------------------
引用 2 楼 fei1710 的回复:
session对象肯定还存在,因为你自己还引用着,
但是request已经没有这个session对象的引用了。


你的意思是说,隐式对象是jsp必须固定有的,不能人为的置为null吗?
还是不太明白... --------------------编程问答--------------------

1.String id1=session.getId();     //将值赋给 id1  这个时候已经脱离session了
2.String id2=request.getSession().getId();  //同上
3.out.print("id1:"+id1+"<br/>"+"id2:"+id2);
4.session.invalidate();
5.out.print("id1:"+id1+"<br/>);     //虽然session已经被销毁,但是不会影响到id1,,它们之间没有任何关系。
6.out.print("id2:"+request.getSession(false).getId());  //这里是在重新获取session中的id,由于前面的session.invalidate()影响,所以request.getSession(false)返回的是null,然后getId() 就报nullpointer啦~
--------------------编程问答--------------------
引用 4 楼 ch656409110 的回复:

1.String id1=session.getId();     //将值赋给 id1  这个时候已经脱离session了
2.String id2=request.getSession().getId();  //同上
3.out.print("id1:"+id1+"<br/>"+"id2:"+id2);
4.session.invalidate();
5.out.print("id1:"+id1+"<br/>);     //虽然session已经被销毁,但是不会影响到id1,,它们之间没有任何关系。
6.out.print("id2:"+request.getSession(false).getId());  //这里是在重新获取session中的id,由于前面的session.invalidate()影响,所以request.getSession(false)返回的是null,然后getId() 就报nullpointer啦~


我第二楼补充了哦,最好你自己先试试 --------------------编程问答--------------------
引用 5 楼 enl_green 的回复:
Quote: 引用 4 楼 ch656409110 的回复:


1.String id1=session.getId();     //将值赋给 id1  这个时候已经脱离session了
2.String id2=request.getSession().getId();  //同上
3.out.print("id1:"+id1+"<br/>"+"id2:"+id2);
4.session.invalidate();
5.out.print("id1:"+id1+"<br/>);     //虽然session已经被销毁,但是不会影响到id1,,它们之间没有任何关系。
6.out.print("id2:"+request.getSession(false).getId());  //这里是在重新获取session中的id,由于前面的session.invalidate()影响,所以request.getSession(false)返回的是null,然后getId() 就报nullpointer啦~


我第二楼补充了哦,最好你自己先试试


那就不可能了,,,可能没有编译吧。。。

或者
request.getSession(true):若存在会话则返回该会话,否则新建一个会话。
request.getSession(false):若存在会话则返回该会话,否则返回NULL

简而言之,session.invalidate() 是把session集合中保存的键值对变量全部清空,但是session还存在于回话中,但是你用的request.getSession(false)就不一样了。。

--------------------编程问答--------------------
引用 3 楼 enl_green 的回复:
Quote: 引用 2 楼 fei1710 的回复:

session对象肯定还存在,因为你自己还引用着,
但是request已经没有这个session对象的引用了。


你的意思是说,隐式对象是jsp必须固定有的,不能人为的置为null吗?
还是不太明白...

session失效并不需要将session里的id设为null,这个应该不难理解吧。
如果取里面的值,比如getAttribute("dd")就会出错了。 --------------------编程问答-------------------- session.invalidate(); 第四行,表示session已经销毁了。request.getSession(false):若存在会话则返回该会话,否则返回NULL ,你再getID肯定就是空指针错误了。
id1 已经被赋值了,所以有值了。

6楼说的已经很具体了。
补充:Java ,  Java EE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,