EL 與 JSTL 簡化 JSP 操作


I. EL

  • EL(Expression Language,表達式語言):主要用來代替 JSP 中腳本的功能,簡化對 Java 代碼的操作。
  • 語法:${表達式}

1. EL 獲取域中的值

  • EL表達式 只能 從域對象(4個域)中獲取數據。

a. 語法

i. 標準語法

  1. ${pageScope.鍵名}
    從 page 域中獲取指定鍵名對應的值。
  2. ${requestScope.鍵名}
    從 request 域中獲取指定鍵名對應的值。
  3. ${sessionScope.鍵名}
    從 session 域中獲取指定鍵名對應的值。
  4. ${applicationScope.鍵名}
    從 servletContext 域中獲取指定鍵名對應的值。

ii. 簡化語法

  • ${鍵名}
    默認從最小域開始找,找到後直接顯示,不在繼續尋找。
    要求四個域鍵名唯一。

iii. 代碼示例

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>demo.jsp</title>
</head>
<body>
<h3>el表達式基本語法</h3>
<%
    /*模擬servlet向域中存值*/
    // pageContext.setAttribute("username", "Regino");
    request.setAttribute("username", "Regino");
    request.setAttribute("age", 21);
    session.setAttribute("sex", "男");
    application.setAttribute("address", "HK");
%>
<h5>標準語法</h5>
${pageScope.username}<br> <%--不會出現空指針異常問題--%>
${requestScope.age}<br>
${sessionScope.sex}<br>
${applicationScope.address}<br>
<h5>簡化語法</h5>
${username}<br>
${age}<br>
${sex}<br>
${address}<br>
</body>
</html>

b. 獲取 JSP 動態資源

  1. 獲取字符串:
    ${鍵名}
    之前的內容已經介紹過了。
  2. 獲取對象(User):
    ${鍵名.屬性名}
    屬性名必須和實體類中的 get 方法返回的變量名稱一致。
    el 不會出現 null 和索引角標越界問題。
    遍歷要用到 JSTL 標籤庫,詳情可見 。
  3. 獲取 List(Array)集合:
    ${鍵名[索引]}
  4. 獲取 Map 集合:
    ${鍵名.key}
    ${鍵名["key"]}

i. 獲取對象

  • 實體類:
package com.company.up.domain;

public class User {

    private String name;
    private String sex;
    private Integer age;

    public User() {
    }

    public User(String name, Integer age, String sex) {
        this.name = name;
        this.sex = sex;
        this.age = age;
    }

    public String getName() {
        return name;
    }

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

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public Integer getAge() {
        return age;
    }

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

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                ", age=" + age +
                '}';
    }
}
<%@ page import="com.company.up.domain.User" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.Map" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>demo.jsp</title>
</head>
<body>
<h3>獲取user對象</h3>
<%
    User user = new User("Regino", 21, "男");
    request.setAttribute("user", user);
%>
${user}<br><%--執行該對象的toString方法--%>
${user.name} | ${user.age} | ${user.sex}<br>
</body>
</html>

ii. 獲取 List 集合

<%@ page import="com.company.up.domain.User" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.Map" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>demo.jsp</title>
</head>
<body>
<h3>獲取list集合</h3>
<%
    List<Object> list = new ArrayList<>();
    list.add("胖虎");
    list.add("小夫");
    list.add("靜香");
    User user = new User("Regino", 21, "男");
    list.add(user);
    request.setAttribute("list", list);
%>
${list}<br><%--執行該對象的toString方法--%>
${list[0]} | ${list[1]} | ${list[2]} | ${list[3].name} | ${list[10]}<br> <%--el表達式不會出現 集合(數組)角標越界異常--%>
</body>
</html>

在這裏插入圖片描述

iii. 獲取 Map 集合

