天天看點

JSP -- EL表達式及JSTL标簽庫

一、EL表達式簡介

1. 什麼是EL表達式

  EL是JSP表達式語言,全稱是Expression Language,​作用:代替JSP中腳本表達式的功能,簡化對Java代碼的操作。

2. EL表達式的格式和作用

  • 格式:

    ${表達式内容}

  • 作用:從域對象中查找指定的資料

二、EL表達式的基本使用

1. 獲得域對象的資料

<h2>EL獲得容器(域對象)的資料</h2>
<%--el作用:擷取域裡面的資料--%>
<%
    request.setAttribute("name","admin1");
    request.getSession().setAttribute("name","admin2");
    request.getSession().getServletContext().setAttribute("name","admin3");
%>
<p>擷取域裡面的name:${name}</p>
<%--el通過直接寫域裡面的name,會依次從request,session,servletCOntext裡面擷取,找到為止--%>
<%--如果想通過el擷取指定域裡面的資料,必須指定域的範圍
            requestScope====>request域對象
            sessionSoope====>session域對象
            applicationScope==>servletContext域對象
--%>
<p>擷取request域裡面的name:${requestScope.name}</p>
<p>擷取session域裡面的name:${sessionScope.name}</p>
<p>擷取servletContext域裡面的name:${applicationScope.name}</p>
<p>擷取servletContext域裡面的name2:${applicationScope.name2}</p>
           

2. 擷取JavaBean資料

<h2>EL擷取和解析域裡面的複雜資料——javaBean對象</h2>
<%
    //往域裡面寫javaBean對象
    User user = new User(20,"張三");
    request.setAttribute("user",user);
%>
<%--el擷取javaBean對象直接.屬性名就可以,el會自動調用該屬性getXXX封裝方法--%>
<p>擷取request域中user對象裡面name的值:${user.name}</p>
<p>擷取request域中user對象裡面age的值:${user.age}</p>
           

注意:

  • JavaBean資料擷取類似擷取map集合的方式,既能使用

    .

    擷取資料,也可以使用

    []

  • 如果EL表達式擷取不到資料,則頁面沒有顯示内容,而不是顯示為null;
  • EL在擷取JavaBean資料時,底層調用的是

    getXXX()

    方法。

3. 擷取和解析複雜資料

擷取數組:

<h2>EL擷取和解析域裡面的複雜資料——數組</h2>
<%
    //往域裡面寫數組資料
    User[] users = { new User(20,"張三"), new User(22,"李四")};
    request.setAttribute("users",users);
%>

<%--el擷取數組,是通過下标[索引]方式擷取元素--%>
<p>擷取request域中對象數組裡面第一個元素name的值:${users[0].name}</p>
<p>擷取request域中對象數組裡面第一個元素age的值:${users[0].age}</p>
<p>擷取request域中對象數組裡面第二個元素name的值:${users[1].name}</p>
<p>擷取request域中對象數組裡面第二個元素age的值:${users[1].age}</p>
           

擷取List:

<h2>EL擷取和解析域裡面的複雜資料——List</h2>
<%
    //往域裡面寫List資料
    List<User> userList = new ArrayList<User>();
    userList.add( new User(20,"張三"));
    userList.add( new User(22,"李四"));
    request.setAttribute("userList",userList);
%>

<%--el擷取集合,也是是通過下标[索引]方式擷取元素,與數組一樣--%>
<p>擷取request域中List集合裡面第一個元素name的值:${userList[0].name}</p>
<p>擷取request域中List集合裡面第一個元素age的值:${userList[0].age}</p>
<p>擷取request域中List集合裡面第二個元素name的值:${userList[1].name}</p>
<p>擷取request域中List集合裡面第二個元素age的值:${userList[1].age}</p>
           

擷取Map:

<h2>EL擷取和解析域裡面的複雜資料——Map</h2>
<%
    //往域裡面寫Map資料
    Map<String,User> map = new HashMap<String,User>();
    map.put("one", new User(20,"張三"));
    map.put("two", new User(22,"李四"));
    map.put("three.four",new User(24,"王五"));
    request.setAttribute("map",map);
%>

<p>擷取request域中map集合裡面one元素name的值:${map.one.name}</p>
<p>擷取request域中map集合裡面one元素age的值:${map.one.age}</p>
<p>擷取request域中map集合裡面two元素name的值:${map.two.name}</p>
<p>擷取request域中map集合裡面two元素age的值:${map.two.age}</p>

<%--如果el擷取的屬性名中有特殊字元,不可以使用.的方式擷取資料,需要使用${["屬性名"]}進行擷取--%>
<p>擷取request域中map集合裡面three.four元素name的值:${map["three.four"].name}</p>
           

三、EL表達式使用運算符

1. 支援算術運算符:+ - * / %

注意事項:

  • 在EL表達式中,隻要是數字就能執行運算,執行除法時會将數字除盡,最多保留16位小數;
  • 在EL表達式中,如果在一個算式中有資料不存在,那麼這個資料不參與運算,不報錯繼續執行。

2. 邏輯運算符

&& --交集

|| --并集

!--非

​ 注意:邏輯運算中的

異或 ^

EL不支援。

3. 比較運算符

== 等于

!= 不等于

< 小于

> 大于

<= 小于等于

>= 大于等于

4. empty運算符

​  empty運算符是用來判斷當擷取的資料是否為空或者目前擷取的集合是否沒有任何資料

<h2>使用empty判斷空</h2>
<%--
    ${empty 域裡面的資料}
    1.判斷資料是否為null,為null 傳回true
    2.判斷資料是否為空字元串,為空字元串,傳回true
    3.判斷資料是集合的話,如果集合元素的個數為0,傳回true
--%>
<p>空字元串:${empty ""}</p>
<p>空對象:${empty null}</p>

