一、EL 表达式简介

  1、概念

    EL 表达式的全称:Expression Language 表达式语言。

    EL 是 JSP 内置的表达式语言,用以访问页面的上下文以及不同作用域中的对象,取得对象属性的值,或执行简单的运算或判断操作。

  2、作用

    EL表达式主要是替换和简化 jsp 页面中表达式脚本在jsp页面中进行数据的输出。

    EL 表达式仅仅用来读取数据,而不能第数据进行修改。

  3、特点

    EL 在得到某个数据时,会自动进行数据类型的转换

    EL 表达式输出数据时,如果有则输出数据,如果为 null 则什么也不输出。

  4、EL 表达式与 JSP 表达式的区别

    ① 如果数据为  null,jsp 显示 null,EL 则什么也不显示;

    ② EL 显示的数据,必须存放在域对象或上下文对象中;

    ③ EL 可以自带数据类型转换的功能;

  5、语法格式

${表达式}

  6、注意事项

    jsp 默认是支持 el 表达式的。

    如果要忽略 el 表达式,有两种方式

     (1)设置 jsp 中 page 指令中:isELIgnored="true" 忽略当前jsp页面中所有的el表达式

     (2)\${表达式}:这种方式忽略当前这个 el 表达式,会在当前页面呈现原有格式。

  7、案例

1 <body>
2      <%
3          request.setAttribute("key","值");
4      %>
5      表达式脚本输出 key 的值是:        
6    <%=request.getAttribute("key1")==null?"":request.getAttribute("key1")%><br/>
7      EL 表达式输出 key 的值是: ${key1}
8  </body>

    注意:

      EL 在表达式在输出 null 值的时候,输出的空串。

      而 jsp 表达式脚本在输出 null 值的时候,输出的是 null  字符串。

 

二、EL 表达式搜索域数据的顺序

  EL 表达式主要是在 jsp 页面中输出数据。主要是输出 域对象 中的数据。

  当四个域中都有相同的 key 的数据的时候,EL 表达式会按照四个域的从小到大的顺序去进行搜索,找到就输出。

  Demo:

1   <%
2     //往四个域中都保存了相同的 key 的数据。
3     request.setAttribute("key", "request");
4     session.setAttribute("key", "session");
5     application.setAttribute("key", "application");
6     pageContext.setAttribute("key", "pageContext");
7   %>
8   ${ key }

 

三、EL 表达式输出信息

     创建一个 JavaBean,然后输出 JavaBean 类中的普通属性,数组属性,list集合和 map 集合属性。

    JavaBean:

 1 public class Person {
 2     private String name;
 3     private String[] phones;
 4     private List<String> cities;
 5     private Map<String,Object> map;
 6 
 7     public int getAge() {
 8         return 18;
 9     }
10 
11     public Person() {
12     }
13 
14     public Person(String name, String[] phones, List<String> cities, Map<String, Object> map) {
15         this.name = name;
16         this.phones = phones;
17         this.cities = cities;
18         this.map = map;
19     }
20 
21     public String getName() {
22         return name;
23     }
24 
25     public void setName(String name) {
26         this.name = name;
27     }
28 
29     public String[] getPhones() {
30         return phones;
31     }
32 
33     public void setPhones(String[] phones) {
34         this.phones = phones;
35     }
36 
37     public List<String> getCities() {
38         return cities;
39     }
40 
41     public void setCities(List<String> cities) {
42         this.cities = cities;
43     }
44 
45     public Map<String, Object> getMap() {
46         return map;
47     }
48 
49     public void setMap(Map<String, Object> map) {
50         this.map = map;
51     }
52 
53     @Override
54     public String toString() {
55         return "Person{" +
56                 "name='" + name + '\'' +
57                 ", phones=" + Arrays.toString(phones) +
58                 ", cities=" + cities +
59                 ", map=" + map +
60                 '}';
61     }
62 }

 

  1、输出 JavaBean 的普通属性

  2、输出数组信息

  3、输出 List 集合

  4、输出 Map 集合

    Demo:

 1   <%
 2        Person person = new Person();
 3  
 4        person.setName("Hello EL");
 5        person.setPhones(new String[]{"123","456","789"});
 6  
 7        List<String> cities = new ArrayList<String>();
 8        cities.add("北京");
 9        cities.add("上海");