<%@ page import="com.company.up.domain.User" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.Map" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>demo.jsp</title>
</head>
<body>
<h3>獲取map集合</h3>
<%
    Map<String, Object> map = new HashMap<>();
    map.put("key1", "胖虎");
    map.put("key2", "小夫");
    map.put("key3", "靜香");
    User user = new User("Regino", 21, "男");
    map.put("key.4", user);
    request.setAttribute("map", map);
%>
${map}<br><%--執行該對象的toString方法--%>
${map.key1} | ${map.key2} | ${map.key3} | ${map["key.4"].name}<br>
</body>
</html>

2. EL 執行運算

a. 語法

  • 算數運算符:
    語法: + - * /(div) %(mod)
    可以用單詞也可以用符號
  • 比較運算符:
    語法:> < >= <= ==(eq) !=(ne)
  • 邏輯運算符:
    語法:&&(and) ||(or) !(not)
  • 三元運算符:
    語法:${條件表達式?爲真:爲假}
  • 空運算符:
    語法:${not empty 對象}
    功能:
    可以判斷字符串和對象是否爲空
    可以判斷一個集合的長度是否爲 0

b. 代碼示例

<%@ page import="com.company.up.domain.User" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>demo.jsp</title>
</head>
<body>
<%
    int a = 4;
    int b = 3;
    request.setAttribute("a", a);
    request.setAttribute("b", b);
%>
<h5>算數運算符</h5>
${a / b} | ${a div b}<br>
${a % b} | ${a mod b}<br>

<h5>比較運算符</h5>
${a == b} | ${a eq b}<br>
${a !=b } | ${a ne b}<br>

<h5>三元運算符</h5>
${a == b ? "a相等於b" : "a不等於b"}<br>

<h5>非空判斷</h5>
<%
    User user = new User();
    request.setAttribute("user", user);

    List list = new ArrayList();
    list.add("aa");
    request.setAttribute("list", list);
%>
user對象:${not empty user}<br> <%--  if(user !=null ){} --%>
list集合:${not empty list}<br> <%-- if(list !=null && list.size>0 ){}--%>

<h5>空值判斷</h5>
user對象:${empty user}<br> <%--  if(user ==null ){} --%>
list集合:${empty list}<br> <%-- if(list ==null || list.size==0 ){}--%>
</body>
</html>

3. EL 隱式對象

a. 常用隱式對象

  • EL 表達式中有 11 個隱式對象。比較常用的有:
    • pageContext
      就是 JSP 9 個內置對象之一,可以獲得其他 8 個內置對象。
    • cookie
      可以獲取瀏覽器指定 Cookie 名稱的值。

b. 代碼示例

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>demo.jsp</title>
</head>
<body>
<h3>el 隱式對象</h3>
${pageContext.request.contextPath} 動態獲取:項目名稱(虛擬路徑)<br>
${cookie.JSESSIONID.value} 獲取指定cookie名稱的值...<br>
</body>
</html>

4. EL 版本支持

  • JSP 默認支持 EL 表達式。
  • Servlet 2.3 規範中,默認不支持 EL 表達式。

5. 忽略 EL 表達式

a. 語法

  • 忽略當前 JSP 頁面中所有的 EL 表達式:
    設置 JSP 中 page 指令中 isELIgnored="true" 屬性
  • 忽略單個 EL 表達式:
    \${表達式}

b. 代碼示例

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>demo.jsp</title>
</head>
<body>
<h3>el 隱式對象</h3>
${pageContext.request.contextPath} 動態獲取:項目名稱(虛擬路徑)<br>
\${cookie.JSESSIONID.value} 獲取指定cookie名稱的值...<br>
</body>
</html>

II. JSTL

  • Jsp(Jsp Standard Tag Library,標準標籤庫):是由 Apache 組織提供的開源的 JSP 標籤庫,用於替換和簡化 JSP 頁面中 Java 代碼的編寫。

1. JSTL 標籤庫

  • JSTL 標準標籤庫有 5 個子庫,但隨着發展,目前常使用的是它的核心庫(Core)。
