Java Web程序设计笔记 • 【第9章 EL表达式】

时间:2022-03-10 13:57:08

全部章节   >>>>


本章目录

9.1 EL 表达式基础

9.1.1 EL 表达式简介

9.1.2 EL 表达式的定义

9.1.3 使用 EL 访问变量

9.1.4 使用 EL 访问 JavaBean

9.1.5 禁用 EL 表达式

9.1.6 实践练习

9.2 EL 隐含对象

9.2.1 EL 隐含对象

9.2.1 pageContext 对象

9.2.2 获取参数隐含对象

9.2.2 pageContext 对象

9.2.3 访问作用域范围的隐含对象

9.2.4 实践练习

9.3 EL 表达式的运算符(一)

9.3.1 EL 表达式的运算符

9.3.1 存储数据运算符

9.3.2 算术运算符

9.3.3 关系运算符

9.3.4 逻辑运算符

9.3.5 实践练习

9.4 EL 表达式的运算符(二)

9.4.1 empty 运算符

9.4.2 条件运算符

9.4.3 运算符的优先级别

9.4.4 EL 表达式中的保留字

9.4.5 实践练习

总结:


9.1 EL 表达式基础

9.1.1 EL 表达式简介

JSP中为了输出动态内容,需要使用嵌入Java脚本,这会使JSP页面变的非常难以维护

表达式语言(Expression Language,EL)是一种简单的数据访问语言,基本的语法格式为“${ 表达式 }”,主要用于在页面上生成动态内容,并代替 JSP 脚本元素

Java Web程序设计笔记 • 【第9章 EL表达式】

9.1.2 EL 表达式的定义

EL表达式在JSP页面中以 ${}的格式出现,当JSP 引擎在解析 JSP 页面的过程中遇到“${ 表达式 }”格式的字符序列时,将调用 EL 引擎解释并执行“{ }”中的表达式

它具有3 个特点:

  • 使用属性名方便地引用存储在各种域范围中的属性
  • 使用${JavaBean.property} 的形式访问作用域中 JavaBean 对象的属性
  • 使用一系列的隐含对象,如 pageContext 对象、request 对象和 session对象

9.1.3 使用 EL 访问变量

示例:EL表达式访问变量格式为${变量名}

<%
int chinese = 89; // 定义语文分数
int english = 80; // 定义英语分数
int mathematics = 100; // 定义数学分数
pageContext.setAttribute("chinese", new Integer(chinese)); // 放入 page 范围内
pageContext.setAttribute("english", new Integer(english));
pageContext.setAttribute("mathematics", new Integer(mathematics));
%>
<h3>
★★★★★★成绩信息★★★★★★ <br> 语文 :${chinese }<br> 英语 :${english }<br>
数学 :${mathematics }<br> 总分:${chinese+english+mathematics }<br>
平均分 :${(chinese+english+mathematics)/3.0 }<br> ★★★★★★成绩信息★★★★★★
</h3>

Java Web程序设计笔记 • 【第9章 EL表达式】

9.1.4 使用 EL 访问 JavaBean

EL表达式访问JavaBean属性时,语法为${bean对象.属性名}或${bean对象[“属性名”]},调用的是对应的get方法,所以必须提供get方法才能正常调用

注意:首字母需要小写

  • 类中提供下列方法
public class User{
public String getUserName(){
return “jack”;
}
}

EL表达式不会直接调用属性,而是使用对应getXXX方法

对应EL表达式语法为:${bean对象.userName}

示例:访问JavaBean对象中的属性数据

public class Circle {
private double r; // 半径
private final double PI = 3.14;
// 得到圆的面积
public double getArea() {
return r * r * PI;
}
// 得到体积
public double getVolume() {
return 4 / 3.0 * PI * r * r * r;
}
// 球的表面积
public double getSurface() {
return 4 * PI * r * r;}
}
<!-- 实例化一个 Circle 对象 -->
<jsp:useBean id="circle" class="com.text.Circle" />
<!-- 为半径赋值 -->
<jsp:setProperty name="circle" property="r" value="2" />
<h3>
★★★★★★球面积计算信息★★★★★★<br> 半径 :${circle.r }<br> 圆面积 :${circle["area"] }<br>
球表面积 :${circle.surface }<br> 球体积 :${circle.volume }<br>
★★★★★★球面积计算信息★★★★★★
</h3>

9.1.5 禁用 EL 表达式

JSP 2.0 为了向下兼容以前的 JSP 页面,特别提供了在 JSP 页面中忽略 EL 表达式的设置选项。禁用 EL 的方法有以下 3 种

在 web.xml 中配置 <el-ignored> 元素,实现整个项目全局禁用

 <!-- 配置 jsp-config 配置节 -->
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<!-- 指定匹配模式为 JSP -->
<el-ignored>true</el-ignored>
<!-- 设置忽略 EL 表达式 -->
</jsp-property-group>
</jsp-config>

