表達式語言(Expression Language,簡稱EL)是JSP 2.0及以上版本中引入的一種簡化頁面代碼編寫的語言,它提供了一種在JSP頁面中更容易使用JavaBean屬性及集合的方式。EL主要用于簡化對Java代碼的調用,特別是從后端到前端的數據傳輸。
EL定義了一套隱式對象,這些對象可以直接在EL表達式中使用,而不需要顯式聲明。以下是EL中的一些常見隱式對象及其作用:
1. pageScope
- 作用:包含當前頁面作用域內所有屬性的Map。
- 訪問方式:
pageScope['attributeName']
2. requestScope
- 作用:包含當前請求作用域內所有屬性的Map。
- 訪問方式:
requestScope['attributeName']
3. sessionScope
- 作用:包含當前會話作用域內所有屬性的Map。
- 訪問方式:
sessionScope['attributeName']
4. applicationScope
- 作用:包含應用作用域(ServletContext)內所有屬性的Map。
- 訪問方式:
applicationScope['attributeName']
5. param
- 作用:包含請求參數的Map,所有參數的值類型都是String。
- 訪問方式:
param['paramName']
6. paramValues
- 作用:包含請求參數的Map,它允許一個參數有多個值,因此Map的值是String數組。
- 訪問方式:
paramValues['paramName'][index]
7. header
- 作用:包含HTTP請求頭的Map,所有頭信息的值類型都是String。
- 訪問方式:
header['headerName']
8. headerValues
- 作用:包含HTTP請求頭的Map,允許頭信息有多個值,值是String數組。
- 訪問方式:
headerValues['headerName'][index]
9. cookie
- 作用:包含請求中所有的Cookie對象的Map,可以直接訪問每個cookie的值。
- 訪問方式:
cookie['cookieName'].value
10. initParam
- 作用:包含所有初始化參數的Map(如web.xml中配置的)。
- 訪問方式:
initParam['paramName']
源碼級解析
EL是由JSP容器實現的,我們通常不直接處理其源碼。但是,我們可以通過理解EL表達式是如何被解析和執行的來更深入地了解其工作原理。
當JSP頁面被請求時,容器會解析頁面上的EL表達式。容器內部將EL表達式轉換為一個抽象語法樹(AST),然后按照這個樹來計算表達式的值。計算過程中,容器會檢查隱式對象的Map,以及顯式設置的屬性,從而獲取相應的值。
代碼演示
一個簡單的例子,使用param
隱式對象輸出請求中的參數值:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>EL Implicit Objects Demo</title>
</head>
<body>
Hello, ${param.name}!
</body>
</html>
假設請求URL是http://example.com/hello.jsp?name=John
,頁面會輸出:
Hello, John!
在這個例子中,${param.name}
是一個表達式,其中param
是隱式對象,而name
是請求參數的名字。
JSP容器在解析這個表達式時,會從param
隱式對象中獲取name
參數的值,并將其輸出到頁面上。如果沒有傳遞name
參數,輸出會是Hello, !
,因為param.name
將解析為null
。
EL表達式提供了一種簡潔高效的方式來訪問后臺數據。通過使用EL隱式對象,開發者可以在JSP頁面中以極簡的代碼實現數據訪問和展示。