EL 表达式

个人对这部分的内容级别定义为:"看看就行"

EL 表达式

JSP 2.0 的最重要特性就是表达式语言(EL),EL 的目的是帮助程序员编写无脚本的 JSP 页面。

最初 EL 表达式被创造出来是为了 JSTL 服务,配合 JSTL 使用的。不过从 JSP 2.0 开始即便项目中没有引入 JSTL,也可以(单独)使用 EL 。

EL 的默认关闭

在 Servlet 3.0 以下版本中,EL 表达式的功能默认是关闭的。

如何判断你的项目使用的是哪个 Servlet ?可以查看你的 web.xml 配置文件的头部声明。

通常情况下,我们一般不会使用 3.0 以下(甚至是 3.0)版本,最常见的至少是 3.1 版本起。但是,有时我们通过开发工具去自动创建 Web 项目时,很有被创建出来的项目默认的 Servlet 版本会偏低。因为这些工具的模板会偏老旧。

如果因为某些原因,你使用的是低版本的 Servlet,记得要将 EL 表达式的功能打开。

在 JSP 的 page 指令中,通过 isELIgnored 属性可以在当前页面 启用/禁止 EL 表达式。

或者在 web.xml 作出全局性设置:

xml 复制代码
<jsp-config>
    <jsp-property-group>
        <url-pattern>*.jsp</url-pattern>
        <el-ignored>false</el-ignored>
    </jsp-property-group>
</jsp-config>

EL 语法

EL 表达式以 ${ 开头,并以 } 结束,其结构为 ${ 表达式 },其计算结果的类型是一个『字符串』。

EL 表达式的结果值可以是任何类型,但是浏览器会将其值以字符串形式(toString 方法)的形式将其「替换」到 EL 表达式所处位置。

EL 表达式可以返回任意类型的值。如果 EL 表达式的结果是一个带有属性的对象,则可以利用 [ ] 或者 . 运算符来访问该属性。如果是使用 [ ] ,属性名需要用引号括起来。例如:

  • ${object["propertyName"]}

  • ${object.propertyName}

如果,propertyName 不是一个有效的 Java 变量名,例如:accept-language,那么,此时只能使用 [ ] 语法,而不能使用 . 语法。

如果,对象的属性碰巧又是另一个对象,那么可以用 [ ],也可以使用 . 运算符来访问第二个对象的属性。例如:

  • ${pageContext["request"]["servletPath"]}

  • ${pageContext.request["servletPath"]}

  • ${pageContext.request.servletPath}

  • ${pageContext["request"].servletPath}

如果 object 的类型是一个 Map,那么,这里使用的是键值对的键:${object["key"]}

如果 object 的类型是一个 Array 或 List,那么这里使用的是其下标索引:${object[0]} 。这里的下标索引 0 没有使用 "",它必须是一个数字。

EL 隐式对象

在 JSP 页面中,可以利用 JSP 脚本来访问 JSP 隐式对象,

注意,在页面上显示 EL 表达式的值时,不需要 out.print() 或者 <%= %> ,容器会执行 EL 表达式并将其结果「写在」它所在的位置。

隐含对象 描述
pageContext 当前 JSP 页面的 pageContext 对象
initParam Application 的初始化参数,初始化参数通常是在 web.xml 中通过 <context-param> 及其子元素 <param-name><param-value> 配置项配置
param 一个包含了所有请求参数的 Map,其中请求参数名为 key。不过,它无法处理一个请求参数,多个值的情况。通过 key 始终只有第一个值返回。
paramValues 和 param 类似,不过它可以处理一个参数名有多个参数值的情况。不过,如果参数只有一个值,它的返回值仍然是一个数组
applicationScope 包含了 ServletContext 对象中所有属性的 map,并用属性名作 key。
sessionScope 包含了 HttpSession 对象中所有属性的 Map,并用属性名作 key。
requestScope 包含了 HttpServletRequest 对象中所有属性的Map,并用属性名作key。
pageScope 包含了全页面范围内的属性的 Map,并用属性名作 Key。
cookie 包含了当前请求对象中所有 Cookie 对象的Map。以 Cookie 的名称作为 key,并且每一个 key 都映射到一个 Cookie 对象。
header HTTP 请求信息头,字符串
headerValues HTTP 信息头,字符串数组。对应一个请求名,多个请求值的情况。通过 key 取出的始终是数组。

E L表达式所提供的隐式对象中,并没有 request、response、session、application、out 等这些JSP中所存在的隐式对象。这是 EL 隐式对象与 JSP 隐式对象的区别。

不过 EL 的隐式对象中有 pageContext(和 JSP 中一样),通过它我们依旧可以访问到上述这些 JSP 中直接提供,但 EL 中没有直接提供的对象。

EL 表达式中可以使用 + 、- 、*、/、% 五种算数运算符。

EL 表达式中可以使用 &&、||、! 三种逻辑运算符。

EL 表达式中可以使用 ==、!=、>、>=、<、<= 六种关系运算符。

EL 表达式中提供了一个 empty 运算符专门用于 空和非空 的判断(当然,你也可以用 == null 判断)。例如:

java 复制代码
${empty X}

X 为 null,或者 X 是一个空字符串,或者 X 是一个空数组、空List、空Map、空Set,它都将返回 true 。

相关推荐
珹洺6 小时前
JSP技术入门指南【一】利用IDEA从零开始搭建你的第一个JSP系统
java·开发语言·前端·html·intellij-idea·jsp
仙人掌_lz2 天前
如何在本地使用Ollama运行 Hugging Face 模型
java·人工智能·servlet·ai·大模型·llm·ollama
bob_young3 天前
gerrit配置及使用git-lfs
git·elasticsearch·servlet
枫super4 天前
Servlet、HTTP与Spring Boot Web全面解析与整合指南
spring boot·后端·http·servlet·java-ee·idea·javase
howard20055 天前
3.1.3.2 Spring Boot使用Servlet组件
spring boot·servlet
珹洺5 天前
Java-servlet(完结篇)过滤器乱码解决与监听器
java·运维·服务器·hive·servlet·jsp
麻芝汤圆7 天前
利用Hadoop MapReduce实现流量统计分析
大数据·开发语言·hadoop·分布式·servlet·mapreduce
麻芝汤圆11 天前
MapReduce 的广泛应用:从数据处理到智能决策
java·开发语言·前端·hadoop·后端·servlet·mapreduce
magic 24515 天前
监听器(Listener)详解
java·servlet·tomcat
珹洺16 天前
Java-servlet(十)使用过滤器,请求调度程序和Servlet线程(附带图谱表格更好对比理解)
java·开发语言·前端·hive·hadoop·servlet·html