在 JSP界面中使用指令,禁用当前JSP界面使用EL表达式

<%@ page isELIgnored="true" %> 

在“${}”之前添加“\”,即在一行代码中禁用 EL 表达式

  • 不禁用:${3+9} ,输出12
  • 禁用 : \${3+9 } ,输出:${3+9}

9.1.6 实践练习

9.2 EL 隐含对象

9.2.1 EL 隐含对象

为了更方便的读取Cookie、HTTP 请求消息头字段、请求参数以及 Web 应用程序的初始化参数等信息,JSP中定义了如下隐含对象

隐含对象名

作用

pageContext

对应于 JSP 页面中的 pageContext 对象

pageScope

代表 page 域中用于保存属性的 Map 对象

requestScope

代表 request 域中用于保存属性的 Map 对象

sessionScope

代表 session 域中用于保存属性的 Map 对象

applicationScope

代表 application 域中用于保存属性的 Map 对象

param

表示一个保存了所有请求参数的 Map 对象

paramValues

如同getParameterValues(String name),回传String[]类型的值

header

表示一个保存了所有 http 请求头字段的 Map 对象

headerValues

如同getHeaders(String name),返回 string[ ] 数组

cookie

表示一个保存了所有 cookie 的 Map 对象

initParam

表示一个保存了所有 Web 应用初始化参数的 Map 对象

不要将 EL 表达式中的隐含对象与 JSP 隐含对象混淆,其中只有 pageContext 对象是两者共用的

9.2.1 pageContext 对象

pageContext 对象用于访问 JSP 隐含对象,也可用于取得一个 JSP 页面的各种请求信息

${pageContext.request.requestURL}代表获取request对象中的requestURL属性,相当于

request.getRequestURL()方法

${pageContext.request.contextPath}代表获取request对象中的contextPath路径属性

示例:通过pageContext获取request对象中的信息

<table border="1" align="center">
<tr><td> 对 pageContext 隐含对象的调用 </td></tr>
<tr><td>${pageContext.request.queryString}</td></tr>
<tr><td>${pageContext.request.requestURL}</td></tr>
<tr><td>${pageContext.request.contextPath}</td></tr>
<tr><td>${pageContext.request.method}</td></tr>
</table>

Java Web程序设计笔记 • 【第9章 EL表达式】

9.2.2 获取参数隐含对象

隐含对象 param 和 paramValues 用于获取客户端在访问 JSP 页面时传递的请求参数值

  • param获取请求中指定一个参数名对应的值,返回String字符串
  • paramValues获取请求中一组相同名称对应的值,返回String字符串数组

9.2.2 pageContext 对象

示例:通过param获取请求中的参数值

Java Web程序设计笔记 • 【第9章 EL表达式】

<tr>
<td width="81"> 姓名 </td>
<td width="266">${param.txtName }</td>
</tr>
<tr>
<td> 性别 </td>
<td>${param.radSex }</td>
</tr>
<tr>
<td> 职业 </td>
<td>${param.selProfession}</td>
</tr>
<tr>
<td> 喜欢的图书 </td>
<td>${paramValues.chkBook[0]} ${paramValues.chkBook[1]}
${paramValues.chkBook[2]} ${paramValues.chkBook[3]}
</td>
</tr>
<tr align="right">
<td colspan="2">
<a href="javascript:history.go(-1)"> 返回 </a>
</td>
</tr>

9.2.3 访问作用域范围的隐含对象

pageScope、requestScope、sessionScope 和 applicationScope 这 4 个隐含对象分别用于访问 JSP 页面的 page、request、session 和 application 4 个作用域中的属性

如表达式 ${pageScope.userName}返回 page 作用域中的 userName 属性的值

实际使用时无需加入pageScope或sessionScope等,EL表达式会默认从page、request、session、application从小到大搜索,找到后则不会继续向后搜索

只有当page、request中都存在同样名称属性值时,才会加入scope

示例:作用域范围隐含对象的使用

<%
pageContext.setAttribute("bookName", " 访问放入 page 范围内的 Java");
request.setAttribute("bookName", " 访问放入 request 范围内的 Java");
session.setAttribute("bookName", " 访问放入 session 范围内的 Java");
%>
★★★★★★ EL 访问作用域范围的隐含对象★★★★★★
<br /> \${pageScope.bookName}:${pageScope.bookName }
<br /> \${requestScope.bookName}:${requestScope.bookName }
<br /> \${sessionScope.bookName }:${sessionScope.bookName }
<br /> \${bookName }:${bookName }
<br />

Java Web程序设计笔记 • 【第9章 EL表达式】

9.2.4 实践练习

