EL表達式詳解

什麼是EL表達式?

Expression Language(表達式語言)。

EL表達式能幹什麼?

替代JSP頁面中數據訪問時的複雜編碼,簡化開發,讓JSP代碼更加簡潔。

如何使用?

基本語法:${expression}

如果不實用EL表達式,JSP頁面獲取後臺傳來的數據,需要通過Java腳本的方式獲取:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <%
        String message = (String)request.getAttribute("message");
    %>
    <%=message %>
</body>
</html>

使用EL表達式之後,可大大簡化這種繁瑣的開發方式,讓JSP頁面更加簡潔。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    ${message }
</body>
</html>

${message}中的message對應域對象中數據的key值,那麼問題來了,域對象有4種,如果每一個域對象中都存放一個key=message的數據,那麼EL表達式取的是哪個呢?

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <%
        pageContext.setAttribute("message", "page");
        request.setAttribute("message", "request");
        session.setAttribute("message", "session");
        application.setAttribute("message", "application");
    %>
    ${message }
</body>
</html>

結果如圖:

可以看到取的是pageContext中的數據,EL表達式默認取數據的方式是根據pageContext->request->session->application的順序進行,如果在某個域對象中獲取了數據,則返回,不再繼續查找,如果沒有找到,繼續來到下一個域對象中查找,直到遍歷完4個域對象。

我們也可以指定EL在某個特定的域對象中查找,只需要在EL表達式中添加前綴即可:pageScope,requestScope,sessionScope,applicationScope,分別對於page作用域,request作用域,session作用域,application作用域。

比如,指定EL在request中查找。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <%
        pageContext.setAttribute("message", "page");
        request.setAttribute("message", "request");
        session.setAttribute("message", "session");
        application.setAttribute("message", "application");
    %>
    ${requestScope.message }
</body>
</html>

EL取對象的屬性值

EL表達式可以直接通過屬性名取出對應的值,底層實際在調用getter方法。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="com.southwind.entity.Reader" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <%
        Reader reader = new Reader();
        reader.setId(1);
        reader.setName("張三");
        request.setAttribute("reader", reader);
    %>
    ${reader.id }--${reader.name }
</body>
</html>

EL表達式獲取集合

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="com.southwind.entity.Reader" %>
<%@ page import="java.util.*" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <%

        Reader reader = new Reader();
        reader.setId(1);
        reader.setName("張三");
        Reader reader2 = new Reader();
        reader2.setId(2);
        reader2.setName("李四");
        Reader reader3 = new Reader();
        reader3.setId(3);
        reader3.setName("王五");
        List<Reader> list = new ArrayList<Reader>();
        list.add(reader);
        list.add(reader2);
        list.add(reader3);
        request.setAttribute("list", list);
    %>
    ${list[0].id }--${list[0].name }<br/>
    ${list[1].id }--${list[1].name }<br/>
    ${list[2].id }--${list[2].name }<br/>
</body>
</html>

EL表達式支持關係運算符和邏輯運算符

運算符可以使用轉義字符來表示:

&&:and

||:or

!:not

==:eq

!=:ne

<:lt

>:gt

<=:le

>=:ge

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="com.southwind.entity.Reader" %>
<%@ page import="java.util.*" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <%
        request.setAttribute("num1", 8);
        request.setAttribute("num2", 9);
        request.setAttribute("num3", 9);
    %>
    ${ num1 < num2 }<br/>
    ${ num1 lt num2 }<br/>
    ${ num1 > num2 }<br/>
    ${ num1 gt num2 }<br/>
    ${ num2 == num3 }<br/>
    ${ num2 eq num3 }<br/>
    ${ num1 < num2 && num1 > num2 }<br/>
    ${ num1 < num2 and num1 > num2 }<br/>
    ${ num1 < num2 || num1 > num2 }<br/>
    ${ num1 < num2 or num1 > num2 }<br/>
</body>
</html>

關鍵字empty判斷變量是否爲空

null,長度爲零的String,size爲0的集合都會認爲是空。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="com.southwind.entity.Reader" %>
<%@ page import="java.util.*" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <%
        Integer num = null; 
        String str = "";
        List<String> list = new ArrayList<String>();
        request.setAttribute("num", num);
        request.setAttribute("str", str);
        request.setAttribute("list", list);
    %>
    ${ empty num }<br/>
    ${ empty str }<br/>
    ${ empty list }<br/>
</body>
</html>

EL訪問http請求參數對象

添加param前綴即可。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="com.southwind.entity.Reader" %>
<%@ page import="java.util.*" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    ${param.id }
</body>
</html>

如果是多個參數,通過paramValues來獲取。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="com.southwind.entity.Reader" %>
<%@ page import="java.util.*" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    ${paramValues.id[0] }<br/>
    ${paramValues.id[1] }<br/>
    ${paramValues.id[2] }
</body>
</html>

EL訪問pageContext對象

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="com.southwind.entity.Reader" %>
<%@ page import="java.util.*" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    ${pageContext.servletConfig.servletName}<br/>
    ${pageContext.servletContext.contextPath}<br/>
    ${pageContext.request}
</body>
</html>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章