JSP 中理想功能:
- 接收屬性;
- 判斷浙于;
- 輸出檀轨;
- 盡量少用scriptlet (腳本片段)讹挎;
- 所以 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)置對象
- 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的屬性睹酌;
- param和paramValues內(nèi)置對象
- 用來接收傳來的參數(shù);
- param.a類似于request.getParameter("a");
- paramValues.a類似于request.getParameterValues("a");
- 如果想要取得第二個a的值剩檀,則通過${paramValues.a[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ù)
- 表達(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>
- 表達(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 是一樣的中鼠。
- 運算符
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} //表示判斷是否為空
本文參見于: