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

关于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隐式对象详解** JavaServer Pages (JSP) 是一种用于开发动态网页的技术,它允许开发者在HTML代码中嵌入Java代码。在JSP中,有一些预先定义好的对象,被称为“隐式对象”,这些对象可以直接在JSP页面中使用,...

    JSP中隐式对象用法实例

    在这个例子中,首先将一个名为"user"的属性与值"username"存入session中,然后又从session中获取这个属性值并输出。 4. application对象 application对象表示整个Web应用的上下文环境。它可以在所有用户之间共享...

    jsp的session介绍

    2. **存储数据**:服务器可以在Session中存储用户的状态信息。这些信息可以是任何类型的对象,只要它们实现了`Serializable`接口。 3. **获取数据**:在后续的请求中,服务器可以通过Session ID来查找相应的Session...

    Java Web程序设计入门课件-JSP隐式对象.pptx

    总的来说,JSP隐式对象是Java Web开发中的重要工具,它们简化了常见任务的处理,使得开发者能更专注于业务逻辑而不是底层细节。掌握这些隐式对象的使用,对于编写高效、简洁的JSP代码至关重要。

    JavaWeb程序设计入门课件JSP隐式对象共8页.pdf

    JavaWeb程序设计是Web开发中的重要一环,...本入门课件《JavaWeb程序设计入门课件JSP隐式对象共8页.pdf》将引导初学者深入理解JSP隐式对象的概念、使用方法及其在实际开发中的应用,为后续的JavaWeb开发打下坚实基础。

    jsp的九大隐式对象详解

    JSP 九大隐式对象是指在 JSP 编程中可以直接使用的九个内置对象,这九个对象分别是:request、response、session、application、out、pageContext、config、page、exception。下面对每个对象进行详细解释。 1. ...

    完整版Java JSP web开发教程 07_JSP隐式对象(共32页).ppt

    - JSP隐式对象是预定义的Java对象,可以直接在JSP页面中使用,分为以下几类: - 输入/输出对象:`request`、`response`和`out`。 - 作用域通信对象:`session`、`application`和`pageContext`。 - Servlet相关...

    JavaWeb开发技术-JSP隐式对象.pptx

    JSP隐式对象是JSP提供的一组预定义的对象,可以直接在JSP页面中使用,无需显式声明,极大地简化了开发工作。以下是对JSP隐式对象的详细说明: 1. **out对象**: `out` 对象是 `javax.servlet.jsp.JspWriter` 类的...

    jsp学习笔记

    jsp隐式对象是jsp技术的核心之一,jsp隐式对象是指在jsp页面中可以直接使用的java对象,这些对象都是jsp引擎提供的,jsp隐式对象共有九大对象,分别是: 1. request对象 2. response对象 3. pageContext对象 4. ...

    学习JSP(JBuilder版)——用Servlet实现页面间通信(Session对象)

    `session.getAttribute(String name)`方法用于获取Session中的数据,如果不存在则返回`null`。 ```jsp &lt;jsp:useBean id="session" class="javax.servlet.http.HttpSession" scope="session"/&gt; 用户名: ${session...

    JSP测试题1(有答案)

    知识点:JSP 中的隐式对象是 web 容器加载的一组对象,例如 request、response、session 等,可以直接在 JSP 页面使用。 10. 在一个 Filter 中,处理 Filter 业务的是 doFilter() 方法。 知识点:Filter 中的 ...

    EL表达式 隐式对象

    通过它可以直接访问 JSP 页面中的各种对象,如 `request`、`session` 等。 - **param**: 获取当前请求的所有参数值,返回类型为 String。 - **paramValues**: 获取当前请求的所有参数值,并返回每个参数的所有值组成...

    JSP程序设计期末试卷A题目及其答案.doc

    本文总结了 JSP 程序设计期末试卷 A 题目及其答案中的知识点,涵盖了 JSP 的基本概念、异常处理、隐式注释、重定向、Session 对象、JavaBean、getProperty 标记、 `&lt;c:choose&gt;` 标记、输出变量、Filter 方法和 ...

    Session技术

    - **获取Session属性**:使用`session.getAttribute("key")`来获取Session中存储的属性值。 - **删除Session属性**:调用`session.removeAttribute("key")`移除指定的Session属性。 - **无效化Session**:使用`...

    JSP大学实用教程程序源代码

    JSP隐式对象是JSP页面中可以直接使用的对象,包括request、response、session、application、out、config、pageContext等。这些对象提供了对HTTP请求和响应的访问能力,帮助开发者快速开发Web应用程序。 五、JSP...

    jsp 原理 jsp教程

    2. **信息传递**:JSP可以通过隐式对象(如request, response, session, pageContext等)与Servlet进行交互。例如,Servlet可以设置请求或会话属性,JSP则可以通过这些属性获取数据。 3. **转发与重定向**:在JSP中...

    良心出品JSP程序设计期末试卷A题目及其答案.doc

    本资源摘要信息涵盖了 JSP 程序设计期末试卷的主要知识点,包括 JSP 页面的扩展名、导入 java.io.* 包、异常处理、隐式注释、重定向、Session 对象、JavaBean 的访问范围、请求转发、属性获取、条件标记、Filter ...

    jsp中的EL表达式简介

    - `pageContext`:提供对JSP隐式对象如请求、响应、会话、输出和servletContext的访问。 - `param`:映射请求参数到单一字符串值。 - `paramValues`:映射请求参数到字符串数组。 - `header`:映射HTTP请求头到...

Global site tag (gtag.js) - Google Analytics