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 。

相关推荐
XXXJessie4 小时前
c++249多态
java·c++·servlet
dawn1912285 小时前
SpringMVC 中的域对象共享数据
java·前端·servlet
代码代码快快显灵5 小时前
Servlet
servlet
readmancynn5 小时前
Servlet
hive·hadoop·servlet
.生产的驴17 小时前
SpringBoot 消息队列RabbitMQ在代码中声明 交换机 与 队列使用注解创建
java·spring boot·分布式·servlet·kafka·rabbitmq·java-rabbitmq
SuperherRo1 天前
蓝队技能-应急响应篇&Web内存马查杀&JVM分析&Class提取&诊断反编译&日志定性
servlet·filter·蓝队·内存马
落落落sss1 天前
sharding-jdbc分库分表
android·java·开发语言·数据库·servlet·oracle
ChinaRainbowSea1 天前
十三,Spring Boot 中注入 Servlet,Filter,Listener
java·spring boot·spring·servlet·web
前端小马2 天前
解决IDEA出现:java: 程序包javax.servlet不存在的问题
java·servlet·intellij-idea
寻爱的希斯克利夫2 天前
tomcat 配置jenkins_home 目录
servlet·tomcat·jenkins