轻松学会EL表达式

 

1、EL表达式的概念和主要功能

(1)概念

一句话概括:EL(Expression Language)是简化 jsp页面 数据的获取和遍历的机制。

也就是说,EL可以简化 jsp中表达式的写法,那什么是jsp表达式呢?就是在jsp页面中 “<%=xxx%>” 这种格式的语句咯。

jsp表达式的作用是什么呢?就是获取和输出数据。而EL表达式是对jsp表达式的简化,那使用EL表达式能干嘛,就是能方便的访问数据和打印出来呗。

(2)主要功能

  • 依次访问pageContext、request、session和application作用域对象存储的数据。

  • 获取请求参数值;
  • 访问Bean对象的属性;
  • 访问集合中的数据;
  • 输出简单的运算结果。

EL表达式的前提条件:从pageContextrequestsession 和 application 这几个jsp内置对象中获取数据。

pageContext:代表当前页面中有效;

request:代表当前请求中有效;

session:代表当前会话中有效;

application:代表当前服务器中有效。

作用范围:pageContext <  request < session < application

既然EL表达式的核心是从这些内置对象中取数据,那我们首先需要把数据放到内置对象中去,那怎么放进去呀?

设置属性:<%   内置对象.setAttribute("key", "value");  %>

接下来就针对EL表达式的主要功能一个一个讲解。

2、EL表达式访问内置对象的数据

(1)jsp原始方式

如:<%=request.getAttribute(“ varName”)%>

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>实现从内置对象中获取数据并打印</title>
</head>
<body>
<%
    pageContext.setAttribute("name1", "pageContext对象中的属性值:zhangfei");
    request.setAttribute("name2", "request对象中的属性值:guanyu");
    session.setAttribute("name3", "session对象中的属性值:liubei");
    application.setAttribute("name4", "session对象中的属性值:zhaoyun");
%>

<%-- 使用JSP中原始方式获取数据和打印--%>
<%= "name1的数值为:" + pageContext.getAttribute("name1") %><br/>   <%-- zhangfei --%>
<%= "name2的数值为:" + request.getAttribute("name2") %><br/>       <%-- guanyu --%>
<%= "name3的数值为:" + session.getAttribute("name3") %><br/>       <%-- liubei --%>
<%= "name4的数值为:" + application.getAttribute("name4") %><br/>   <%-- zhaoyun --%>

</body>
</html>

运行效果

 (2)EL表达式方式

如:${ varName }

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>实现从内置对象中获取数据并打印</title>
</head>
<body>
<%
    pageContext.setAttribute("name1", "pageContext对象中的属性值:zhangfei");
    request.setAttribute("name2", "request对象中的属性值:guanyu");
    session.setAttribute("name3", "session对象中的属性值:liubei");
    application.setAttribute("name4", "session对象中的属性值:zhaoyun");
%>

<%-- 使用EL表达式实现获取数据和打印 --%>
<h1>name1的数值为:${name1}</h1><br/>
name2的数值为:${name2}<br/>
name3的数值为:${name3}<br/>
name4的数值为:${name4}<br/>

</body>
</html>

执行效果

 怎么样,是不是很简单?只需要使用美元符号 ${属性名称} 这种格式即可。

(3)当内置对象属性名相同时,EL取值优先级

当几个内置对象设置的属性名称相同时,EL表达式会取哪个值呢?请看示例:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>实现从内置对象中获取数据并打印</title>
</head>
<body>
<%
    pageContext.setAttribute("name", "pageContext对象中的属性值:zhangfei");
    request.setAttribute("name", "request对象中的属性值:guanyu");
    session.setAttribute("name", "session对象中的属性值:liubei");
    application.setAttribute("name", "session对象中的属性值:zhaoyun");
%>

<h1>name的数值为:${name}</h1><br/>
</body>
</html>

执行效果

       可以看到,这里取得是pageContext的值,所以pageContext优先级最高。

作用范围越小,优先级越大。所以优先级排序是:pageContext >  request > session > application

