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 |