10        cities.add("深圳");
11        person.setCities(cities);
12  
13        Map<String,Object> map = new HashMap<>();
14        map.put("key1","value1");
15        map.put("key2","value2");
16        map.put("key3","value3");
17  
18        person.setMap(map);
19        pageContext.setAttribute("p", person);
20      %>
21      
22      输出 Person: ${ p }<br/>                                       
23      输出 Person 的 name 属性: ${p.name} <br>
24      输出 Person 的 phones 数组属性值: ${p.phones[2]} <br>
25      输出 Person 的 cities 集合中的元素值: ${p.cities} <br>
26      输出 Person 的 List 集合中个别元素值: ${p.cities[2]} <br>
27      输出 Person 的 Map 集合: ${p.map} <br>
28      输出 Person 的 Map 集合中某个 key 的值: ${p.map.key3} <br>
29      <%--输出 Person 的 age 属性: ${p.age} <br> --%>
30      %>

 

  注意:

    ① 如果在 JavaBean 中只声明一个 age 变量,如果没有写 getAge() 方法,那么是无法通过 EL 表达式来读取该属性的;

    ② 如果在 JavaBean 中只是声明了一个 getAge() 方法,没有声明 age 这个变量,那么 EL 表达式也是可以读取;

    ③ EL 是通过JavaBean 对应的 getter() 方法来读取属性的,而不是直接通过属性的名字来读取(切记

          这里的属性名是指 JavaBean 里面的 setter 和 getter 方法去掉 set或get,然后首字母变小写就是属性了。

    ⑤ 如果发生了下标越界,并不会报错,而是显示为空字符串。

 

四、EL表达式——运算

  EL 表达式支持如下运算符:

  1、算数运算符

+、-、*、/(div)、%(mod)

    注意:其中的除号可以用 div 来代替,取余可以用 mod 来代替。

算数运算符 说明 范例 结果
+ 加法 ${ 12 + 18 } 30
- 减法 ${ 15 - 5 } 10
* 乘法 ${ 2 * 10 } 20
/ 或 div 除法 $( 24 / 2 ) 或 ${ 24 div 2 } 12
% 或 mod 取模 ${ 14 % 4 } 或 ${ 14 mod 10} 4

 

  2、关系运算符

 >  <  >=  <=  ==  !=

    关系运算符:

关系运算符 说 明 范 例 结果
== eq 等于 ${ 5 == 5 } ${ 5 eq 5 } true
!= ne 不等于 ${ 5 !=5 } ${ 5 ne 5 } false
< lt 小于 ${ 3 < 5 } ${ 3 lt 5 } true
> gt 大于 ${ 2 > 10 } ${ 2 gt 10 } false
<= le 小于等于 ${ 5 <= 12 } ${ 5 le 12 } true
>= ge 大于等于 ${ 3 >= 5 } ${ 3 ge 5 } false

  3、逻辑运算符

&&(and)  ||(or)  !(not)

    逻辑运算符:

逻辑运算符 说 明 范 例 结果
&& and 与运算 ${ 12 == 12 && 12 < 11 } ${ 12 == 12 and 12 < 11 } false
|| or 或运算 ${ 12 == 12 || 12 < 11 } ${ 12 == 12 or 12 < 11 } true
! not 取反运算 ${ !true } ${not true } false

  4、empty 空运算符

    空运算符:empty

    功能:用于判断一个数据是否为空,如果为空,则输出 true;不为空输出 false。

    以下几种情况为空:

      ① 值为 null 值的时候,为空;

      ② 值为 空串 的时候,为空;

      ③ 值是 Object 类型的数据,长度为零的时候;

      ④ list 集合,元素个数为 零;

      ⑤ map 集合,元素个数为 零;      

    Demo:

 1 ${empty list}:判断字符串、集合、数组对象是否为null或者长度为0,为空或为0返回 true,不然返回 false
 2 ${not empty str}:表示判断字符串、集合、数组对象是否不为null 并且 长度>0;不为空或长度不为0返回 true,不然返回 false
 3 
 4 <body>
 5     <%
 6       // 1、 值为 null 值的时候, 为空
 7       request.setAttribute("emptyNull", null);
 8       
 9       // 2、 值为空串的时候, 为空
10       request.setAttribute("emptyStr", "");
11       
12       // 3、 值是 Object 类型数组, 长度为零的时候
13       request.setAttribute("emptyArr", new Object[]{});
14       
15       // 4、 list 集合, 元素个数为零
16       List<String> list = new ArrayList<>();
17       // list.add("abc");
18       request.setAttribute("emptyList", list);
19       
20       // 5、 map 集合, 元素个数为零
21       Map<String,Object> map = new HashMap<String, Object>();
22       // map.put("key1", "value1");
23       request.setAttribute("emptyMap", map);
24     %>
25     ${ empty emptyNull } <br/>
26     ${ empty emptyStr } <br/>
27     ${ empty emptyArr } <br/>
28     ${ empty emptyList } <br/>
29     ${ empty emptyMap } <br/>
30  </body>

 

  5、三元运算符

    格式:

表达式 1? 表达式 2: 表达式 3

    说明:如果表达式 1 的值为真, 返回表达式 2 的值, 如果表达式 1 的值为假, 返回表达式 3 的值

    Demo:

${ 12 != 12 ? "正确":"错误" }

  

  6、"." 点运算 和 [] 中括号运算符

    说明:

. 点运算,可以输出 JavaBean 对象中某个属性的值(其实是调用的 getter() 方法)

 

[ ] 中括号运算,可以输出有序集合中某个元素的值,并且中括号运算,还可以输出 map 集合中 key 里含有特殊字符的 key 的值,key需要用引号(单引号或双引号)引起来 

    Demo:

 1 <body>
 2       <%
 3         Map<String,Object> map = new HashMap<String, Object>();
 4         map.put("a.a.a", "aaaValue");
 5         map.put("b+b+b", "bbbValue");
 6         map.put("c-c-c", "cccValue");
 7         request.setAttribute("map", map);
 8       %>
 9       ${ map['a.a.a'] } <br>
10       ${ map["b+b+b"] } <br>
11       ${ map['c-c-c'] } <br>
12 </body>

 

五、EL 表达式的 11 个隐含对象

  EL 表达式中有 11 个隐含对象,是 EL 表达式自已定义的,可以直接拿来使用。

变量 类型 作用
pageContext PageContextImpl 它可以获取 jsp 中的九大内置对象
pageScope Map<String,Object> 它可以获取 pageContext 域中的数据
requestScope Map<String,Object> 它可以获取 Request 域中的数据
sessionScope Map<String,Object> 它可以获取 Session 域中的数据
applicationScope Map<String,Object> 它可以获取 ServletContext 域中的数据
param Map<String,String> 它可以获取请求参数的值
paramValues Map<String,String[]> 它也可以获取请求参数的值, 获取多个值的时候使用。
header Map<String,String> 它可以获取请求头的信息
headerValues Map<String,String[]> 它可以获取请求头的信息, 它可以获取多个值的情况
cookie Map<String,Cookie> 它可以获取当前请求的 Cookie 信息
initParam Map<String,String>  它可以获取在 web.xml 中配置的<context-param>上下文参数

 

六、使用隐含对象

  1、pageContext 对象的使用

    使用 pageContext 对象可以获取:

1. 协议:
2. 服务器 ip
3. 服务器端口:
4. 获取工程路径:
5. 获取请求方法:
6. 获取客户端 ip 地址:
7. 获取会话的 id 编号:
8. 获取 jsp 其他的八个内置对象

    Demo:

 1 <body>
 2       <%--
 3       request.getScheme() 它可以获取请求的协议
 4       request.getServerName() 获取请求的服务器 ip 或域名
 5       request.getServerPort() 获取请求的服务器端口号
 6       getContextPath() 获取当前工程路径
 7       request.getMethod() 获取请求的方式(GET 或 POST)
 8       request.getRemoteHost() 获取客户端的 ip 地址
 9       session.getId() 获取会话的唯一标识
10       --%>
11       <%
12         pageContext.setAttribute("req", request);
13       %>
14       <%=request.getScheme() %> <br>
15       1.协议: ${ req.scheme }<br>
16       2.服务器 ip: ${ pageContext.request.serverName }<br>
17       3.服务器端口: ${ pageContext.request.serverPort }<br>
18       4.获取工程路径: ${ pageContext.request.contextPath }<br>
19       5.获取请求方法: ${ pageContext.request.method }<br>
20       6.获取客户端 ip 地址: ${ pageContext.request.remoteHost }<br>
21       7.获取会话的 id 编号: ${ pageContext.session.id }<br>
22 </body>

  2、EL 获取四个特定域中的属性

      EL 表达式只能从域对象中获取值,依次从最小的域中查找是否有该键对应的值,直到找到为止

      使用 域名称可以选择性地获取域对象中的数据

      注意:如果在域中没有对应的键值对,会返回空字符串""

域名称 作用域
pageScope pageContext域
requestScope request域
sessionScope session域
applicationScope application(ServletContext)域

      Demo:

 1 <body>
 2       <%
 3         pageContext.setAttribute("key1", "pageContext1");
 4         pageContext.setAttribute("key2", "pageContext2");
 5         request.setAttribute("key2", "request");
 6         session.setAttribute("key2", "session");
 7         application.setAttribute("key2", "application");
 8       %>
 9       ${ applicationScope.key2 }
10 </body>

 

   3、获取参数的信息

    说明:

param                             Map<String,String>                           它可以获取请求参数的值
paramValues                  Map<String,String[]>                         它也可以获取请求参数的值, 获取多个值的时候使用。

    Demo:

1 请求地址:
2 http://localhost:8080/09_EL_JSTL/other_el.jsp?username=zs&password=666&hobby=java&hobby=cpp
3 
4 输出请求参数 username 的值: ${ param.username } <br>
5 输出请求参数 password 的值: ${ param.password } <br>
6 输出请求参数 username 的值: ${ paramValues.username[0] } <br>
7 输出请求参数 hobby 的值: ${ paramValues.hobby[0] } <br>
8 输出请求参数 hobby 的值: ${ paramValues.hobby[1] } <br>

 

  4、获取请求头的信息

    说明:

header                                          Map<String,String>                                   它可以获取请求头的信息
headerValues                               Map<String,String[]>                                 它可以获取请求头的信息, 它可以获取多个值的情况

    Demo:

1 输出请求头【User-Agent】 的值: ${ header['User-Agent'] } <br>
2 输出请求头【Connection】 的值: ${ header.Connection } <br>
3 输出请求头【User-Agent】 的值: ${ headerValues['User-Agent'][0] } <br>

 

  5、获取 cookie 信息

    说明:

cookie                                            Map<String,Cookie>                                它可以获取当前请求的 Cookie 信息

    Demo:

1 获取 Cookie 的名称: ${ cookie.JSESSIONID.name } <br>
2 获取 Cookie 的值: ${ cookie.JSESSIONID.value } <br>

 

  6、获取配置参数信息

    说明:

initParam Map<String,String> 它可以获取在 web.xml 中配置的<context-param>上下文参数

    Demo:

 1 web.xml 中的配置
 2 <context-param>
 3   <param-name>username</param-name>
 4   <param-value>root</param-value>
 5 </context-param>
 6 <context-param>
 7   <param-name>url</param-name>
 8   <param-value>jdbc:mysql:///test</param-value>
 9 </context-param>
10 
11 示例代码:
12 输出&lt;Context-param&gt;username 的值: ${ initParam.username } <br>
13 输出&lt;Context-param&gt;url 的值: ${ initParam.url } <br>

 

 

posted on 2021-08-09 09:05  格物致知_Tony  阅读(558)  评论(0编辑  收藏  举报

目录导航