EL表达式
Posted 小智RE0
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了EL表达式相关的知识,希望对你有一定的参考价值。
EL(Expression Language) 表达式
可简化在JSP开发中对对象的引用,规范代码,增强维护性.
获取request(请求),pageContext(页面),session(会话),application(应用)这些对象的属性
简化代码,可获取指定对象属性的数据,可进行自动类型转换,以及输出到页面上.
El语法
以“${”
作为开始,以“}”
作为结束
直接使用变量名获取值
例如:之前获取属性值需要使用getAttribute("指定属性")
获取执行属性的值;而使用El表达式;可直接${指定属性}
注意:使用El表达式后,获取到null值,不会打印在页面上.
例如:在未使用el表达式之前,要获取对象的属性值;需要先获取数据,然后进行强制类型转换,再去打印输出到页面.
使用el表达式后;
${errorMsg}
算术运算符
运算符 | 注释 |
---|---|
+ | 加法 (注意:没有字符连接功能 ) |
- | 减法 |
* | 乘法 |
/(div) | 除法 |
%(mod) | 取模运算 |
案例,获取属性中的值,即使为字符串的数值,也能自动转换为数字,而字符是不能转换到数字的,会出现数字格式化异常 NumberFormatException
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
//定义三个属性的值;
request.setAttribute("num0",123);
request.setAttribute("num1","123");
request.setAttribute("num2","hello");
%>
<%--数字与数字字符串--%>
${num0+num1}
</body>
</html>
计算得出 246
当计算数字和字符串相加时
${num0+num2}
比较运算符
运算符 | 注释 |
---|---|
== 或者 eq | 判断两边是否相等, |
!= 或者 ne | 判断是否不相等 |
< 或者 lt | 判断左边是否小于右边 |
> 或者 gt | 判断左边是否大于右边 |
<= 或者 le | 判断左边是否小于等于右边 |
>= 或者 ge | 判断左边是否大于等于右边 |
案例练习
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
request.setAttribute("num0", 123);
request.setAttribute("num1", 23);
request.setAttribute("str0", "123");
request.setAttribute("str1", "hello");
request.setAttribute("str2", "hello");
%>
<%--比较运算符--%>
<%-- == (eq) 是否相等--%>
${num0 == num1} <br/>
${num0 eq num1} <br/>
<%-- != (ne) 是否不相等--%>
${str0 != str1} <br/>
${str0 ne str1} <br/>
<%-- < (lt) 是否小于--%>
${num0 < str0} <br/>
${num0 lt str0} <br/>
<%-- > (gt) 是否大于--%>
${num0 > num1} <br/>
${num0 gt num1} <br/>
<%-- <= (le) 是否小于等于--%>
${num0 <= num1} <br/>
${num0 le num1} <br/>
<%-- >= (ge) 是否大于等于--%>
${num0 >= num1} <br/>
${num0 ge num1} <br/>
</body>
</html>
页面输出:
false
false
true
true
false
false
true
true
false
false
true
true
逻辑运算符
类型 | 运算符 | 注释 |
---|---|---|
短路与 | && 或 and | 两边的比较都为true时,结果就为true,否则为false |
短路或 | || 或 or | 只要有一边比较为true,结果就为true,否则为false |
逻辑非 | ! 或 not | 相反的结果 |
案例练习
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
request.setAttribute("num0",527);
request.setAttribute("num1",123);
%>
<%--逻辑运算符--%>
<%--短路与 && (and)--%>
${(num0 == num1) && (num0 > num2)} <br/>
${(num0 == num1) and (num0 > num1)} <br/>
<%--短路或 || (or)--%>
${(num0 == num1) || (num0 > num1)} <br/>
${(num0 == num1) or (num0 > num1)} <br/>
<%--逻辑非 ! (not)--%>
${!(num1 == num0)} <br/>
${not (num1 == num0)} <br/>
</body>
</html>
页面输出:
false
false
true
true
true
true
验证empty运算符与条件运算符
类型 | 运算符 | 注释 |
---|---|---|
empty运算符 | empty | 检索属性值是否为null或者empty"", 若符合则返回true,例如${empty user.name} 判断user对象中的name是否为null ,类似于判断 null 以及空字符串""; |
条件运算符 | ? : | 用法示例 ${条件?value1:value2} ,若条件为真,则表达式的值为value,否则为value2 ,类似于java中的三元运算符. |
案例练习
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
request.setAttribute("name0","");
request.setAttribute("name1",null);
request.setAttribute("name2","张三");
request.setAttribute("choose","A");
%>
<%--empty运算符--%>
${empty name0}<br/>
${empty name1}<br/>
${empty name2}<br/>
<%--条件运算符--%>
<%--使用选择框作为案例--%>
${choose=="B"?"打印A":"打印B"}<br/>
</body>
</html>
页面输出:
true
true
false
打印B
. 运算符
用来获取对象的引用属性,
例如新建了Person的对象引用person,Person里面有个属性name,
那么就可以用 ${person.name}来获取name
默认调用get方法;
注意类里面的属性名要规范,不要出现定义属性名大写开头,不要自定义的get,set方法名.避免出现数据获取不到的异常.
案例练习
创建Person类
/**
* 练习 el表达式的 .运算符
*/
public class Person {
//定义姓名年龄属性;
private String name;
private int age;
//有参构造方法;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
//getter,setter方法;
public String getName() {
System.out.println("获取姓名方法");
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
System.out.println("获取年龄方法");
return age;
}
public void setAge(int age) {
this.age = age;
}
}
编写elStudy04.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
Person person=new Person("汤姆",2);
request.setAttribute("person",person);
%>
获取对象引用==>;
${person} <br/>
获取姓名==>;
${person.name} <br/>
获取年龄==>:
${person.age} <br/>
</body>
</html>
页面输出:
获取对象引用==>; com.xiaozhi.bean.Person@7d4f9f6
获取姓名==>; 汤姆
获取年龄==>: 2
实际上在获取属性时默认调用了get方法
隐式对象
隐式对象 | 注释 |
---|---|
pageScope | 返回页面范围的变量名 ,这些名称已经映射到对应的值 |
requestScope | 返回请求范围的变量名 ,这些名称已经映射到对应的值 |
sessionScope | 返回会话范围的变量名 ,这些名称已经映射到对应的值 |
applicationScpoe | 返回应用范围内的变量名, 并将变量名映射到对应的值 |
-
el表达式的隐式对象机制可以读取使用JSP内置对象pageContext、request、session以及application的
setAttribute()方法所设定的对象的数值
;不可以取得其他信息。 -
若没有指定的获取的是哪个域对象,则先后顺序为pageScope、requestScope、sessionScope和applicationScope。(尤其是几个域对象有同名属性时.)
-
要获取指定的域对象属性:
${对应的隐式对象 . 属性}
案例练习
- 当几个域对象出现同名属性时.
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--设置同名属性--%>
<%
request.setAttribute("name","request数据");
pageContext.setAttribute("name","pageContext数据");
session.setAttribute("name","session数据");
application.setAttribute("name","application数据");
%>
获取==>
${name}
</body>
</html>
页面输出,获取到的是当前页面page的属性.
获取==> pageContext数据
将pageContext属性设置去掉,再次运行
页面输出,获取到的是请求request的属性
获取==> request数据
将request属性设置也去掉,再次运行
页面输出,获取到的是会话session的属性
获取==> session数据
- 获取指定域对象的属性时;
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
request.setAttribute("name","request数据");
request.setAttribute("test2","requestTest2");
pageContext.setAttribute("name","pageContext数据");
session.setAttribute("name","session数据");
application.setAttribute("name","application数据");
application.setAttribute("test","applicationTest");
%>
指定获取application的test属性==>
${applicationScope.test} <br/>
指定获取application的name属性==>;
${applicationScope.name} <br/>
指定获取request的test2属性==>
${requestScope.test2} <br/>
指定获取pageContext的name属性==>;
${pageScope.name} <br/>
</body>
</html>
页面输出;
指定获取application的test属性==> applicationTest
指定获取application的name属性==>; application数据
指定获取request的test2属性==> requestTest2
指定获取pageContext的name属性==>; pageContext数据
以上是关于EL表达式的主要内容,如果未能解决你的问题,请参考以下文章