全部章节 >>>>
本章目录
9.1 EL 表达式基础
9.1.1 EL 表达式简介
JSP中为了输出动态内容,需要使用嵌入Java脚本,这会使JSP页面变的非常难以维护
表达式语言(Expression Language,EL)是一种简单的数据访问语言,基本的语法格式为“${ 表达式 }”,主要用于在页面上生成动态内容,并代替 JSP 脚本元素
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>
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>
9.2.2 获取参数隐含对象
隐含对象 param 和 paramValues 用于获取客户端在访问 JSP 页面时传递的请求参数值
- param获取请求中指定一个参数名对应的值,返回String字符串
- paramValues获取请求中一组相同名称对应的值,返回String字符串数组
9.2.2 pageContext 对象
示例:通过param获取请求中的参数值
<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 />
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