在我們日常Web開發中,常常用到EL表達式,JSTL標簽,還有可能用到JavaScript中的eval()。下面就這樣技術和函數小小說明一下。
EL(Expression Language),全稱表達式語言,既然是開發語言,那麼就像Java等語言一樣是用來寫語句的,通常是用在JSP頁面中,我們為了獲取JSP提供的內置對象的屬性值,
我們通常會使用到EL表達式,比如開發中常見的一個需求就是獲取項目的根目錄,如果項目的名值變化了,我們在指定路徑時,如果把項目的根目錄用一個變量來表示的話,那麼就不
需要修改我們代碼,所以此時我們通常會使用到一個常見的表達式${pageContext.request.contextPath},這個表達式的基本解釋就是獲取JSP的內置對象pageContext的request
對象的屬性contextPath的值。到此我們可以舉一個小例子來看看${pageContext.request.contextPath}的使用:
比如我們的項目結構是下面:
--demo
--src
--WebRoot
--WEB-INF
--css
--js
--img
--font
--page
如果我們的jsp文件全部放在page目錄下面,其中有一個文件demo.jsp引用了img文件夾下的一張圖片nav.jpg,核心代碼如下:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title>demo演示頁面</title>
</head>
<body>
<img alt="nav" src="${pageContext.request.contextPath}/img/nav.jpg">
</body>
</html>
如果這個項目發布到服務器中去了,以後有需求,說項目名得修改為demonstration,如果我們上面的代碼中不使用EL表達式來獲取項目名的話,上面的代碼可能就是下面的樣子
<img alt="nav" src="/demo/img/nav.jpg">,這時如果修改了項目名demo為demonstration,我們demo.jsp代碼就得跟著修改為下面的樣子
<img alt="nav" src="/demonstration/img/nav.jpg">。
所以我們使用EL表達式語言的第一個直觀的好處就是從頁面中抽取可能變化的部分,將其封裝為一個變量,這樣就方便了代碼的維護。當然除了這一點外,我們在開發中還是會
大量使用到EL表達式的,比如獲取page域、request域、session域或者application域中的參數和變量,我們經常在頁面中寫上這樣的EL表單式:
<input class="" id="" name="username" type="text" value="${username}" > 這樣的input輸入框通常出現在表單中,那麼後面的value="${username}是什麼含義
呢? 因為表單一般是用來封裝用戶提交的數據,那麼如果用戶輸入有誤,表單提交給後台程序處理,後台程序提示報錯不能正常按照業務邏輯走下去,比如用戶登陸表單中有上面的
<input>輸入框,用戶輸錯了用戶名,那麼就不能正常登陸,頁面應該跳轉到登陸頁面,提示相應的錯誤,那麼如果用戶名很長,輸入不是很方便的話,我們希望將用戶輸入的用戶
名回顯的話,那麼${username},就是完成這一功能的。它會從上面講到的page域開始查找是否有一個變量username,並通過${}來把變量的值獲取到,如果沒有再從request
域中查找...如果還沒有就從session域中查找,如果還沒有找到的話,最後會從application域查找,如果有就輸出其值,如果還沒有找到,就返回''(或者null).所以頁面中<input>
第一次是沒有值的,如果用戶輸入了錯誤的值,頁面跳轉回來的時候會把用戶輸入的錯誤的值回顯出來。
所以EL表達式的第二個用處就是常用來做數據的回顯。講到此處,順便說下,EL用來做頁面數據回顯的好處,因為EL底層也是使用Java語言寫的,所以使用EL可以輕松獲取
Java類型的數據,然而jsp頁面最終通過服務器"翻譯"成html的時候,只認識string類型的數據,這時使用EL它會自動完成基本數據類型的轉換,比如int類型數據,Date類型的數
據。這一點是JavaScript無法比擬的,因為JavaScript是無法直接解析後台傳過來的Java類型數據。
那麼開發中常常使用EL的地方還有嗎?很顯然還是有的,但是它喜歡帶上它的朋友JSTL一起。他們通常會一起合作來完成一些工作。比如我們有一個需求就是判斷用戶是否登
陸,如果登陸則顯示相應的操作菜單,我們通常這麼使用:
<c:if test="${user != null}">
<ul class="nav">
<li><a href="#">個人主頁</a></li>
<li><a href="#">注銷</a></li>
</ul>
</c:if>
所以可以看出來JSTL有點像標簽,沒錯JSTL就是 JSP標准標簽庫,標簽的底層實際上也是使用Java編寫的,它通常和邏輯判斷有關聯,同時呢,它的判斷條件很多時候又依賴EL來
獲取,所以說JSTL和EL是一對好朋友,互相幫助,彼此協作。JSTL還是有很多的功能的,限於時間和篇幅,我就把開發中常見的JSTL標簽的使用場景列舉一下:
(1)使用JSTL標簽的core標簽,常常使用別名c,比如<c:set>設置值,用來來時存儲一個值,一般是是供function標簽使用的、<c:out>輸出值,可以實現自動轉義,防止腳本攻
擊,<c:url>可以拼接url路徑並帶上參數,這樣也可以防止提交參數亂碼;
(2)還有剛才說到function標簽,我們可以截取內容顯示,fn:substring();
(3)除此之外我們還常常用到數據的格式化顯示別名fmt的標簽,實現格式化顯示日期,數據,貨幣。
最後說明一下,JavaScript中的eval(),首先它是一個函數,它的功能是:可計算某個字符串,並執行其中的的 JavaScript 代碼,但是我們很少直接使用,我們使用它的情況是
使用eval()來將json格式的數據的字符串解析成一個對象,比如下面的例子:
var data = '{"return_code":0,"return_message":"success","data":{"data":[{"id":"1","question":"公主令牌在哪交?"},{"id":"2","question":"公主護使有什麼用?"},{"id":"3","question":"角斗場在哪?"},{"id":"4","question":"北部斷層在哪?"},{"id":"5","question":"歡樂令有什麼用?"},{"id":"6","question":"令牌積分有什麼用?"},{"id":"7","question":"南部斷層在哪?"},{"id":"8","question":"大妖魔令牌交給誰?"},{"id":"9","question":"神工坊在哪?"},{"id":"10","question":"警戒妖珠有什麼用?"}]}}';
我們可以通過下面的代碼獲取上面類Map對象數據:
var obj = eval("("+data+")");
alert("return_code:"+obj["return_code"]);
alert("第一個問題id:" + obj["data"]["data"][0]["id"]);
好了,時間不早了,祝自己做一個拯救世界的好夢!世界不早了,Good Night ,World !