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表达式的主要内容,如果未能解决你的问题,请参考以下文章

jsp--EL表达式

jsp中的EL表达式

Jsp入门EL表达式_学习笔记

第五条知识点

EL表达式

EL表达式的基本知识