9.3 EL 表达式的运算符(一)

9.3.1 EL 表达式的运算符

为了方便JSP中实现计算和逻辑判断功能,EL表达式提供了如下几种运算符:

  • 存取数据运算符
  • 算术运算符
  • 关系运算符
  • 逻辑运算符
  • 条件运算符
  • empty 运算符。

9.3.1 存储数据运算符

在 EL 表达式中可以使用运算符"[]"和"."来取得对象的属性,如 ${user.name} 或者 ${user["name"]} 表示取出对象 user 中的 name 属性值

books 数组中第一个元素的值是:${sessionScope.books[0] }
<hr />
people 数组中第二个元素的值是:${sessionScope.people[1] }
<hr />
objList 集合中的每个元素都是一个数组,该集合中第二个数组中第一个元素的值是: ${sessionScope.objList[1][0] }

9.3.2 算术运算符

算术运算符可以作用于整数和浮点数。EL 表达式中的算术运算符主要有 5 个

运算符类型

运算符

作用

算术运算符

+

执行加法操作,如${5+3} 结果为8

-

执行减法操作,如${5-3} 结果为2

*

执行乘法操作,如${5*3} 结果为15

/或div

执行除法操作,如${5/3} 结果为1

%或mod

执行取模操作,如${5%3} 结果为2

EL表达式无法像Java一样将两个字符串用“+”运算符相连接,如${"a"+"b"}的写法是错误的,但可以使用${"a"}${"b"}的写法来表示。

9.3.3 关系运算符

关系运算符作用在整数和浮点数上,可以依据字母的顺序比较两个字符串的大小:

运算符类型

运算符

作用

关系运算符

== 或 eq

判断符号两边是否相等,返回boolean值

!= 或 ne

判断符号两边是否不相等

< 或 lt

判断符号左边是否小于右边

> 或 gt

判断符号左边是否大于右边

<= 或 le

判断符号左边是否小于或等于右边

>= 或 ge

判断符号左边是否大于等于右边

在使用 EL 关系表达式时,不能写成 ${param.password1}==${param.password2},而应写成 ${param.password1==param.password2}

9.3.4 逻辑运算符

逻辑运算符主要用于连接多个关系运算符,实现并且、或者关系判断,EL 表达式中的逻辑运算符主要包含3个

运算符类型

运算符

作用

关系运算符

&& 或 and

并且,例如

${userName==”jack”and userPwd==”jack123”}

||    或 or

或者,例如

${userName==”jack”or userPwd==”jack123”}

!     或 not

取反,例如

${not param.iMen}

9.3.5 实践练习

9.4 EL 表达式的运算符(二)

9.4.1 empty 运算符

empty 运算符是一个前缀运算符,用于判断对象或变量是否为 null 或空

语法:

${empty  变量或对象 }

(1)当  ${empty A} 指向的A对象为 null 时,表达式 ${empty A} 返回 true

(2)当  ${empty A} 中A 是空字符串时,表达式 ${empty A} 返回 true

(3)当  ${empty A}当 A 是集合或数组时,如果 A 中没有任何元素,则表达式 ${empty A} 返回 true

9.4.2 条件运算符

条件运算符的格式为:A?B:C,它表示根据表达式 A 的结果选择执行 B 或 C,类似于Java中的三目判断运算符

首先将表达式 A 的计算结果转换为布尔型,如果表达式 A 的计算结果为 true,则执行 B 并返回表达式 B 的值;如果计算结果为 false,则执行表达式 C 并返回表达式 C 的值。

例如,表达式 ${1==2?3:4} 的运行结果为 4

9.4.3 运算符的优先级别

EL 中的运算符有不同的运算优先级,而同一行中的运算符,则按照运算符在表达式中的顺序从左到右依次进行计算。所有运算符的优先级别从高到低如下

[ ] ( )

not ! empty

算术运算符

关系运算符

逻辑运算符

三目运算符

9.4.4 EL 表达式中的保留字

EL 表达式在定义的时候占用了一系列保留字,在为变量命名时,应该避免使用这些保留字

EL 表达式中的保留字

and

eq

gt

true

instanceof

div

or

ne

le

false

empty

mod

not

lt

ge

null

9.4.5 实践练习

总结:

  • EL表达式是一种为了替换页面上复杂繁琐的脚本而产生的表达式语言,其语法格式为${  }
  • EL表达式可以依次从page、request、session、application四个作用域取出数据使用,简化了以前取数据时麻烦的写法
  • EL表达式中包含了很多隐含对象,可以帮助获取JSP中的相关信息,如pageContext、pageScope、sessionScope、param等
  • EL表达式中可以进行运算,常用的包含算术运算符、关系运算符、逻辑运算符
  • EL表达式判断是否为空时使用empty,在取反时使用not