版權聲明:尊重部落客原創文章,轉載請注明出處哦~http://blog.csdn.net/eson_15/article/details/51264269
這節我們總結一下el表達式相關内容。
el表達式說白了,就是讓jsp寫起來更加友善,它屬于jsp技術。那麼它主要都有哪些方面的作用呢?
<%@page import="javabean.address"%>
<%@page import="javabean.person"%> <!-- javabean的具體代碼就不寫了,很簡單 -->
<%@ page language="java" import="java.util.*" pageencoding="utf-8"%>
<!doctype html public "-//w3c//dtd html 4.01 transitional//en">
<html>
<head>
<title>el表達式</title>
</head>
<body>
<%
request.setattribute("name", "aaa"); //先向request域中存個對象
%>
<!-- 相當于pagecontext.findattribute("name") 會從page request session application四個域中尋找 -->
${name }
<!-- 在jsp頁面中使用el表達式可以擷取bean的屬性 -->
<%
person p = new person();
p.setage(12);
request.setattribute("person", p);
%>
${person.age}
<!-- 在jsp頁面中使用el表達式可以擷取bean中的bean。。。 -->
person person = new person();
address address = new address();
person.setaddress(address);
request.setattribute("person", person);
%>
${person.address.name}
<!-- 在jsp頁面中使用el表達式可以擷取list集合指定位置的資料 -->
person p1 = new person();
p1.setname("aa");
person p2 = new person();
p2.setname("bb");
list<person> list = new arraylist<person>();
list.add(p1);
list.add(p2);
request.setattribute("list", list);
%>
${list[0].name}
<!-- 在jsp頁面中使用el表達式可以擷取map集合的資料 -->
map<string,string> map = new hashmap<string,string>();
map.put("a", "aaaax");
map.put("b", "bbbbx");
map.put("1", "ccccx");
request.setattribute("map", map);
${map.a}
${map["1"] } <!-- 以數字為關鍵字時候的取法 -->
<!-- 使用el表達式可以擷取web應用的名稱 -->
<a href="${pagecontext.request.contextpath }/1.jsp">點選</a>
</body>
</html>
文法:${運算表達式} el表達式支援如下運算符:
==(eq) !=(ne) <(lt) >(gt) <=(le) >=(ge) &&(and) ||(or) !(not)
empty運算符:檢查對象是否為null或“空”。
二進制運算式:${user!=null? user.name : ""}。
運算符比較簡單,不多說了……
el表達式語言中定義了11個隐含對象,使用這些隐含對象可以很友善地擷取web開發中的一些常見對象,并讀取這些對象的資料。
文法:${隐式對象名稱} : 獲得對象的引用。
隐含對象名稱以及描述:
pagecontext: //對應于jsp頁面中的pagecontext對象(注意:取的是pagecontext對象)
pagescope: //代表page域中用于儲存屬性的map對象
requestscope: //代表request域中用于儲存屬性的map對象
sessionscope: //代表session域中用于儲存屬性的map對象
applicationscope: //代表application域中用于儲存屬性的map對象
param: //表示一個儲存了所有請求參數的map對象
paramvalues: //表示一個儲存了所有請求參數的map對象,它對于某個請求參數,傳回的是一個string[]
header: //表示儲存了所有http請求頭字段的map對象
headervalues: //同上,傳回string[]數組。注意:如果頭裡面有"-",例如accept-encoding,則要headervalues["accept-encoding"]
cookie: //表示一個儲存了所有cookie的map對象
initparam: //表示了一個儲存了所有web應用初始化參數的map對象
具體看下面的例子:
<head>
<title>el隐式對象</title>
<body>
<!-- ${name} 表示 pagecontext.findattribute("name")
過程是這樣:首先判斷name是否為el的隐式對象,如果是直接傳回該隐式對象的引用,不是則調用findattribute方法
-->
${pagecontext } <!-- 拿到pagecontext的引用:org.apache.jasper.runtime.pagecontextimpl@155ef996 -->
<!-- 拿到pagecontext就可以拿到所有其他域對象了,比如 ${pagecontext.request} -->
<br>
<!-- 從指定的page域中查找資料 -->
<%
pagecontext.setattribute("name", "aaa");//map
%>
${pagescope.name }
<!-- ${name}會從四個域裡面查找name 而${pagescope.name}隻會從page域中查找 -->
<br>
<!-- 從request域中查找資料 -->
request.setattribute("name", "bbb");
${requestscope.name }
<!-- 如果用${name}會取到aaa,因為會首先在pagecontext中查找 -->
<br>
<!-- 從session域中查找資料,可以用于檢查使用者是否登陸 -->
<!-- 從application域中查找資料,與上面的原理都相同 -->
<!-- 獲得用于儲存請求參數的map,并從map中擷取資料 -->
<!-- http://localhost:8080/test/1.jsp?name=eson_15 -->
${param.name } <!-- 拿到eson_15 -->
<!-- 此表達式會經常用在資料回顯上 -->
<form action="${pagecontext.request.contextpath }/servlet/reqisterservlet" method="post">
<input type="text" name="username" value="${param.username }">
<input type="submit" value="注冊">
</form>
<br>
<!-- paramvalue獲得請求參數 map{"",string[]} -->
<!-- http://localhost:8080/test/1.jsp?like=sing&like=dance -->
${paramvalues.like[0] }
${paramvalues.like[1] }
<!-- header擷取請求頭 -->
${header.accept }
${header["accept-encoding"]}
<!-- headervalues和paramvalues一樣的 -->
<!-- 擷取客戶機送出的cookie -->
${cookie.jsessionid.value } <!-- 獲得cookie對象中名為jsessionid的cookie值 -->
<!-- 擷取web應用初始化參數 -->
${initparam.name } <!-- 用于獲得web.xml中<context-param>中的參數 -->
el表達式文法允許開發人員開發自定義函數,以調用java類的方法。示例:${prefix: method(params)}
在el表達式中調用的隻能是java類的靜态方法,這個java類的靜态方法需要在tld檔案中描述,才可以被el表達式調用。el自定義函數用于擴充el表達式的功能,可以讓el表達式完成普通java程式代碼所能完成的功能。
我們在工程test的test包裡建立一個名為htmlfilter的class,如下:
public class htmlfilter {
//轉義
public static string filter(string message) {
if (message == null)
return (null);
char content[] = new char[message.length()];
message.getchars(0, message.length(), content, 0);
stringbuilder result = new stringbuilder(content.length + 50);
for (int i = 0; i < content.length; i++) {
switch (content[i]) {
case '<':
result.append("<");
break;
case '>':
result.append(">");
case '&':
result.append("&");
case '"':
result.append(""");
default:
result.append(content[i]);
}
}
return (result.tostring());
}
}
然後在webroot下建立一個file,名為test.tld:
<?xml version="1.0" encoding="utf-8" ?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/xmlschema-instance"
xsi:schemalocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
<description>a tag library exercising simpletag handlers.</description>
<tlib-version>1.0</tlib-version>
<short-name>simpletaglibrary</short-name>
<uri>http://tomcat.apache.org/jsp2-example-taglib</uri>
<function>
<name>filter</name>
<function-class>test.htmlfilter</function-class>
<function-signature>java.lang.string filter(java.lang.string)</function-signature>
</function>
</taglib>
<function>元素用于描述一個el自定義函數,其中:
<name>子元素用于指定el自定義函數的名稱。
<function-class>子元素用于指定完整的java類名。
<function-signature>子元素用于指定java類中的靜态方法的簽名,方法簽名必須指明方法的傳回值類型及各個參數的類型,各個參數之間用逗号分隔。
然後建立一個jsp檔案,導入<%@ taglib uri="/web-inf/test.tld" prefix="fn" %>,在body中寫上:${fn:filter("<a href=''>點點</a>") }即可調用htmlfilter類中的靜态方法filer了。
開發el function注意事項:
1)編寫完标簽庫描述檔案後,需要将它放置到<web應用>\web-inf目錄中或web-inf目錄下的除了classes和lib目錄之外的任意子目錄中。
2)tld檔案中的<uri>元素用來指定該tld檔案的url,在jsp檔案中需要通過這個url來引入該标簽庫描述檔案。
由于在jsp頁面中顯示資料時,經常需要對顯示的字元串進行處理,sun公司針對于一些常見處理定義了一套el函數庫供開發者使用。這些el函數在jstl開發包中進行描述,是以在jsp頁面中使用sun公司的el函數庫,需要導入jstl開發包,并在頁面中導入el函數庫,如下所示:
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
jstl中的常用el函數
1) fn:tolowercase函數将一個字元串中包含的所有字元轉換為小寫形式,并傳回轉換後的字元串,它接受一個字元串類型的參數,例如:
fn:tolowercase("www.baidu.com")傳回字元串為"www.baidu.com"
fn:tolowercase("")傳回值為空字元串。
fn.touppercase将一個字元串包含的所有字元轉換為大寫,參數與上面一樣
2) fn:trim函數删除一個字元串的首尾空格,并傳回删除空格後的結果字元串,它接收一個字元串類型的參數。需要注意的是,fn:trim函數不能删除字元串中間位置的空格。
3)fn:length函數傳回一個集合或數組大小,歐傳回一個字元串中包含的字元的個數,傳回值為int類型。該函數接受一個參數,這個參數可以是<c:foreach>标簽的items屬性支援的任何類型,包括任意類型的數組、java.util.collection、java.util.iterator、java.util.enumeration、java.util.map等類的執行個體對象和字元串。如果fn:length函數的參數為null或者是元素個數為0的集合或數組對象,則函數傳回0;如果參數時空字元串,則函數傳回0。
4)fn:split函數以指定字元串作為分隔符,将一個字元串分隔成字元串數組并傳回這個字元串數組。該函數接收兩個字元串類型的參數,第一個參數表示要分隔的字元串,第二個參數表示作為分隔符的字元串。如:fn:split("www.baidu.com",".")[1]的傳回值為字元串"baidu"。
5)fn:join函數以一個指定的分隔符,将一個數組中的所有元素合并為一個字元串。fn:join函數接收兩個參數,第一個參數是要操作的字元串數組,第二個參數是作為分隔符的字元串。如果fn:join函數的第二個參數是空字元串,則fn:join函數的傳回值直接将元素連接配接起來。例如:假設stringarray是儲存在web域中的一個屬性,它表示一個值為{"www","baidu","com"}的字元串數組,則fn:join(stringarray,".")傳回字元串"www.baidu.com"。fn:join(fn:split("www,baidu,com",","),".")的傳回值為字元串"www.baidu.com"。
6)fn:contains函數檢測一個字元串中是否包含指定的字元串,傳回值為布爾類型。fn:contains函數在比較兩個字元串是否相等時是大小敏感的。fn:contains函數接收兩個字元串類型的參數,如果第一個參數字元串中包含第二個參數字元串,則fn:contains函數傳回true,否則傳回false。如果第二個參數的值為空字元串,則fn:contains總是傳回true。實際上,fn:contains(string, substring)等價于fn:indexof(string, substring)!=-1。忽略大小的el函數:fn:containsignorecase
7)fn:startswith函數用于檢測一個字元串是否是以指定字元串開始的,是則傳回true,不是則傳回false。fn:startswith函數接收兩個字元串類型的參數,如果第一個參數字元串以第二個參數字元串開始,則函數傳回為true,否則函數傳回false,如果第二個字元串為空字元串,則函數總是傳回true。與之對應的el函數:fn:endswith
8)fn:replace函數将一個字元串中包含的指定字元串替換為其它的指定字元串,并傳回替換後的結構字元串。fn:replace方法接收三個字元串類型的參數,第一個參數表示要操作的源字元串,第二個參數表示元字元串中要被替換的子字元串,第三個參數表示要被替換成的字元串。如:fn:replace("www baidu com"," ",".")的傳回值為字元串"www.baidu.com"。
9)fn:substring函數用于截取一個字元串的子字元串并傳回截取到的子字元串。該函數接收三個參數:第一個參數用于指定要操作的源字元串,第二個參數是用于指定截取子字元串開始的索引值,第三個參數是用于指定截取子字元串結束的索引值,第二和第三個參數都是int類型,其值都是從0開始。
10)fn:substringafter函數用于截取并傳回一個字元串中的指定子字元串第一次出現之後的子字元串。該函數接收兩個字元串類型的參數:第一個表示要操作的源字元串,第二個表示指定的子字元串。]如:fn:substringafter("www.baid.com",".")的傳回值為字元串"baidu.com"與之對應的el函數為:fn:substringbefore
11)fn:escapexml函數表示轉義,将xml檔案原封不動輸出,該函數有一個參數,接收被轉義的字元串。
el表達式就總結這麼多,如有錯誤之處歡迎留言指正~
_____________________________________________________________________________________________________________________________________________________
-----樂于分享,共同進步!