3、EL表达式访问请求参数的数据

  创建表单页面,param.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>实现一个简单页面负责向JSP页面传递参数</title>
</head>
<body>
<form action="el_param.jsp" method="post">
    姓名:<input type="text" name="name"/><br/>
    爱好:<input type="checkbox" name="hobby" value="唱歌"/>唱歌<br/>
         <input type="checkbox" name="hobby" value="跳舞"/>跳舞<br/>
         <input type="checkbox" name="hobby" value="学习"/>学习<br/>
    <input type="submit" value="提交"/><br/>
</form>
</body>
</html>

(1)jsp原始方式

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>实现请求参数数值的获取</title>
</head>
<body>
<%
    request.setCharacterEncoding("utf-8");
%>
<%-- 使用JSP语法中的原始方式获取请求参数值 --%>
<%= "姓名是:" + request.getParameter("name") %><br/>
<%= "爱好是:" + Arrays.toString(request.getParameterValues("hobby")) %><br/>

</body>
</html>

(2)EL表达式方式

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>实现请求参数数值的获取</title>
</head>
<body>
<%
    request.setCharacterEncoding("utf-8");
%>
<%-- 使用EL表达式中的方式获取请求参数值 --%>
姓名是:${param.name}<br/>
爱好是:${paramValues.hobby[0]}<br/>

</body>
</html>

这里,可以把param 和 paramValues 看成是EL表达式的内置对象。

4、EL表达式访问Bean对象的属性值

创建Bean类 :Person.java

public class Person {
    private String name;
    private int age;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

(1)jsp原始方式

<%@ page import="com.test.demo01.Person" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>实现Bean对象中属性的获取和打印</title>
</head>
<body>
<%-- 使用JSP语法规则中的原始方式实现对象的创建和设置以及输出 --%>
<%
    Person person = new Person();
    person.setName("zhangfei");
    person.setAge(30);
    pageContext.setAttribute("person", person);
%>

<%= "获取到的姓名为:" + person.getName() %><br/>
<%= "获取到的年龄为:" + person.getAge()  %><br/>

</body>
</html>

(2)EL表达式方式

  a、方式一: $ { 对象名 . 属性名 },例如:${user.name}

<%@ page import="com.test.demo01.Person" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>实现Bean对象中属性的获取和打印</title>
</head>
<body>
<%-- 使用JSP语法规则中的原始方式实现对象的创建和设置以及输出 --%>
<%
    Person person = new Person();
    person.setName("zhangfei");
    person.setAge(30);
    pageContext.setAttribute("person", person);
%>

<%-- 使用EL表达式实现属性的获取和打印,方式1 --%>
获取到的姓名是:${person.name}<br/>
获取到的年龄是:${person.age}<br/>

</body>
</html>

b、方式二: $ { 对象名 [“属性名”] },例如:${user["name"]}

c、两种方式的区别

  • 当要存取的属性名中包含一些特殊字符,如: . , 等并非字母或数字的符号,就一定要使用 [ ]
    不是 . 的方式
  • 使用 [ ] 的方式可以动态取值,具体方式如下:
<% request.setAttribute(“prop”,“age”); %><!-- 相当于表达式中写一个变量 --> ${ user[prop] }

5、EL表达式访问集合中的数据

<%@ page import="java.util.LinkedList" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.Map" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>实现集合中数据内容的获取和打印</title>
</head>
<body>
<%
    // 准备一个List集合并添加数据内容
    List<String> list = new LinkedList<>();
    list.add("two");
    list.add("one");
    list.add("three");
    // 将整个集合放入指定的内置对象中
    pageContext.setAttribute("list", list);

