第11章EL(表达式语言)
11.1 概述
11.1.1 EL表达式基本语法
${experssion}
参数说明
experssion 用于指定输出的内容,可以是字符串,也可以是由EL运算符组成的表达式。
11.1.2 EL的特点
- (1)EL语法简单,方便
- (2)EL可以与JSTL结合使用,也可以和JavaScript语句结合使用。
- (3)EL可以自动转换类型。
- (4)EL既可以访问一般的变量,也可以访问JavaBean中的属性和嵌套属性、集合对象。
- (5)EL中可以执行算术运算、逻辑运算、关系运算和条件运算等。
- (6)EL中可以获得命名空间(PageContext对象,他是页面中所有其他内置对象的最大范围的集成对象,通过它可以访问其他内置对象)。
- (7)EL中在进行除法运算时,如果除数是0,则返回无穷大Infinity,而不返回错误。
- (8)EL中可以访问JSP的作用域(request、session、application以及page)
- (9)扩展函数可以与Java类的静态方法进行映射。
11.2与低版本的环境兼容----禁用EL
11.2.1 使用斜杠\符号
\${experssion}
11.2.2 使用page指令
isELIgnored=true
<%@page isELIgnored="true"%>
该方法适合禁用一个jsp页面中的EL。
11.2.3 在web.xml中配置<el-igonred>元素
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<el-igonred>true</el-igonred>//此处true表示禁用EL ,false表示使用EL
</jsp-property-group>
</jsp-config>
11.3 保留关键字
and | eq | gt |
---|---|---|
instanceof | div | or |
le | false | empty |
not | llt | ge |
11.4 EL的运算符及优先级
序号 | 优先权 |
---|---|
1 | [] |
2 | 0 |
3 | -(负)、not、!、empty |
4 | *、/、div、%、mod |
5 | +、-(减) |
6 | <、>、<=、>=、lt、gt、le、ge |
7 | ==、!-、eq、ne |
8 | &&、and |
9 | ||、or |
10 | ${A?B:C} |
11.4.1 通过EL访问数据
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>EL表达式</title>
</head>
<body>
<%
String[] arr = {"Java web从入门到精通","Java开发规范手册","Java网络编程"};
request.setAttribute("book",arr); //将数组保存到request对象中
%>
<%
String[] arr1 = (String[])request.getAttribute("book"); //获取保存到request范围内的变量
//通过循环和EL输出一维数组的内容
for(int i = 0;i < arr1.length;i++){
request.setAttribute("requestI", i);
%>
${ requestI }: ${ book[requestI] }<br> <!-- 输出数组中第i个元素 -->
<%
}
%>
</body>
</html>
11.4.2 在EL中进行算术运算
运算符 | 功能 | 示例 | 结果 |
---|---|---|---|
+ | 加 | ${19+1} | 20 |
- | 减 | ${30-10} | 20 |
* | 乘 | ${2*3} | 6 |
/或div | 除 | {9 div 3}} | 3 |
%或mod | 求余 | {17 mod 3} | 2 |
11.4.3 在EL中判断对象是否为空
${empty expression}
11.4.4 在EL中进行逻辑关系运算
1.关系运算符
运算符 | 功能 | 示例 | 结果 |
---|---|---|---|
==或 eq | 等于 | ${10==10}或${10 eq 10} | true |
!= 或 ne | 不等于 | ${10!=10}或${10 ne 10} | false |
<或 lt | 小于 | ${7<6}或${7 lt 6} | false |
>或 gt | 大于 | ${7>6}或${7 gt 6} | true |
<= 或 le | 小于等于 | ${7<=5}或${7 le 6} | false |
>= 或 ge | 大于等于 | ${7>= 6} 或${7 ge 6} | true |
2.逻辑运算符
运算符 | 功能 | 示例 | 结果 |
---|---|---|---|
&& 或 and | 与 | ${true && false} 或${true and false} | false |
|| 或 or | 与 | ${true || false} 或${true or false} | true |
!或 not | 与 | ${!true} 或${not true} | false |
11.4.5 在EL中进行条件运算
和java三目运算法一样
${条件表达式?表达式1:表达式2}
11.5 EL的隐含对象
11.5.1 页面上下文对象(部分示例)
${pageContext.request}
${pageContext.request.serverPort}//获取端口,返回8080
${pageContext.response.contentType}//获取响应的内容类型,如返回"text/html;charset=UTF-8"
${pageContext.response.bufferSize } //获取bufferSize
11.5.2 访问作用域范围的隐含对象
在EL中提供了4个用于访问作用域范围的隐含对象,即pageScope、requestScope、sessionScope和applicationScope。应用这4个隐含对象指定所要查找的标识符的作用域后,系统 将不再按照默认的顺序(page、request、session以及application)来查找相应的标识符。
- (1)pageScope隐含对象
该对象用于返回包含page(页面)范围内的属性值的集合,返回值为java.util.Map对象。
例:通过pageScope隐含对象读取page范围内的JavaBean的属性值。
①创建一个名称为UserInfo的JavaBean,并将其保存到com.wgh包中。在该JavaBean中包含一个name属性,具体代码如下:
public class UserInfo {
private String name = ""; //用户名
/**
* 函数名称:setName
* 函数作用:name属性对应的set()方法
* @param name
*/
public void setName(String name) {
this.name = name;
}
/**
* 函数名称:getName
* 函数作用:name属性对应的get()方法
* @return name
*/
public String getName() {
return name;
}
}
②编写index_pageScope.jsp文件,在该文件中应用<jsp:useBean>动作标识,创建一个page范围内的JavaBean实例,并设置name属性的值为wgh;同时在<body>标签中应用pageScope隐含对象获取该JavaBean实例的name属性值,index_pageScope.jsp文件中的代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<jsp:useBean id="user" scope="page" class="com.wgh.UserInfo" type="com.wgh.UserInfo">
<jsp:setProperty name="user" property="name" value="java web从入门到精通"></jsp:setProperty>
</jsp:useBean>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>通过pageScope隐含对象读取page范围内的JavaBean的属性值</title>
</head>
<body>
${pageScope.user.name }
<br>
</body>
</html>
运行结果:
- (2)requestScope隐含对象
requestScope隐含对象用于返回包含request请求范围内的属性值的集合,返回值为java.util.Map对象。
例:要获取保存在request范围内的userName变量,可以使用一下代码:
<%
request.setAttribute("userName","mr"); //定义request范围内的变量userName
%>
${requestScope.userName}
- (3)sessionScope隐含对象
sessionScope隐含对象用来返回包含session会话范围内的属性的集合,返回值为java.util.Map对象。
<%
session.setAttribute("manager","mr"); //定义session范围内的变量marager
%>
${sessionScope.manager}
- (4)applicationScope隐含对象
applicationScope隐含对象用于返回包含application应用范围内的属性值的集合,返回值为java.util.Map对象。
例:要获取保存在application范围内的message变量,可以使用下面的代码:
1 <%
2 application.setAttribute("message","欢迎学习java"); //定义application范围内的变量message
3 %>
4 ${applicationScope.message}
11.5.3 访问环境信息的隐含对象
- param对象
如输入表单,当表单提交后,要获取name文本框的值
- param对象
<input name="name" type="text">
el获取
${param.name}
如果文本框可以输入中文,那么在应用EL输出其内容钱,还需要应用“request.setCharacterEncoding("GN18030");”否则会乱码
- paramValues对象
多选请求
- paramValues对象
<tr>
<td class="label">爱好:</td>
<td class="controler">
<input type="checkbox" name="favorite" value="nba"> NBA //favorite
<input type="checkbox" name="favorite" value="music"> 音乐 //favorite
<input type="checkbox" name="favorite" value="movie"> 电影 //favorite
<input type="checkbox" name="favorite" value="internet"> 上网 //favorite
</td>
</tr>
<% request.setCharacterEncoding("GB18030");%>
爱好为:${paramValues.affect[0]}${paramValues.affect[1]}${paramValues.affect[2]}${paramValues.affect[3]}
注意在应用 param和 paramValues对象时,如果指定的参数不存在,则返回空的字符串,而不是返回null。
- header和headerValues对象
${header.connection} 或者${header["connection"]}
- initParam对象
获取web应用初始化参数的值
如web.xml对象
- initParam对象
<web-app>
<context-param>
<param-name>encoding</param-name >
<param-value>utf-8</param-value >
</context-param>
</web-app>
jsp中获取encoding的值
<body>
initParam(初始化参数)encoding的值是:${initParam.encoding}
<!-- 返回utf-8 -->
</body>
- cookie对象
<!--cookie-1.jsp-->
<%@page contentType="text/html;charset=utf-8" %>
<html>
<body>
<%
response.addCookie(new Cookie("username","Make"));
%>
<a href="cookie-2.jsp"/>跳转cookie-2.jsp页面
</body>
</html>
<!--cookie-2.jsp-->
<%@ page contentType="text/html;charset=utf-8" %>
<html>
<body>
<h1>获得 cookie 对象</h1>
<hr>
<h3>${cookie.username.value}</h3>
</body>
</html>