JavaWeb——JSP表達式語言(EL)


1、JSP表達式語言(EL)用於在jsp從訪問存儲在JavaBean中的數據,例如

User ID: ${user.userId}<br />

  這里的${user.userId}就是JSP EL表達式,效果就是:

User ID: 19358

  19358是userId的數據

 

2、語法

  • 立即執行  

    立即執行EL表達式將在頁面渲染的時候,被JSP引擎解析和執行。這就意味着EL表達式將在JSP引擎中發現它,並在繼續執行其他頁面部分之前執行它,就類似c語言中的宏那樣,下面的例子中EL表達式將會立即執行,其中expr是一個EL表達式

${expr}

    美元符號和兩個花括號定義了EL表達式的邊界,在括號中的所有的內容都會作為EL表達式執行。所以如果我們需要使用美元符號就需要進行轉義

  • 延遲執行

    延遲執行EL表達式是統一表達式的一部分主要用於滿足JavaServer Faces的需要。下面的例子將是一個延遲執行的EL表達式

#{expr}

 

3、添加EL表達式

  EL表達式可以直接用在JSP的任何位置,除了少數特殊情況。首先不能用在任何指令中,因為編譯JSP時,指令將會被執行,但是EL表達式是在渲染JSP時執行,所以這里的EL表達式是無法正常工作的。

  另外,JSP聲明<%!%>、腳本<%%>或者表達式<%=%>中的EL表達式也是無效的。

  除此之外,EL表達式可以添加在任意的位置

  • 簡單文本中
User ID: ${expr}
  • 標准的HTML標簽中
<input type="text" name="something" value="${expr}"/>
  • JSP標簽中
<c:url value ="/something/${expr}/${expr}"/>

 

4、基礎操作符

操作符 描述
. 訪問一個Bean屬性或者一個映射條目
[] 訪問一個數組或者鏈表的元素
( ) 組織一個子表達式以改變優先級
+
- 減或負
*
/ or div
% or mod 取模
== or eq 是否相等
!= or ne 是否不等
< or lt 是否小於
> or gt 是否大於
<= or le 是否小於等於
>= or ge 是否大於等於
&& or and
|| or or
! or not 取反
empty 是否空值

 

5、對象屬性和方法

  EL表達式通過.進行JavaBean中屬性的簡化語法,假設現在有一個類user,有名為userId的類

${user.userId}

  如果使用這個表達式來訪問userId字段,這是行不通的因為這里的.實際尋找的是userId屬性而非字段,也就是說將調用的是user.getuserId()類似的JavaBean標准訪問方法。

  如果沒有這樣的標准方法,應該這樣進行訪問

${user["userId"]}

 

6、EL函數

  JSP EL允許您在表達式中使用函數。這些函數必須被定義在自定義標簽庫中。函數的使用語法如下:

${ns:func(param1, param2, ...)}

  其中ns是命名空間,func是函數名,param1、param2...是參數

  比如,有函數fn:length,在JSTL庫中定義,可以像下面這樣來獲取一個字符串的長度:

${fn:length("Get my length")}

 

7、lambda表達式

  lambda表達式就是一個匿名函數,EL lambda就是用箭頭操作符->分割左側的表達式參數和右側的表達式,以下是兩個有效的EL lambda表達式

${(a -> a + 5) (4)}
${((a,b) -> a + b) (3, 5)}

  還可以這樣使用:

${v = (a , b) -> a +b; v(3, 5)}

 

8、集合

  • map

  現假設有一個map擁有鍵username和ueseId,那么可以使用中括號訪問這兩個鍵的鍵值

${map["username"]}
${map["userId"]}

  也可以使用.

${map.username}
${map.userId}
  • list

  假設有一個list,它包含了三個值"green"、"red"、"blue",按照0到2d的順序一存儲,那么可以只有訪問

${list[0]}
${list[1]}
${list[2]}

  不能使用.

 

9、試用

  先新建一個類User,每個字段都將擁有相應的set和get方法

public class User {
    private long userId;
    private String username;
    private String firstname;
    private String lastname;
    private Map<String,Boolean> permission = new Hashtable<>();


    public long getUserId() {
        return userId;
    }

    public void setUserId(long userId) {
        this.userId = userId;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getFirstname() {
        return firstname;
    }

    public void setFirstname(String firstname) {
        this.firstname = firstname;
    }

    public String getLastname() {
        return lastname;
    }

    public void setLastname(String lastname) {
        this.lastname = lastname;
    }

    public Map<String, Boolean> getPermission() {
        return permission;
    }

    public void setPermission(Map<String, Boolean> permission) {
        this.permission = permission;
    }
}

  然后是Servlet:

@WebServlet(
        name = "ELServlet",
        urlPatterns = "/EL"
)
public class ELServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        User user = new User();
        user.setUserId(19358L);
        user.setUsername("Username");
        user.setFirstname("Firstname");
        user.setLastname("Lastname");

        Hashtable<String,Boolean> permissions = new Hashtable<>();
        permissions.put("user", true);
        permissions.put("moderator", true);
        permissions.put("admin", false);
        user.setPermission(permissions);

        req.setAttribute("user",user);
        req.getRequestDispatcher("/WEB-INF/jsp/view/EL.jsp")
                .forward(req,resp);
    }
}

  最后是JSP

<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>User</title>
</head>
<body>
    User ID: ${user.userId}<br />
    Username: ${user.username}(${user.username.length()} characters)<br/>
    Full Name: ${user.lastname += "," += user.firstname}
    <br/><br/>
    <b>Permissons (${fn:length(user.permission)})</b><br/>
    User: ${user.permission["user"]}<br/>
    Moderator: ${user.permission["moderator"]}<br/>
    Admin: ${user.permission["admin"]}<br/>
</body>
</html>

  需要注意的地方有user.username.length()這里相等於使用的是String的length方法,user.lastname += "," += user.firstname這里也是簡單的使用 += 進行字符串的拼接fn:length(user.permission),這里調用fn:length函數輸出permission的長度。

  結果:
  

10、使用隱含的EL變量

  JSP EL支持下表列出的隱含對象:

隱含對象 描述
pageScope page 作用域
requestScope request 作用域
sessionScope session 作用域
applicationScope application 作用域
param Request 對象的參數,字符串
paramValues Request對象的參數,字符串集合
header HTTP 信息頭,字符串
headerValues HTTP 信息頭,字符串集合
initParam 上下文初始化參數
cookie Cookie值
pageContext 當前頁面的pageContext

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM