`
clxy
  • 浏览: 78774 次
社区版块
存档分类
最新评论

关于JSP中的隐式Session

 
阅读更多
在问答频道看到个问题,比较有趣,摘记如下,以备他时自用。

问题是这样的,下面的JSP代码中问题是这样的,下面的JSP代码中
<%
1.session.invalidate();
2.out.print("id1:"+session.getId()+"<br/>");
3.out.print("id2:"+request.getSession(false).getId());
%>


因为在Java程序中说起session,都是指request.getSession得到的,所以它们应该是指向同一个实例。而上面代码中隐式的session和request.getSession动作却是不同!

正好手边有环境,于是大致试了试。以下是我的尝试JSP代码
- <%=session.getId()%> - <%=request.getSession().getId()%><br/>//←比较sessionID
${user}<br/> //注1
- <%=session.getAttribute("user")%><br />
- <%=request.getSession(false).getAttribute("user")%><br/>//←比较三者中的User对象
<%
	session.invalidate();
	out.print(session + "<br />");
	out.print(request.getSession(true) + "<br />"); //注2
	out.print(session + "<br />"); //←打印invalidate后内存地址。
%>
- <%=session.getId() %> - <%=request.getSession(false).getId()%><br />
${user}<br />
- <%=session.getAttribute("user") %><br />
- <%=request.getSession(false).getAttribute("user") %><br />

注1:user是session里放的变量,每当session被创建时会自动放个new User在里面。
注2:先尝试request.getSession(true),再次尝试request.getSession(false)

SessionListener中创建新User的代码
	@Override
	public void sessionCreated(HttpSessionEvent event) {
		event.getSession().setAttribute(KEY_USER, new User());
	}


■request.getSession(true)的结果
- 7B380F9A6ED68EB2905F82509A9931FC - 7B380F9A6ED68EB2905F82509A9931FC //←两个sessionID相同
cn.clxy.ssm.common.data.User@37a744
- cn.clxy.ssm.common.data.User@37a744
- cn.clxy.ssm.common.data.User@37a744 //←三个User都相同
org.apache.catalina.session.StandardSessionFacade@1c69f05
org.apache.catalina.session.StandardSessionFacade@f20853 //←request里的session被重新创建
org.apache.catalina.session.StandardSessionFacade@1c69f05 //←但页面中隐式的session没有变化
- 7B380F9A6ED68EB2905F82509A9931FC - 99A9276B064581ED4A6DFE3CD51C9290 //←两个sessionID已经不同了
{blank} //←JSTL已经无法找到User实例
- //←抛出“session已经无效”的异常。说明页面中隐式session的确是无效的
- cn.clxy.ssm.common.data.User@b7ff //←虽然JSTL找不到User,但request中的session里面是有新User的



■request.getSession(false)的结果
- 99A9276B064581ED4A6DFE3CD51C9290 - 99A9276B064581ED4A6DFE3CD51C9290
cn.clxy.ssm.common.data.User@b7ff
- cn.clxy.ssm.common.data.User@b7ff
- cn.clxy.ssm.common.data.User@b7ff
org.apache.catalina.session.StandardSessionFacade@f20853
null //←request的session无效后为null
org.apache.catalina.session.StandardSessionFacade@f20853
- 99A9276B064581ED4A6DFE3CD51C9290 - //←抛出空指针异常
{blank} //←JSTL已经无法找到User实例
-  //←抛出“session已经无效”的异常。说明页面中隐式session的确是无效的
- //←抛出空指针异常


贴了大段的代码,说结论吧。
隐式的session和request.getSeesion并不总是一个对象! 
1. 画面初始时,session(即隐式的session)和request.getSession指向相同对象。
2. 调用session.invalidate()时,
  1.request的session被设置成null。
  2.session没有变成null,可以取id,但不能再访问attribute。
3.session.invalidate后,JSTL无法定位对象。

看来还是不要在JSP中调用session.invalidate(),要用也放在最后才好。
分享到:
评论

相关推荐

    JSP语法之隐式对象详解

    了解JSP 隐式对象的分类和组成 能够运用隐式对象进行JSP 编程 理解Page、Request、Session 和Application 范围的区别

    javaBean和JSP标准动作.rar

    在JSP页面中,我们通过使用隐式对象可以更加方便地实现我们的效果。隐式对象包含: request response out ---- 输入输出对象 pageContext session application ---- 应用作用域对象 page config ---- Servlet对象...

    JSP期末考试试题及答案

    针对以下题目请选择正确的答案(每道题目有一个或多哥正确的答案)。...5) 在J2EE中,以下不是JSP隐式对象的是()。(选择一项) a) pageContext b) context c) application d) out

    jsp试卷大全及答案

    5) 在J2EE中,以下不是JSP隐式对象的是()。(选择一项) a) pageContext b) context c) application d) out 6) Servlet中,HttpServletResponse的()方法用来把一个Http请求重定向到另外的URL...

    JSP程序设计与案例实战

    内容摘要:JSP程序设计与案例实战PPT,里面覆盖了网页前端“三剑客”知识点、如何安装配置JSP运行环境、JSP脚本元素(JSP表达式、声明、Script)及其指令(include指令、page指令、taglib指令)、JSP隐式对象(out、...

    jsp试卷带答案很全面

    有两份试卷 针对以下题目请选择正确的答案(每道题目有一个或多哥正确的答案)。...5) 在J2EE中,以下不是JSP隐式对象的是()。(选择一项) a) pageContext b) context c) application d) out

    Servlet与JSP核心编程第2版

    第14章 javabean组件在jsp文档中的应用 14.1 使用bean的原因 14.2 bean是什么 14.3 bean的应用:基本任务 14.4 示例:stringbean 14.5 设置bean的属性:高级技术 14.6 共享bean 14.7 共享bean的4种...

    JSP 隐式对象

    JSP隐式对象是JSP容器为每个页面提供的Java对象,开发者可以直接使用它们而不用显式声明。JSP隐式对象也被称为预定义变量。 JSP所支持的九大隐式对象: 对象 描述 request ...

    jsp九大内置对象

     当一个客户首次访问服务器上的一个JSP页面时,JSP引擎产生一个Session对象,同时分配一个String类型的ID号,JSP引擎同时将这换个ID号发送到客户端,存放在Cookie中,这样Session对象,直到客户关闭浏览器后,...

    最详细的jsp基础教程

    更多内容,点击了解: ...JSP系列教材 (六)- 中演示 cookie 的创建和访问 JSP系列教材 (七)- session 详解 JSP系列教材 (八)- 四种作用域 JSP系列教材 (九)- 九种隐式对象 JSP系列教材 (十)- J

    JSP 相关对象的使用介绍

    JSP九大隐式对象: 对象名 描述 作用域 数据类型 request 此对象封装了由WEB浏览器或其它客户端生成的HTTP请求的细节(参数,属性,头标和数据); request(用户请求期) ServletRequest的子类型 response 此...

    EL表达式的详细使用

    JSP 表达式语言定义了一组隐式对象,其中许多对象在 JSP scriplet 和表达式中可用: 术语 JSP 页的上下文。它可以用于访问 JSP 隐式对象,如请求、响应、会话、输出、servletContext 等。例如,${pageContext....

    XML Oracle Servlet 复习汇总(S2)

    4 Servlet:jsp隐式对象 4分 5 Servlet:指令和动作 6分 6 Servlet:mvc 8分 7 Servlet:转发和重定向 8分 8 Servlet:连接池 5分 9 Servlet:servlet(代码题目) 6分 10 Servlet:jspuserbean 5分 11 Servlet:...

    JSTL高级用法

    EL中的隐式对象  ${param.name}  ${paramValues.name}  cookie JSTL并没有提供设定cookie的动作, 例:要取得cookie中有一个设定名称为userCountry的值,可以使用${cookie.userCountry}来取得它。  header...

    web开发常用对象和技术总结

    11个word文档,10个pdf文件,详细讲解web开发中要用到各种技术,包括jsp隐式对象,表达式语言,自定义标签,标准标签库,javabean和标准动作,javamail ,过滤器,监听器servlet ,request ,session ,application.......

    吴天雄--JavaWeb完整笔记.doc

    模块二:使用eclipse和idea快速开发jsp(idea和tomcat的相关配置、eclipse创建web项目、jsp页面元素、jsp九大内置对象、四大作用域对象、解决get/post请求乱码问题、cookie和session详解、请求重定向);模块三:...

    EL表达式 (详解)

    例如:我们要取得session中储存一个属性username的值,可以利用下列方法: session.getAttribute("username") 取得username的值, 在EL中则使用下列方法 ${sessionScope.username} 2)与输入有关的隐含对象 与...

    计算机二级Web程序设计模拟卷(二).doc

    A.8888 B.8001 C.8080 D.80 正确答案:C 您的答案: 本题解析: 暂无解析 7.JSP中的隐式注释为()。 A.//注释内容 B. C. D./*注释内容*/ 正确答案:C 您的答案: 本题解析: 暂无解析 8.假设在helloapp应用中有一个...

    J2EE中文版指南 CHM格式 带全文检索

    第12章 JSP页面中的JavaBean组件 189 JavaBean组件设计约定 189 为什么要使用JavaBean组件 190 创建并使用JavaBean组件 190 设置JavaBean组件属性 190 返回JavaBean组件属性 191 第13章 在JSP页面中自定义标签 193 ...

Global site tag (gtag.js) - Google Analytics