表達(dá)式語(yǔ)言

JSP 中理想功能:

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

表達(dá)式語(yǔ)言的介紹

表達(dá)式語(yǔ)言是為了能夠讓JSP中更少的包含Java代碼;

用表達(dá)式語(yǔ)言可以方便地完成輸出;

因此表達(dá)式語(yǔ)言的目的:

  • 更方便的顯示;

  • JSP表達(dá)式語(yǔ)言(EL)使得訪問(wèn)存儲(chǔ)在JavaBean中的數(shù)據(jù)變得非常簡(jiǎn)單。

  • JSPEL既可以用來(lái)創(chuàng)建算術(shù)表達(dá)式也可以用來(lái)創(chuàng)建邏輯表達(dá)式。

  • 在JSP EL表達(dá)式內(nèi)可以使用整型數(shù),浮點(diǎn)數(shù),字符串,常量true、false,還有null。

一般表達(dá)式語(yǔ)言的形式:${.....}

簡(jiǎn)單示例

當(dāng)您需要在 JSP 標(biāo)簽中指定一個(gè)屬性值時(shí),只需要簡(jiǎn)單地使用字符串即可,列如:

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

但是,對(duì)于這個(gè)標(biāo)簽中的 value 我們還可以動(dòng)態(tài)的來(lái)表示:

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

其中 expr 指的是表達(dá)式。在 JSP EL 中通用的操作符是 . 和 {} 。這兩個(gè)操作符允許您通過(guò)內(nèi)嵌的JSP對(duì)象訪問(wèn)各種各樣的JavaBean屬性。
假如 testValue 的值是 Hello JSP! ,
當(dāng)JSP編譯器在屬性中見(jiàn)到"${}"格式后,它會(huì)產(chǎn)生代碼來(lái)計(jì)算這個(gè)表達(dá)式,并且產(chǎn)生一個(gè)替代品來(lái)代替表達(dá)式的值。
您也可以在標(biāo)簽的模板文本中使用表達(dá)式語(yǔ)言。比如<jsp:text>標(biāo)簽簡(jiǎn)單地將其主體中的文本插入到JSP輸出中:

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

例二:我們?cè)O(shè)定在值是下面的一組,

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

${name}即可進(jìn)行顯示;

傳統(tǒng)獲取屬性的方法:

<%@ 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>  


表達(dá)式語(yǔ)言的內(nèi)置對(duì)象

  1. pageScope、requestScope、sessionScope、applicationScope內(nèi)置對(duì)象

在取得內(nèi)置對(duì)象設(shè)置的屬性時(shí)有用。這些是為了取得page、request、session、application設(shè)置的屬性,比如:

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

還可以調(diào)用JSP內(nèi)置對(duì)象的方法:舉例:(都是通過(guò)反射調(diào)用)

  • (1)${pageContext.request.remoteAddr}; 調(diào)用getRemoteAddr();
  • (2)${pageContext.session.new};調(diào)用isNew()函數(shù)
  • (3)${pageContext.session.id};調(diào)用getId()函數(shù)
  1. 表達(dá)式語(yǔ)言用于集合

我們可以通過(guò)表達(dá)式語(yǔ)言很方便的操作集合,比如:

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

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. 表達(dá)式語(yǔ)言用于MVC

MVC設(shè)計(jì)模式是通過(guò)Servlet將結(jié)果傳遞給JSP頁(yè)面顯示,如果按照一般的思路,則需要在JSP中導(dǎo)入VO包,因?yàn)樾枰ㄟ^(guò)VO對(duì)象得到屬性;比如:

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

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

如果根據(jù)表達(dá)式語(yǔ)言,則可以通過(guò)在Servlet中編寫(xiě):

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

設(shè)置屬性,因?yàn)閞equestDispatcher是服務(wù)器跳轉(zhuǎn),因此可以在JSP中通過(guò)${VO.屬性}取得結(jié)果;這樣就不用導(dǎo)入VO包;

通過(guò)表達(dá)式語(yǔ)言可以方便的調(diào)用VO的屬性;

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

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

其實(shí) JSP 上接收對(duì)象和我們?cè)?Java 中遍歷一個(gè) list 是一樣的。

  1. 運(yùn)算符

EL表達(dá)式支持大部分Java所提供的算術(shù)和邏輯操作符:

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

使用示例:

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

本文參見(jiàn)于:

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

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容