EL表达式

EL表达式概述

基本概念

EL表达式,全称是Expression Language。意为表达式语言。它是Servlet规范中的一部分,是JSP2.0规范加入的内容。其作用是用于在JSP页面中获取数据,从而让我们的JSP脱离java代码块和JSP表达式。

基本语法

EL表达式的语法格式非常简单,写为 ${表达式内容}

例如:在浏览器中输出请求域中名称为message的内容。

假定,我们在请求域中存入了一个名称为message的数据(request.setAttribute("message","EL");),此时在jsp中获取的方式,如下表显示:

Java代码块

JSP表达式

EL表达式

<%<br/> <br/> String message = (String)request.getAttribute("message");<br/> out.write(message);<br/>%>

<%=request.getAttribute("message")%>

${message}

通过上面我们可以看出,都可以从请求域中获取数据,但是EL表达式写起来是最简单的方式。这也是以后我们在实际开发中,当使用JSP作为视图时,绝大多数都会采用的方式。

EL表达式的入门案例

第一步:创建JavaWeb工程

ES order表达式_html

第二步:创建jsp页面

ES order表达式_标签库_02

第三步:在JSP页面中编写代码

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>EL表达式入门案例</title>
  </head>
  <body>
    <%--使用java代码在请求域中存入一个名称为message的数据--%>
    <% request.setAttribute("message","Expression Language");%>

    Java代码块获取:<% out.print(request.getAttribute("message"));%>
    <br/>
    JSP表达式获取:<%=request.getAttribute("message")%>
    <br/>
    EL表达式获取:${message}
  </body>
</html>

第四步:部署工程

ES order表达式_Java_03

第五步:运行测试

ES order表达式_html_04

EL表达式基本用法

在前面的概述介绍中,我们介绍了EL表达式的作用,它就是用于获取数据的,那么它是从哪获取数据呢?

1)获取四大域中的数据

它只能从四大域中获取数据,调用的就是findAttribute(name,value);方法,根据名称由小到大逐个域中查找,找到就返回,找不到就什么都不显示。

它可以获取对象,可以是对象中关联其他对象,可以是一个List集合,也可以是一个Map集合。具体代码如下:

创建两个实体类,User和Address

/**
 * 用户的实体类
 */
public class User implements Serializable{

    private String name = "黑马程序员";
    private int age = 18;
    private Address address = new Address();
    
    public String getName() {
        return name;
    }
    public void setName(String name) {
         = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public Address getAddress() {
        return address;
    }
    public void setAddress(Address address) {
        this.address = address;
    }    
}
/**
 * 地址的实体类
 */
public class Address implements Serializable {

    private String province = "北京";
    private String city = "昌平区";
    public String getProvince() {
        return province;
    }
    public void setProvince(String province) {
        this.province = province;
    }
    public String getCity() {
        return city;
    }
    public void setCity(String city) {
        this.city = city;
    }
}

JSP代码

ES order表达式_html_05

ES order表达式_html_06

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ page import="com.itheima.domain.User" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <head>
        <title>EL入门</title>
    </head>
    <body>
        <%--EL表达式概念:
                它是Expression Language的缩写。它是一种替换jsp表达式的语言。
            EL表达式的语法:
                ${表达式}
                表达式的特点:有明确的返回值。
                EL表达式就是把内容输出到页面上
            EL表达式的注意事项:
                1.EL表达式没有空指针异常
                2.EL表达式没有数组下标越界
                3.EL表达式没有字符串拼接
            EL表达式的数据获取:
                它只能在四大域对象中获取数据,不在四大域对象中的数据它取不到。
                它的获取方式就是findAttribute(String name)
         --%>
         <br/>-----------获取对象数据---------------------<br/>
         <% //1.把用户信息存入域中
             User user = new User();
             pageContext.setAttribute("u",user);
          %>
          ${u}===============输出的是内存地址<%--就相当于调用此行代码<%=pageContext.findAttribute("u")%> --%><br/>
          ${}<%--就相当于调用此行代码<% User user = (User) pageContext.findAttribute("u");out.print(user.getName());%> --%><br/>
          ${u.age}
         <br/>-----------获取关联对象数据------------------<br/>
         ${u.address}==========输出的address对象的地址<br/>
         ${u.address.province}${u.address.city}<br/>
         ${u["address"]['province']}
         <br/>-----------获取数组数据---------------------<br/>
         <% String[] strs = new String[]{"He","llo","Expression","Language"}; 
             pageContext.setAttribute("strs", strs);
         %>
         ${strs[0]}==========取的数组中下标为0的元素<br/>
         ${strs[3]}
         ${strs[5]}===========如果超过了数组的下标,则什么都不显示<br/>
         ${strs["2"]}=========会自动为我们转换成下标<br/>
         ${strs['1']}
         <br/>-----------获取List集合数据-----------------<br/>
         <% List<String> list = new ArrayList<String>();
             list.add("AAA");
             list.add("BBB");
             list.add("CCC");
             list.add("DDD");
             pageContext.setAttribute("list", list);
          %>
         ${list}<br/>
         ${list[0] }<br/>
         ${list[3] }<br/>     
         <br/>-----------获取Map集合数据------------------<br/>
         <% Map<String,User> map = new HashMap<String,User>();
             map.put("aaa",new User());
             pageContext.setAttribute("map", map);
          %>
          ${map}<br/>
          ${map.aaa}<%--获取map的value,是通过get(Key) --%><br/>
          ${}${map.aaa.age}<br/>
          ${map["aaa"].name }
    </body>
</html>

View Code

运行结果如图:

ES order表达式_标签库_07

2)EL表达式的注意事项

