表達式語言

JSP 中理想功能:

  1. 接收屬性;
  2. 判斷;
  3. 輸出;
  4. 盡量少用scriptlet (腳本片段);
  5. 所以 JSP 中應該盡可能的把功能減少到這個程度。

表達式語言的介紹

表達式語言是為了能夠讓JSP中更少的包含Java代碼;

用表達式語言可以方便地完成輸出;

因此表達式語言的目的:

  • 更方便的顯示;

  • JSP表達式語言(EL)使得訪問存儲在JavaBean中的數據變得非常簡單。

  • JSPEL既可以用來創建算術表達式也可以用來創建邏輯表達式。

  • 在JSP EL表達式內可以使用整型數,浮點數,字符串,常量true、false,還有null。

一般表達式語言的形式:${.....}

簡單示例

當您需要在 JSP 標簽中指定一個屬性值時,只需要簡單地使用字符串即可,列如:

<jsp:setProperty name="box" property="perimeter" value="100"/>

但是,對于這個標簽中的 value 我們還可以動態的來表示:

<jsp:setProperty name="box" property="perimeter" 
                 value="${testValue}"/>

其中 expr 指的是表達式。在 JSP EL 中通用的操作符是 . 和 {} 。這兩個操作符允許您通過內嵌的JSP對象訪問各種各樣的JavaBean屬性。
假如 testValue 的值是 Hello JSP! ,
當JSP編譯器在屬性中見到"${}"格式后,它會產生代碼來計算這個表達式,并且產生一個替代品來代替表達式的值。
您也可以在標簽的模板文本中使用表達式語言。比如<jsp:text>標簽簡單地將其主體中的文本插入到JSP輸出中:

<jsp:text>
<h1>Hello JSP!</h1>
</jsp:text>

例二:我們設定在值是下面的一組,

request.setAttribute("name","xiazdong");

${name}即可進行顯示;

傳統獲取屬性的方法:

<%@ page contentType="text/html" pageEncoding="GBK"%>  
<html>  
    <head>  
        <title>Ttitle</title>  
    </head>  
    <body>  
        <%  
            request.setAttribute("name","xiazdong");  
        %>  
        <%  
            if(request.getAttribute("name")!=null){  
            %>  
                <h3><%=request.getAttribute("name")%></h3>  
            <%  
            }  
        %>  
    </body>  
</html> 
// 上面代碼也可以替換成如下代碼
<%@ page contentType="text/html" pageEncoding="GBK"%>  
<html>  
    <head>  
        <title>Ttitle</title>  
    </head>  
    <body>  
        <%  
            request.setAttribute("name","xiazdong");  
        %>  
        <h3>${name}</h3>  
    </body>  
</html>  


表達式語言的內置對象

  1. pageScope、requestScope、sessionScope、applicationScope內置對象

在取得內置對象設置的屬性時有用。這些是為了取得page、request、session、application設置的屬性,比如:

  • pageContext.setAttribute("name","xiazdong");
  • request.setAttribute("name","xiazdong");同時出現,則通過
  • ${pageScope.name}可以取得page的屬性;
  • ${requestScope.name}可以取得request的屬性;
  1. param和paramValues內置對象
  • 用來接收傳來的參數;
  • param.a類似于request.getParameter("a");
  • paramValues.a類似于request.getParameterValues("a");
  • 如果想要取得第二個a的值,則通過${paramValues.a[1]};
  1. pageContext內置對象
  • pageContext對象可以取得request,session,application對象;
  • pageContext.request取得request內置對象;
  • pageContext.session取得session內置對象;
  • pageContext.application取得application對象;

還可以調用JSP內置對象的方法:舉例:(都是通過反射調用)

  • (1)${pageContext.request.remoteAddr}; 調用getRemoteAddr();
  • (2)${pageContext.session.new};調用isNew()函數
  • (3)${pageContext.session.id};調用getId()函數
  1. 表達式語言用于集合

我們可以通過表達式語言很方便的操作集合,比如:

List<Integer> list = new ArrayList<Integer>();
request.setAttribute("a",list);
${a[0]}  //表示取得隊列中第一個元素;以此類推;

Map m = new HashMap();
request.setAttribute("map",m);
${map["a"]} //返回key=a的value;
${map.a} //返回key=a的value;

示例:

<%@ page contentType="text/html" pageEncoding="GBK" import="java.util.*"%>  
<html>  
    <head>  
        <title></title>  
    </head>  
    <body>  
        <%  
            application.setAttribute("info","application");  
            session.setAttribute("info","session");  
            request.setAttribute("info","request");  
            pageContext.setAttribute("info","page");  
            List<Integer> list = new ArrayList<Integer>();  
            list.add(1);  
            list.add(2);  
            pageContext.setAttribute("list",list);  
            Map<String,String>map = new HashMap<String,String>();  
            map.put("name","xiazdong");  
            pageContext.setAttribute("map",map);  
        %>  
        <h3>${applicationScope.info}</h3>  
        <h3>${sessionScope.info}</h3>  
        <h3>${requestScope.info}</h3>  
        <h3>${pageScope.info}</h3>  
        <h3>${pageContext.request.remoteAddr}</h3>  
        <h3>${pageContext.session.id}</h3>  
        <h3>${pageContext.session.new}</h3>  
        <h3>${param.name}</h3>  
        <h3>${paramValues.favor[0]}</h3>  
        <h3>${paramValues.favor[1]}</h3>  
        <h3>${paramValues.favor[2]}</h3>  
        <h3>${list[0]}</h3>  
        <h3>${map["name"]}</h3>  
          
    </body>  
</html>  
  1. 表達式語言用于MVC

MVC設計模式是通過Servlet將結果傳遞給JSP頁面顯示,如果按照一般的思路,則需要在JSP中導入VO包,因為需要通過VO對象得到屬性;比如:

VO是Person類,則JSP中需要以Person per = (Person)request.getAttribute("person");

取得Person對象然后顯示,從這句話可以看出,我們必須要導入Person類才可以,但是JSP最好只允許導入java.util.*包;
所以違背了要求;

如果根據表達式語言,則可以通過在Servlet中編寫:

request.setAttribute("VO",VO對象);

設置屬性,因為requestDispatcher是服務器跳轉,因此可以在JSP中通過${VO.屬性}取得結果;這樣就不用導入VO包;

通過表達式語言可以方便的調用VO的屬性;

class A{
    private String a;
}
  • 傳遞對象
A a1 = new A();
request.setAttribute("obj",a1);
${obj.a} //通過反射獲得a1對象的a屬性;
  • 傳遞多個對象
List<A> as = new ArrayList<A>();
request.setAttribute("as",as);

在jsp頁面中:
List as = (List)request.getAttribute("as");
Iterator iter = as.iterator();
while(iter.hasNext()){ //也可以使用 for 循環遍歷
    pageContext.setAttribute("obj",iter.next());
    ${obj.a}            //調用A類的a屬性
}

其實 JSP 上接收對象和我們在 Java 中遍歷一個 list 是一樣的。

  1. 運算符

EL表達式支持大部分Java所提供的算術和邏輯操作符:

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

使用示例:

//例一:
<jsp:text>
Box Perimeter is: ${2*box.width + 2*box.height}
</jsp:text>
//例二:
request.setAttribute("num1",20);
request.setAttribute("num2",30);
${num1-num2} //表示減法運算
${num1>=num2} //表示比較運算
${ empty num2} //表示判斷是否為空

本文參見于:

http://blog.csdn.net/xiazdong/article/details/6901497

http://www.runoob.com/jsp/jsp-expression-language.html

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容