pageContext 获取Session 为null原因

本文探讨了在J2EE应用中自定义标签无法获取到Session的问题。主要原因是JSP页面头部声明禁用了Session。文章还提供了JSP内置对象映射表作为参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题:在J2EE应用中。发如今自己定义标签中取不到session:

HttpSession session = pageContext.getSession();

你会发现session的值可能是空的。


原因:在标签所在的JSP页面中禁用了Session,见红色字体部分,比如以下是一个JSP页面头的声明:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"session="false"%>

若在这个页面内包括有一个自己定义标签,这在自己定义标签中session不能获取到:

   public int doStartTag() throws JspException {
        try {

            HttpSession sess = pageContext.getSession();


        //下面内容略   
  }



附:JSP内置对象映射表

对象名

类型

作用域

request

javax.servlet.ServletRequest

Request

response

javax.servlet.ServletResponse

Page

pageContext

javax.servlet.jsp.PageContxt

Page

session

javax.servlet.http.HttpSession

Session

application

javax.servlet.ServletContext

Application

out

javax.servlet.jsp.JspWriter

Page

config

javax.servlet.ServletConfig

Page

page

java.lang.Object

Page

exception

java.lang.Throwable

Page

 


### PageContext 的详细用法及常见场景 #### 什么是 PageContext? `PageContext` 是 JSP 提供的一个内置对象,它是一个接口,实现了 `javax.servlet.jsp.PageContext` 接口。该对象用于管理当前页面的上下文环境,提供了访问其他八个内置对象的方法,并允许开发者操作这些对象[^3]。 --- #### 主要功能 以下是 `PageContext` 对象的主要功能及其用途: 1. **获取其他内置对象** 使用 `PageContext` 可以轻松获取到其他的八大内置对象(request, response, out, session, application, config, page 和 exception)。例如: ```java HttpServletRequest request = (HttpServletRequest) pageContext.getRequest(); HttpServletResponse response = (HttpServletResponse) pageContext.getResponse(); HttpSession session = pageContext.getSession(); ``` 2. **设置和获取属性** `PageContext` 支持在四个作用域(pageScope、requestScope、sessionScope、applicationScope)中存储和检索数据。 - 设置属性: ```java pageContext.setAttribute("attributeName", "value", PageContext.SESSION_SCOPE); ``` - 获取属性: ```java String value = (String) pageContext.getAttribute("attributeName", PageContext.SESSION_SCOPE); ``` 3. **处理异常** 当发生错误时,可以通过 `PageContext` 来捕获异常并跳转到特定的错误页面。 ```java try { throw new Exception("Test Error"); } catch (Exception e) { pageContext.forward("/error.jsp"); } ``` 4. **包含文件** 类似于 `<jsp:include>` 标签的功能,可以使用 `PageContext` 实现动态包含。 ```java pageContext.include("/header.jsp"); ``` 5. **转发请求** 将请求转发至另一个资源。 ```java pageContext.forward("/nextPage.jsp"); ``` 6. **释放资源** 调用 `release()` 方法来清理分配给此页的所有资源。 ```java pageContext.release(); ``` 7. **自定义范围** 开发者可以根据需求,在不同范围内共享变量,从而实现更灵活的数据传递机制。 --- #### 常见应用场景 1. **跨多个作用域的操作** 在实际开发过程中,经常需要在一个作用域内读取或写入数据,而通过 `PageContext` 则能方便地完成这一目标。比如将某个用户的登录状态保存到 Session 中以便后续页面使用。 2. **统一控制逻辑** 如果项目中有许多重复性的业务逻辑,则可以在单独的 Java 文件里编写通用函数并通过 `PageContext` 进行调用,减少冗余代码量的同时提高可维护性。 3. **定制化错误处理流程** 结合 `try-catch-finally` 构造以及 `forward/redirect` 方法来自定义一套完整的错误响应策略。 4. **模块化的视图设计** 利用 include 或 forward 特性构建分层结构清晰的应用界面布局方案。 --- #### 示例代码 下面展示如何利用 `PageContext` 完成一些基本任务: ##### 动态包含头尾部模板 ```java <% pageContext.include("/templates/header.jsp"); // 加载头部模板 %> <!-- 页面主体 --> <div>这里是主要内容区域</div> <% pageContext.include("/templates/footer.jsp"); // 加载底部模板 %> ``` ##### 错误重定向 ```java <% try { int result = Integer.parseInt(null); // 故意制造 NullPointerException } catch (NumberFormatException ex) { pageContext.forward("/errors/error_404.jsp?message=" + URLEncoder.encode(ex.getMessage(), "UTF-8")); } %> ``` ##### 属性存取演示 ```java <% // 存储一个名为 user 的属性到 SESSION 范围下 pageContext.setAttribute("user", "John Doe", PageContext.SESSION_SCOPE); // 后续某处取出这个值 String userName = (String) pageContext.getAttribute("user", PageContext.SESSION_SCOPE); out.println("Welcome back, " + userName); %> ``` --- #### 总结 综上所述,`PageContext` 不仅简化了对各种内置对象的操作过程,还增强了程序间的交互能力与灵活性。合理运用它可以显著提升 Web 应用的设计质量与运行效率[^1][^2]. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值