在使用EL表达式时,它帮我们做了一些处理,使我们在使用时可以避免一些错误。它没有空指针异常,没有数组下标越界,没有字符串拼接。

ES order表达式_html_05

ES order表达式_html_06

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>EL表达式的注意事项</title>
  </head>
  <body>
    <%--EL表达式的三个没有--%>
    第一个:没有空指针异常<br/>
    <% String str = null;
       request.setAttribute("testNull",str);
    %>
    ${testNull}
    <hr/>
    第二个:没有数组下标越界<br/>
    <% String[] strs = new String[]{"a","b","c"};
       request.setAttribute("strs",strs);
    %>
    取第一个元素:${strs[0]}
    取第六个元素:${strs[5]}
    <hr/>
    第三个:没有字符串拼接<br/>
    <%--${strs[0]+strs[1]}--%>
    ${strs[0]}+${strs[1]}
  </body>
</html>

View Code

运行结果图:

\

3)EL表达式的使用细节

EL表达式除了能在四大域中获取数据,同时它可以访问其他隐式对象,并且访问对象有返回值的方法.

4)EL表达式的运算符

EL表达式中运算符如下图所示,它们都是一目了然的:

ES order表达式_Java_10

 

ES order表达式_标签库_11

 但是有两个特殊的运算符,使用方式的代码如下:

ES order表达式_html_05

ES order表达式_html_06

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ page import="com.itheima.domain.User" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <head>
        <title>EL两个特殊的运算符</title>
    </head>
    <body>
        <%--empty运算符:
            它会判断:对象是否为null,字符串是否为空字符串,集合中元素是否是0个
        --%>
        <% String str = null;
          String str1 = "";
          List<String> slist = new ArrayList<String>();
          pageContext.setAttribute("str", str);
          pageContext.setAttribute("str1", str1);
          pageContext.setAttribute("slist", slist);
        %>
        ${empty str}============当对象为null返回true<br/>
        ${empty str1 }==========当字符串为空字符串是返回true(注意:它不会调用trim()方法)<br>
        ${empty slist}==========当集合中的元素是0个时,是true
        <hr/>
        <%--三元运算符 
             条件?真:假
        --%>
        <% request.setAttribute("gender", "female"); %>
        <input type="radio" name="gender" value="male" ${gender eq "male"?"checked":""} >男
        <input type="radio" name="gender" value="female" ${gender eq "female"?"checked":""}>女
    </body>
</html>

View Code

运行结果图:

ES order表达式_html_14

EL表达式的11个隐式对象

1)隐式对象介绍

EL表达式也为我们提供隐式对象,可以让我们不声明直接来使用,十一个对象见下表,需要注意的是,它和JSP的隐式对象不是一回事:

EL中的隐式对象

类型

对应JSP隐式对象

备注

PageContext

Javax.serlvet.jsp.PageContext

PageContext

完全一样

ApplicationScope

Java.util.Map

没有

应用层范围

SessionScope

Java.util.Map

没有

会话范围

RequestScope

Java.util.Map

没有

请求范围

PageScope

Java.util.Map

