jsp:EL之$(pageContext.request.contextPath)和$(requestScope.contextPath)区别

本文解析了EL表达式中$(pageContext.request.contextPath)与$(requestScope.contextPath)的区别,阐述了它们分别对应的对象及作用域,并通过实例说明如何正确使用。

i.首先声明,EL之所以出现,目的:为了使jsp写起来更加简单。

ii.下面说说$(pageContext.request.contextPath)和$(requestScope.contextPath)区别:

首先陈述下我遇到的问题,众所周知,在项目中使用$(pageContext.request.contextPath)可以获取到当前部署项目的应用名称,后来我突发奇想,使用$(requestScope.contextPath)一样也可以获取到呀。


可是结果不然,获取不到。。。其实这个问题纠结了我有一段时间。。。感谢同事lumx后来的提醒。


其实从刚开始我弄混了一个概念,认为使用$(pageContext.request}获取到的对象和$(requestScope}获取到的对象是同一个对象,显然不是。


首先特别自我提醒:jsp的内置对象和EL的隐身对象不是同一个东西,要区分开来。


$(pageContext.request}获取的是HttpServletRequest对象,说白了是jsp内置对象之一request,而$(requestScope}获取到的仅仅是当前请求作用域内的对象(说的还是不明白,反正不是同一个东西就是了,再进一步陈述一下吧(OS:好纠结呀),requestScope是EL的内置对象之一,只有放了才能取,否则是取不到的)。

在EL中取值的时候,使用万能的pageContext,因为他包含了其他属性。个人理解:它是EL和jsp内置对象之间沟通的桥梁。


脚本之家中有篇文章讲的还可以:http://www.jb51.net/article/20042.htm

优快云中关于jsp九大内置对象的说明:http://blog.youkuaiyun.com/yangbobo1992/article/details/8174489

<think>我们正在讨论JSP中的pageContext.request。根据引用,pageContext对象是JSP内置对象之一,它可以访问其他内置对象,包括request。在JSP中,我们可以通过pageContext.getRequest()方法获取request对象。另外,引用[2]引用[4]提到,我们可以使用${pageContext.request.contextPath}来获取当前Web应用程序的上下文路径(即项目名称),这在生成绝对路径时非常有用。根据引用[3]中的示例,我们可以这样使用pageContext.request:1.JSP脚本中,通过pageContext.getRequest()获取HttpServletRequest对象。2.然后就可以使用该request对象的方法,例如获取属性等。另外,在EL表达式中,我们可以直接使用${pageContext.request.contextPath}来获取上下文路径,而不需要写脚本。下面我将给出具体的使用方法示例:</think>### JSPpageContext.request的使用详解 #### 1. **基本概念** - `pageContext.request` 是通过JSP内置对象`pageContext`访问`HttpServletRequest`的方式 - 主要用途: - 获取Web应用的上下文路径:`${pageContext.request.contextPath}` - 访问请求参数、头信息、会话等 - 操作请求作用域属性 - 等价关系:`${pageContext.request.contextPath} ≡ <%= request.getContextPath() %>`[^4] #### 2. **核心方法** ```java // 获取HttpServletRequest对象 HttpServletRequest req = (HttpServletRequest)pageContext.getRequest(); // 获取上下文路径(动态生成项目根路径) String contextPath = req.getContextPath(); // 获取请求参数 String param = req.getParameter("key"); // 操作请求作用域属性 req.setAttribute("data", value); // 设置属性 Object obj = req.getAttribute("data"); // 获取属性 ``` #### 3. **典型使用场景** **场景1:动态生成资源路径(避免硬编码)** ```jsp <!-- 在链接中使用 --> <a href="${pageContext.request.contextPath}/user/list">用户列表</a> <!-- 在图片路径中使用 --> <img src="${pageContext.request.contextPath}/static/logo.png"> ``` **场景2:在JSP脚本中访问请求对象**(引用[3]示例) ```jsp <%@ page contentType="text/html;charset=UTF-8" %> <% // 通过pageContext获取request对象 HttpServletRequest req = (HttpServletRequest) pageContext.getRequest(); // 设置请求作用域属性 req.setAttribute("message", "操作成功"); // 获取客户端IP String clientIP = req.getRemoteAddr(); %> 当前IP:<%= clientIP %> ``` **场景3:作用域属性操作** ```jsp <% // 设置不同作用域属性 pageContext.setAttribute("str", "pageScope", PageContext.PAGE_SCOPE); request.setAttribute("str", "requestScope"); // 精确获取作用域属性 String pageVal = (String)pageContext.getAttribute("str", PageContext.PAGE_SCOPE); String reqVal = (String)pageContext.getAttribute("str", PageContext.REQUEST_SCOPE); %> Page范围:<%= pageVal %> <br> <!-- 输出:pageScope --> Request范围:<%= reqVal %> <!-- 输出:requestScope --> ``` #### 4. **使用注意事项** 1. **作用域优先级** `pageContext`可访问四种作用域,优先级顺序: ```mermaid graph LR A[PAGE_SCOPE] --> B[REQUEST_SCOPE] --> C[SESSION_SCOPE] --> D[APPLICATION_SCOPE] ``` 当使用`pageContext.findAttribute("key")`时,按此顺序查找属性 2. **EL表达式优化** 现代JSP推荐使用EL表达式替代脚本: ```jsp <!-- 传统方式 --> <%= request.getContextPath() %> <!-- EL表达式方式 --> ${pageContext.request.contextPath} ``` 3. **与直接使用request区别** | 方式 | 优势 | 局限性 | |---|---|----| | `pageContext.request` | 统一访问所有内置对象 | 需类型转换 | | 直接`request`对象 | 无需转换 | 只能在_service方法或声明`<%@ page %>`的页面使用 | --- ### 相关问题 1. **如何在JSP中正确获取客户端浏览器信息?** 2. **`pageContext`对象如何访问sessionapplication作用域?** 3. **EL表达式`${pageContext.request.contextPath}`在Servlet中如何等价实现?** 4. **为什么推荐使用EL表达式代替JSP脚本访问request对象?** [^1]: [JSP pageContext技术整理(网文摘录)](引用1) [^2]: [pageContext.request.contextPath使用场景对比](引用2) [^3]: [pageContext操作作用域属性示例](引用3) [^4]: [${pageContext.request.contextPath}等效实现](引用4)
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值