講道理,自己在博大精深的Java世界里還只是一個很小很小的菜鳥。處於成長與學習之中,但學習一個漫長的過程。尤其對於那些知識點我覺得總結是尤為重要的。反正在我看來這段時間里雖然過了很多知識但卻是一臉懵逼,心中 很少有那種系統的知識體系架構。歸咎於還是因為自己的對知識的理解領悟總結少了。因此今天開始我希望自己能養成一個時刻總結的好習慣。無論是站在前輩們的總結的基礎上還是有自己的新的領悟,我都想寫下來。望能勉勵自己繼續前進。
關於EL與JSTL有過了解,但沒認真去想過,也沒怎么用過,今天又算是過了一遍,重新認識一下。首先先來談一下概念吧,EL(Expression Language)是一種表達式語言,主要用於查找作用域中的數據,然后對它們執行一些簡單的操作,用於對jsp標簽的屬性賦值。它不是編程語言。JSTL( JSP Standard Tag Library)是JSP標准 標簽庫,由apache實現,因為在jsp中出現大量Java代碼不利於維護,sun公司就制定了一個類似於html標簽一下的jsp標簽技術,也有開始於結束標記。我們可以引用標簽來調用標簽庫中的Java代碼片段來實現一下操作。使用jsp標准標簽庫有利於程序的可讀性,提高了代碼的復用性與編程效率。其目的就是為了jsp中不出現Java代碼片段。這兩者關系,JSTL通常會結合EL一起使用。也有理解為EL是JSTL的一部分。EL也可以單獨使用。
EL表達式的基本格式由$與{}組成,例如:${user.name} 即其意思就是查詢得到user對象中的name屬性的值。
如果僅使用EL表達式的話則不需要導包,但需要在作用域中去取值。該作用域可以是 其范圍由小到大依次是 page(頁面上下文對象) request(一次請求對象) session(會話期間對象) application(程序應用對象) 。訪問規則: 當容器解析到當前EL表達式時,會依次從pageScope,requestScope,sessionScope以及applicationScope當中取值,查找綁定名為user的對象,調用其getName方法。el表達式如果獲取到null值,會 自動把null值轉換為空字符串輸出。
當沒有指定作用域,則默認取值依次從小到大來取
例1:User user=new User(); user.setName("zs"); request.setAttribute("user",user) - -->獲取request綁定的name值 ${user.name}等價於User u=(User)request.getAttribute("user");String name=u.name; 例2:還可以以${user["name"]}來表達;
可以進行一些簡單的運算
1 算數運行 + - * / % 注:+只能做算數運算,不能做求和運算
算術運算:${1+"1" } 其結果為2 它會自動將“1”轉化為數字進行運算
2 關系運算 == >= <= !=
關系運算:${5=="5"}其結果為true
3 邏輯運算 & | ! && ||
邏輯運算:${a>b&&4<5}其結果為false
4 (empty)空運算:判斷某個集合、字符串、對象是否為空。
以下四種情況結果為true:空字符串,空的集合,值為null,找不到對應的值
<%
List list=new ArrayList();
list.add(1);
request.setAttribute("list", list);
request.setAttribute("a", "");
request.setAttribute("b", null);
%>
${empty list } 其結果為false
${empty a } 其結果為 true
${empty b } 其結果為 true
${empty user}其結果為false
JSTL:(JSP Standard Tag Library) JSP標准標簽庫
JSTL的由來:
JSP標簽是Sun公司定義的一套標准,由Apache組織基於這套標准開發的一套標簽
庫后又轉給Sun公司,被稱為JSTL,成為了JavaEE5.0的核心
如何使用jstl ?
第一步:引入jstl.jar以及 standard.jar兩個架包注:在javaEE5.0以上的版本不需要引入這兩個架包,因為在javaEE5.0以上的版本已經包含了這兩個架包。
將jstl.jar和standard.jar兩個包考到現有工程 WebRoot / WEB-INF / lib 目錄下
第二步: 使用taglib指令導入要使用的JSP標簽 <%@taglib uri="" prefix="" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
uri:JSP標簽的命名空間
prefix:命名空間的前綴(簡稱)
第三步: 使用常見的標簽
1 if標簽
< c:if test= "" var = "" scope= "" >
標簽體的內容
</c:if >
注: test中傳入的只能是boolean值,如果值為false則不執行標簽體,為true
則執行標簽體。
var :代表當前test表達式的結果。
scope:指test表達式執行的結果綁定范圍
2 choose標簽
<c : choose >
<c:when test =""></c : when>
...
<c : otherwise></c : otherwise>
</c : choose >
注:when可以出現一次以上,當test屬性為true時,會執行標簽體的內容
otherwise只能出現0或1次。
3 foreach標簽
<c:foreach items="" var="" varStatus="s">
</c:foreach>
items屬性:指定要遍歷的集合,—般使用EL表達式來賦值
var屬性:指定一個綁定名稱,容器每次從集合中取一個對象,
然后綁定到pageContext對象上,作用域只能是在當前頁面。
varStatus :指定一個綁定名稱。綁定值是一個由容器創建的對象
,該對象封裝了當前迭代的狀態 。對於迭代狀態 有默認的兩個方法:
getIndex: 下標從0開始 ,返回當前正則被迭代對象的下標值
getCount: 下標從1開始,統計個數。
如何定義自定義標簽?
1 新建一個java類,把需要引入的java代碼搬家 ,同時該類需要繼承
SimpleTagSupport(簡單標簽技術支持類)
2 重寫doTag方法。
3 新建一個XX.tld的文件,注意該文件需要放置在web-inf文件夾下。
文件里面的結構可以參照 standard.jar包中的c.tld文件格式。
<body-content>JSP</body-content>
只有復雜標簽技術才有,支持在標簽體中可以出現java代碼片段。
<body-content>empty</body-content>
簡單標簽技術,不支持標簽體出現任何內容。
<body-content>scriptless</body-content>
標簽中可以出現內容,但是內容不允許是java代碼。
<say:print><% %></say:print>錯誤