表達(dá)式語言

JSP 中理想功能:

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

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

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

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

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

  • 更方便的顯示崇摄;

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

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

  • 在JSP EL表達(dá)式內(nèi)可以使用整型數(shù),浮點數(shù)哪雕,字符串,常量true疫剃、false壤躲,還有null并齐。

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

簡單示例

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

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

但是疙描,對于這個標(biāo)簽中的 value 我們還可以動態(tài)的來表示:

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

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

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

例二:我們設(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á)式語言的內(nèi)置對象

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

在取得內(nèi)置對象設(shè)置的屬性時有用陵霉。這些是為了取得page琅轧、request、session踊挠、application設(shè)置的屬性乍桂,比如:

  • pageContext.setAttribute("name","xiazdong");
  • request.setAttribute("name","xiazdong");同時出現(xiàn),則通過
  • ${pageScope.name}可以取得page的屬性效床;
  • ${requestScope.name}可以取得request的屬性睹酌;
  1. param和paramValues內(nèi)置對象
  • 用來接收傳來的參數(shù);
  • param.a類似于request.getParameter("a");
  • paramValues.a類似于request.getParameterValues("a");
  • 如果想要取得第二個a的值剩檀,則通過${paramValues.a[1]};
  1. pageContext內(nèi)置對象
  • pageContext對象可以取得request,session,application對象憋沿;
  • pageContext.request取得request內(nèi)置對象;
  • pageContext.session取得session內(nèi)置對象谨朝;
  • pageContext.application取得application對象卤妒;

還可以調(diào)用JSP內(nèi)置對象的方法:舉例:(都是通過反射調(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á)式語言用于集合

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

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

MVC設(shè)計模式是通過Servlet將結(jié)果傳遞給JSP頁面顯示翩活,如果按照一般的思路阱洪,則需要在JSP中導(dǎo)入VO包,因為需要通過VO對象得到屬性菠镇;比如:

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

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

如果根據(jù)表達(dá)式語言程癌,則可以通過在Servlet中編寫:

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

設(shè)置屬性,因為requestDispatcher是服務(wù)器跳轉(zhuǎn)轴猎,因此可以在JSP中通過${VO.屬性}取得結(jié)果嵌莉;這樣就不用導(dǎo)入VO包;

通過表達(dá)式語言可以方便的調(diào)用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 循環(huán)遍歷
    pageContext.setAttribute("obj",iter.next());
    ${obj.a}            //調(diào)用A類的a屬性
}

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

  1. 運算符

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

操作符 描述
. row 1 col 2
. 訪問一個Bean屬性或者一個映射條目
[] 訪問一個數(shù)組或者鏈表的元素
( ) 組織一個子表達(dá)式以改變優(yōu)先級
+
- 減或負(fù)
*
/ 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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市只祠,隨后出現(xiàn)的幾起案子兜蠕,更是在濱河造成了極大的恐慌,老刑警劉巖抛寝,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件熊杨,死亡現(xiàn)場離奇詭異,居然都是意外死亡盗舰,警方通過查閱死者的電腦和手機(jī)晶府,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來钻趋,“玉大人川陆,你說我怎么就攤上這事÷唬” “怎么了较沪?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長失仁。 經(jīng)常有香客問我尸曼,道長,這世上最難降的妖魔是什么萄焦? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任控轿,我火速辦了婚禮,結(jié)果婚禮上拂封,老公的妹妹穿的比我還像新娘茬射。我一直安慰自己,他們只是感情好冒签,可當(dāng)我...
    茶點故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布在抛。 她就那樣靜靜地躺著,像睡著了一般萧恕。 火紅的嫁衣襯著肌膚如雪霜定。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天廊鸥,我揣著相機(jī)與錄音,去河邊找鬼辖所。 笑死惰说,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的缘回。 我是一名探鬼主播吆视,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼典挑,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了啦吧?” 一聲冷哼從身側(cè)響起您觉,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎授滓,沒想到半個月后琳水,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡般堆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年在孝,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片淮摔。...
    茶點故事閱讀 38,643評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡私沮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出和橙,到底是詐尸還是另有隱情仔燕,我是刑警寧澤,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布魔招,位于F島的核電站晰搀,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏仆百。R本人自食惡果不足惜厕隧,卻給世界環(huán)境...
    茶點故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望俄周。 院中可真熱鬧吁讨,春花似錦、人聲如沸峦朗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽波势。三九已至翎朱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間尺铣,已是汗流浹背拴曲。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留凛忿,地道東北人澈灼。 一個月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親叁熔。 傳聞我的和親對象是個殘疾皇子委乌,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,509評論 2 348

推薦閱讀更多精彩內(nèi)容