    // 准备一个Map集合并添加数据
    Map<String, Integer> map = new HashMap<>();
    map.put("one", 1);
    map.put("two", 2);
    map.put("th.ree", 3);
    // 将整个集合放入指定的内置对象中
    pageContext.setAttribute("map", map);
%>

<%-- 使用EL表达式实现集合中数据内容的获取 --%>
集合中下标为0的元素是:${list[0]}<br/>    <%-- two --%>
集合中下标为1的元素是:${list[1]}<br/>    <%-- one --%>
集合中下标为2的元素是:${list[2]}<br/>    <%-- three --%>
<hr/>
<%-- 使用EL表达式实现Map集合中数据内容的获取 不支持下标 --%>
整个Map集合中的元素有:${map}<br/>
获取带有特殊字符key对应的数值为:${map["th.ree"]}<br/>   <%-- 3 --%>
</body>
</html>

6、EL表达式常用的内置对象

7、EL表达式常用运算的使用

<%@ page import="java.util.List" %>
<%@ page import="java.util.LinkedList" %>
<%@ page import="java.util.Arrays" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>实现常用运算符的使用</title>
</head>
<body>
<%
    // 通过内置对象设置属性的方式来准备操作数
    request.setAttribute("ia", 5);
    request.setAttribute("ib", 2);
    request.setAttribute("b1", true);
    request.setAttribute("b2", false);
%>

<%-- 实现上述所有操作数的获取和打印 --%>
ia的数值为:${ia}<br/>      <%-- 5 --%>
ib的数值为:${ib}<br/>      <%-- 2 --%>
b1的数值为:${b1}<br/>      <%-- true --%>
b2的数值为:${b2}<br/>      <%-- false --%>
<hr/>

<%-- 实现算术运算符的使用 --%>
ia+ib的结果为:${ia+ib}<br/>    <%-- 7 --%>
ia-ib的结果为:${ia-ib}<br/>    <%-- 3 --%>
ia*ib的结果为:${ia*ib}<br/>    <%-- 10 --%>
ia/ib的结果为:${ia/ib}<br/>    <%-- 2.5 --%>
ia%ib的结果为:${ia%ib}<br/>    <%-- 1 --%>
<hr/>

<%-- 实现关系运算符的使用 --%>
ia大于ib的结果为:${ia > ib}<br/>  <%-- true --%>
ia大于等于ib的结果为:${ia >= ib}<br/>  <%-- true --%>
ia小于ib的结果为:${ia < ib}<br/>  <%-- false --%>
ia小于等于ib的结果为:${ia <= ib}<br/>  <%-- false --%>
ia等于ib的结果为:${ia == ib}<br/>  <%-- false --%>
ia不等于ib的结果为:${ia != ib}<br/>  <%-- true --%>
<hr/>

<%-- 实现逻辑运算符的使用 --%>
b1并且b2的结果为:${b1 && b2}<br/>  <%-- false --%>
b1或者b2的结果为:${b1 || b2}<br/>  <%-- true --%>
b1取反的结果为:${ !b1 }<br/>  <%-- false --%>
b2取反的结果为:${ !b2 }<br/>  <%-- true --%>
<hr/>

<%
    String str1 = null;
    String str2 = "";
    String str3 = "hello";

    List<Integer> list1 = new LinkedList<>();
    List<Integer> list2 = Arrays.asList(11, 22, 33, 44, 55);

    request.setAttribute("str1", str1);
    request.setAttribute("str2", str2);
    request.setAttribute("str3", str3);
    request.setAttribute("list1", list1);
    request.setAttribute("list2", list2);

%>
<%-- 实现条件运算符和验证运算符的使用 --%>
ia和ib之间的最大值为:${ia>ib? ia: ib}<br/>
判断是否为空的结果是:${empty str1}<br/>    <%-- true --%>
判断是否为空的结果是:${empty str2}<br/>    <%-- true --%>
判断是否为空的结果是:${empty str3}<br/>    <%-- false --%>
判断是否为空的结果是:${empty list1}<br/>    <%-- true --%>
判断是否为空的结果是:${empty list2}<br/>    <%-- false --%>

</body>
</html>

猜你喜欢

转载自blog.csdn.net/u012660464/article/details/109017417