没有

页面层范围

Header

Java.util.Map

没有

请求消息头key,值是value(一个)

HeaderValues

Java.util.Map

没有

请求消息头key,值是数组(一个头多个值)

Param

Java.util.Map

没有

请求参数key,值是value(一个)

ParamValues

Java.util.Map

没有

请求参数key,值是数组(一个名称多个值)

InitParam

Java.util.Map

没有

全局参数,key是参数名称,value是参数值

Cookie

Java.util.Map

没有

Key是cookie的名称,value是cookie对象

JSTL

JSTL概述

1)简介

JSTL的全称是:JSP Standard Tag Libary。它是JSP中标准的标签库。它是由Apache实现的。

它由以下5个部分组成:

组成

作用

说明

Core

核心标签库。

通用逻辑处理

Fmt

国际化有关。

需要不同地域显示不同语言时使用

Functions

EL函数

EL表达式可以使用的方法

SQL

操作数据库。

不用

XML

操作XML。

不用

2)使用要求

要想使用JSTL标签库,在javaweb工程中需要导入坐标。首先是在工程的WEB-INF目录中创建一个lib目录,接下来把jstl的jar拷贝到lib目录中,最后在jar包上点击右键,然后选择【Add as Libary】添加。如下图所示:

ES order表达式_html_15

核心标签库

在我们实际开发中,用到的jstl标签库主要以核心标签库为准,偶尔会用到国际化标签库的标签。下表中把我们经常可能用到的标签列在此处,其余标签库请同学们参考【JSTL标签库.doc】文档。

标签名称

功能分类

分类

作用

<c:if>

流程控制

核心标签库

用于判断

<c:choose> ,<c:when>,<c:otherwise>

流程控制

核心标签库

用于多个条件判断

<c:foreache>

迭代操作

核心标签库

用于循环遍历

JSTL使用

ES order表达式_html_05

ES order表达式_html_06

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%--导入jstl标签库 --%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>JSTL的常用标签</title>
  </head>
  <body>
    <%-- c:if  c:choose   c:when c:otherwise --%>
    <% pageContext.setAttribute("score","F"); %>
    <c:if test="${pageScope.score eq 'A' }">
        优秀
    </c:if>
    <c:if    test="${pageScope.score eq 'C' }">
        一般
    </c:if>
    <hr/>
    <c:choose>
        <c:when test="${pageScope.score eq 'A' }">
            AAA
        </c:when>
        <c:when test="${pageScope.score eq 'B' }">BBB
        </c:when>
        <c:when test="${pageScope.score eq 'C' }">CCC
        </c:when>
        <c:when test="${pageScope.score eq 'D' }">DDD
        </c:when>
        <c:otherwise>其他</c:otherwise>
    </c:choose>
    
    <%-- c:forEach 它是用来遍历集合的
         属性:
             items:要遍历的集合,它可以是EL表达式取出来的
             var:把当前遍历的元素放入指定的page域中。 var的取值就是key,当前遍历的元素就是value
                 注意:它不能支持EL表达式,只能是字符串常量
             begin:开始遍历的索引
             end:结束遍历的索引
             step:步长。i+=step
             varStatus:它是一个计数器对象。里面有两个属性,一个是用于记录索引。一个是用于计数。
                        索引是从0开始。计数是从1开始
    --%>
    <hr/>
    <% List<String> list = new ArrayList<String>();
       list.add("AAA");
       list.add("BBB");
       list.add("CCC");
       list.add("DDD");
       list.add("EEE");
       list.add("FFF");
       list.add("GGG");
       list.add("HHH");
       list.add("III");
       list.add("JJJ");
       list.add("KKK");
       list.add("LLL");
       pageContext.setAttribute("list",list);
     %>
    <c:forEach items="${list}" var="s" begin="1" end="7" step="2">
        ${s}<br/>
    </c:forEach>
    <hr/>
    <c:forEach begin="1" end="9" var="num">
        <a href="#">${num}</a>
    </c:forEach>
    <hr/>
    <table>
        <tr>
            <td>索引</td>
            <td>序号</td>
            <td>信息</td>
        </tr>
    <c:forEach items="${list}" var="s" varStatus="vs">
        <tr>
            <td>${vs.index}</td>
            <td>${vs.count}</td>
            <td>${s}</td>
        </tr>
    </c:forEach>
    </table>
  </body>
</html>

View Code