<%  request.setAttribute("list",new ArrayList<String>());  %>
<p>集合元素個數為0:${empty list}</p>

<%--
${not empty 域裡面的資料}   判空取反
--%>
           

5. 三目運算符

<%-- 與Java的三元運算符功能一緻 -->
<td class="text-center">${product.productStatus==0?'關閉':'開啟'}</td>
           

6. 截取字元串

四、JSTL标簽庫概述

1. 簡介

  ​JSP的标準标簽庫(Jsp Standard Tag Library),簡稱JSTL。JSP标準标簽庫由很多标簽組成,這些标簽稱為伺服器端标簽。伺服器端标簽的作用是以标簽形式編寫來代替特定功能的Java代碼。

2. 常用JSTL标簽庫

  • 1)core:JSTL的核心标簽庫(目前還在使用)
  • 2)fmt:格式化(國際化)的标簽庫(使用較少,對頁面顯示資料,格式化,現在都交給前端去做)

3. 導入jar包

javax.servlet.jsp.jstl.jar / jstl-impl.jar

4. 導入标簽庫

需要在JSP頁面使用taglib指令導入要使用的标簽庫

core:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

fmt:
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
           

五、JSTL核心标簽庫常用标簽

1. 核心标簽庫清單

标簽名稱 作用

<c:out>

通常用于輸出一段文本内容到用戶端浏覽器

<c:if>

相當于java中的if(){ }語句,而不是if(){ }else{ }語句

<c:choose>

用于指定多個條件選擇的組合邊界,它必須與

c:when

c:otherwise

标簽一起使用

<c:forEach>

用于代替 java代碼for循環語句

2. if 标簽

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>if标簽</title>
</head>
<body>
<%--
    if标簽
        格式:<c:if test="條件表達式"> //條件成立時運作的資料 </c:if>
        作用,相當于if(){}
        常用屬性
            test,用于編寫邏輯條件表達式 --判斷是否執行标簽内的内容(true:執行标簽中的内容,false:不執行)
            scope,用于将表達式的值存儲到指定域裡面,request/session/servletContext
            var,用于設定域裡面的name
--%>
<c:if test="${false}" scope="request" var="flag">
    <p>進入了if條件句</p>
</c:if>

表達式裡面的值:${flag},外部的語句
</body>
</html>
           

3. choose标簽

作用:

  ​

<c:choose>

标簽用于指定多個條件選擇的組合邊界,它必須與

<c:when>

<c:otherwise>

标簽一起使用,三個标簽組合發揮java代碼

if(){ ... } else if(){ ... } else{ ... }

語句的作用。

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>if标簽</title>
</head>
<body>
<%--
    choose标簽
        格式:
            <c:choose>
                <c:when test=""></c:when>======>if
                <c:when test=""></c:when>======>else if
                <c:otherwise></c:otherwise>====>else
            </c:choose>
        作用:
            相當于 if-elseif-esle結構
        常用屬性
            test,用于編寫邏輯條件表達式
        注意:
            不能在伺服器端标簽裡面寫html注釋,不支援

--%>
<% request.getSession().setAttribute("loginUser",null); %>
<c:choose>
    <c:when test="${not empty loginUser}">
        歡迎,${loginUser}使用者,登入成功
    </c:when>
    <c:otherwise>
        您,還沒有登入
    </c:otherwise>
</c:choose>

</body>
</html>
           

4. foreach标簽

循環對象時常用屬性:

屬性名 是否支援EL 屬性類型 屬性描述
var false String 儲存的是被循環對象中的元素
items true 任何支援的類型 将要疊代的集合對象

foreach循環List

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page import="java.util.List" %>
<%@ page import="com.zz.model.Person" %>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%-- foreach作用是用于周遊:數組、集合 --%>

<%
    List<Person> list = new ArrayList<>();
    list.add(new Person(110,"張三",18));
    list.add(new Person(220,"李四",19));
    list.add(new Person(330,"王五",20));
    request.setAttribute("list",list);
%>

<%--
  foreach标簽常用的屬性:
    items: 指定周遊的目标
    var : 指定周遊出來每個元素的存儲在域中名字
    varStatus: 指定存儲周遊資訊對象的名字,一個集合在周遊的過程中會産生大量的資訊: index(索引值), count(序号), 這些資訊都
    		   被jstl封裝到一個對象中了     域對象.setAttribute("你指定的名字",status);

    begin: 指定開始周遊的索引值
    end: 指定周遊結束索引值
    step: 指定周遊的步長   0 1 2   
--%>

<table border="1px" cellspacing="0px" cellpadding="0px" align="center">
    <tr>
        <td>序号</td>
        <th>身份證</th>
        <th>姓名</th>
        <th>年齡</th>
    </tr>
    <c:forEach  var="item" items="${list}"  varStatus="status" >
        <tr>
            <td>${status.count}</td>
            <td>${item.id}</td>
            <td>${item.name}</td>
            <td>${item.age}</td>
        </tr>
    </c:forEach>
</table>

</body>
</html>
           

foreach循環對象(數組、map)

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.Map" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%
    String[] arr= {"張三","李四","王五"};
    request.setAttribute("arr",arr);

    //集合
    Map<String,String> map = new HashMap<>();
    map.put("aa","張三");
    map.put("bb","李四");
    map.put("cc","王五");
    request.setAttribute("map",map);
%>

<%--周遊數組--%>
    <c:forEach var="item"  items="${arr}">
        ${item},
    </c:forEach>
<br/>


<%--周遊Map集合
    周遊map對象的時候,周遊出來的每一個元素都是一個entry對象
--%>

周遊map:<br/>
<c:forEach var="entry" items="${map}">
        key:${entry.key}   value: ${entry.value}<br/>
</c:forEach>

</body>
</html>