標籤庫 標籤庫的 URI 前綴
Core http://java.sun.com/jsp/jstl/core c
國際化(幾乎不用) http://java.sun.com/jsp/jstl/fmt fmt
SQL(過時) http://java.sun.com/jsp/jstl/sql sql
XML(過時) http://java.sun.com/jsp/jstl/xml x
Functions(幾乎不用) http://java.sun.com/jsp/jstl/functions fn

2. Core 標籤使用步驟

a. 當前 web 項目引入 Jar 包

在這裏插入圖片描述

b. 當前 JSP 頁面 tablib 指令引入

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

3. 常用 Core 標籤

a. c:if 標籤

  • c:if 標籤相當於 Java 中的 if(){}

i. 語法

  • <c:if test="boolean值"></c:if>
    • true:顯示標籤體內容;
    • false:隱藏標籤體內容。
  • 通常與 EL 表達式一起使用
  • 注意:此標籤沒有 else 功能,如果想實現 else 效果,要讓條件取反。

ii. 代碼示例

<%@ page import="com.company.up.domain.User" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>demo.jsp</title>
</head>
<body>
<%
    User user = new User();
//    user.setName("Regino");
//    request.setAttribute("user", user);
%>
<c:if test="${empty user}">
    你好,請登錄...
</c:if>
<c:if test="${not empty user}">
    你好,${user.name}
</c:if>
</body>
</html>

b. c:forEach 標籤

  • c:forEach 標籤相當於 Java 中的 for 循環

i. 普通 for 循環

		for(int i=1; i<=5; i++){
            i
		}
		<c:forEach begin="1" end="5" step="1" var="i">
			${i}
		</c:forEach>
  • begin="1":起始值(包含);
  • end="5":結束值(包含);
  • step="1":步長爲 1;
  • var="i":當前輸出臨時變量。

ii. 增強 for 循環

		for(User user : list){
            user
		}
	<c:forEach items="${list}" var="user" varStatus="vs">
		${user}
	</c:forEach>
  • items="list":集合;
  • var="user":當前輸出的臨時變量;
  • varStatus="vs":變量狀態,vs 表示 1 個對象,用於在增強 for 中取出索引,有 2 個屬性:
    • index:當前索引,從 0 開始;
    • count:計數器,從 1 開始。

iii. 代碼示例

<%@ page import="com.company.up.domain.User" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>demo.jsp</title>
</head>
<body>
<h3>普通for循環</h3>
<c:forEach begin="1" end="5" step="1" var="i"> <%--for循環將臨時變量存儲到了 pageContext域空間--%>
    ${i}<br>
</c:forEach>
<h3>增強for循環</h3>
<%
    List<User> list = new ArrayList<>();
    list.add(new User("Regino", 21, "男"));
    list.add(new User("Reggie", 23, "女"));
    list.add(new User("Reginald", 20, "中"));
    request.setAttribute("list", list);
%>
<c:forEach items="${list}" var="user" varStatus="vs">
    索引:${vs.index} | 計數器: ${vs.count} | ${user.name}<br>
</c:forEach>
</body>
</html>

c. c:choose 標籤

i. 語法

  • c:choose 標籤相當於 Java 中的 switch 語句
    • <c:choose>:等價於 switch;
    • <c:when>:等價於 case + break;
    • <c:otherwise>:等價於 default。

ii. 代碼示例

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>demo.jsp</title>
</head>
<body>
<h3>choose標籤</h3>
<%
    Integer face = 10;
    request.setAttribute("face", face);
%>
<c:choose>
    <c:when test="${face <= 7}">
        普通
    </c:when>
    <c:when test="${face == 8 || face == 9}">
        明星
    </c:when>
    <c:when test="${face == 10}">
        傾城
    </c:when>
    <c:otherwise>
        外星人
    </c:otherwise>
</c:choose>
</body>
</html>

原文鏈接:https://qwert.blog.csdn.net/article/details/105698202

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章