JSP 中理想功能:
- 接收屬性;
- 判斷;
- 輸出;
- 盡量少用scriptlet (腳本片段);
- 所以 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ì)象
- 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的屬性;
- 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]};
- 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ù)
- 表達(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>
- 表達(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 是一樣的。
- 運(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)于: