在问答频道看到个
问题,比较有趣,摘记如下,以备他时自用。
问题是这样的,下面的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隐式对象详解** JavaServer Pages (JSP) 是一种用于开发动态网页的技术,它允许开发者在HTML代码中嵌入Java代码。在JSP中,有一些预先定义好的对象,被称为“隐式对象”,这些对象可以直接在JSP页面中使用,...
在这个例子中,首先将一个名为"user"的属性与值"username"存入session中,然后又从session中获取这个属性值并输出。 4. application对象 application对象表示整个Web应用的上下文环境。它可以在所有用户之间共享...
2. **存储数据**:服务器可以在Session中存储用户的状态信息。这些信息可以是任何类型的对象,只要它们实现了`Serializable`接口。 3. **获取数据**:在后续的请求中,服务器可以通过Session ID来查找相应的Session...
总的来说,JSP隐式对象是Java Web开发中的重要工具,它们简化了常见任务的处理,使得开发者能更专注于业务逻辑而不是底层细节。掌握这些隐式对象的使用,对于编写高效、简洁的JSP代码至关重要。
JavaWeb程序设计是Web开发中的重要一环,...本入门课件《JavaWeb程序设计入门课件JSP隐式对象共8页.pdf》将引导初学者深入理解JSP隐式对象的概念、使用方法及其在实际开发中的应用,为后续的JavaWeb开发打下坚实基础。
JSP 九大隐式对象是指在 JSP 编程中可以直接使用的九个内置对象,这九个对象分别是:request、response、session、application、out、pageContext、config、page、exception。下面对每个对象进行详细解释。 1. ...
- JSP隐式对象是预定义的Java对象,可以直接在JSP页面中使用,分为以下几类: - 输入/输出对象:`request`、`response`和`out`。 - 作用域通信对象:`session`、`application`和`pageContext`。 - Servlet相关...
JSP隐式对象是JSP提供的一组预定义的对象,可以直接在JSP页面中使用,无需显式声明,极大地简化了开发工作。以下是对JSP隐式对象的详细说明: 1. **out对象**: `out` 对象是 `javax.servlet.jsp.JspWriter` 类的...
jsp隐式对象是jsp技术的核心之一,jsp隐式对象是指在jsp页面中可以直接使用的java对象,这些对象都是jsp引擎提供的,jsp隐式对象共有九大对象,分别是: 1. request对象 2. response对象 3. pageContext对象 4. ...
`session.getAttribute(String name)`方法用于获取Session中的数据,如果不存在则返回`null`。 ```jsp <jsp:useBean id="session" class="javax.servlet.http.HttpSession" scope="session"/> 用户名: ${session...
知识点:JSP 中的隐式对象是 web 容器加载的一组对象,例如 request、response、session 等,可以直接在 JSP 页面使用。 10. 在一个 Filter 中,处理 Filter 业务的是 doFilter() 方法。 知识点:Filter 中的 ...
通过它可以直接访问 JSP 页面中的各种对象,如 `request`、`session` 等。 - **param**: 获取当前请求的所有参数值,返回类型为 String。 - **paramValues**: 获取当前请求的所有参数值,并返回每个参数的所有值组成...
本文总结了 JSP 程序设计期末试卷 A 题目及其答案中的知识点,涵盖了 JSP 的基本概念、异常处理、隐式注释、重定向、Session 对象、JavaBean、getProperty 标记、 `<c:choose>` 标记、输出变量、Filter 方法和 ...
- **获取Session属性**:使用`session.getAttribute("key")`来获取Session中存储的属性值。 - **删除Session属性**:调用`session.removeAttribute("key")`移除指定的Session属性。 - **无效化Session**:使用`...
JSP隐式对象是JSP页面中可以直接使用的对象,包括request、response、session、application、out、config、pageContext等。这些对象提供了对HTTP请求和响应的访问能力,帮助开发者快速开发Web应用程序。 五、JSP...
2. **信息传递**:JSP可以通过隐式对象(如request, response, session, pageContext等)与Servlet进行交互。例如,Servlet可以设置请求或会话属性,JSP则可以通过这些属性获取数据。 3. **转发与重定向**:在JSP中...
本资源摘要信息涵盖了 JSP 程序设计期末试卷的主要知识点,包括 JSP 页面的扩展名、导入 java.io.* 包、异常处理、隐式注释、重定向、Session 对象、JavaBean 的访问范围、请求转发、属性获取、条件标记、Filter ...
- `pageContext`:提供对JSP隐式对象如请求、响应、会话、输出和servletContext的访问。 - `param`:映射请求参数到单一字符串值。 - `paramValues`:映射请求参数到字符串数组。 - `header`:映射HTTP请求头到...