前言:JSTL(JSP Standard Tag Library)JSP標准標簽庫。它的目的是為了簡化JSP的開發,如何沒有JSTL可能我們開發的時候就需要寫大量的自定義標簽,無疑會加大開發難度,有了JSTL以後我們就不需要寫那些普通的標簽(除非特殊的)這樣一來我們的開發效率也會提升,在這裡我主要講解一下http://java.sun.com/jsp/jstl/core標簽庫。
JSTL普通標簽有<c:out>、<c:set>、<c:remove>、<c:catch>
首先為了使用JSTL標簽庫的內容我們先在maven項目中引入jar包,我使用的是
<dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency>
如果我們在聲明一下jsp的指令元素<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>,如果就可以進行我們的開發。out無疑是輸出的意思,所以<c:out>主要作用就是輸出我們的變量值,和腳本元素<%=%>有相同的功能。
<c:out>有三個屬性值,value,escapeXml,default。value就是我們要輸出的值,escapeXml是已轉換功能比喻<和<的轉換默認是true,default是默認值。下面我們來寫一個<c:out>。
<% int i=1+1; request.setAttribute("i", i); %> <c:out value="${i}"></c:out>
如果運行我們就可以看到我們要的結果,有人說如果要是要標簽體怎麼辦,其實也很簡單,把value值置null即可,這個我們看下源碼
public int doStartTag() throws JspException { needBody = false; // reset state related to 'default' this.bodyContent = null; // clean-up body (just in case container is pooling tag handlers) try { // print value if available; otherwise, try 'default' if (value != null) { out(pageContext, escapeXml, value); return SKIP_BODY; } else { // if we don't have a 'default' attribute, just go to the body if (def == null) { needBody = true; return EVAL_BODY_BUFFERED; }
在部分源碼中我們可以看見只要Default和value值為null就可以展示標簽體內部的值了比喻<c:out value='<%=null%>'>no</c:out>。
這個主要目的是設置范圍變量的值或者JavaBean的屬性。在這裡我就不再展示源碼,大家有興趣可以自己查閱。以講解為主
<c:set>有5個屬性,分別是value、var、scope、target、 property,value是被計算的表達式,var計算結果的名稱,scope是JSP的范圍默認為page,target要設置屬性的JavaBean對象,最後一個是設置對象的屬性。下面用例子讓大家更加清晰
現在我要設置一個num=1+1的值並且保存在Session中,那麼用<c:set>就是<c:set var="num" value="${1+1}" scope="session"></c:set>然後我們就可以引用這個值了
<c:out value="${num}"></c:out>。那麼如果是JavaBean對象呢我們就要用上target屬性了。如下
<% UserBean userBean = new UserBean(); pageContext.setAttribute("userBean", userBean); %> <c:set target="${userBean}" property="age" value="18"> </c:set> <c:set target="${userBean}" property="userName" >張三</c:set> <c:out value="${userBean.age}"></c:out> <c:out value="${userBean.userName}"></c:out>
這個主要移除范圍變量,有2個屬性,var和scope。var要移除變量的名稱,scope是jsp的范圍,默認值是page。
比喻我要移除上面的userBean就是<c:remove var="userBean" scope="session"/>意思就是移除Session中一個叫做userBean的屬性。
這個表示捕獲異常,其中有一個var屬性,表示把這個異常賦值給var。代碼如下
<c:catch var="exception"> <% String userName="zhangsan"; %> </c:catch>
<c:out value="${exception}"></c:out>
條件標簽包括<c:if>、<c:choose>、<c:when>、<c:otherwise>
這個意思很明顯就是實現java中if語句功能的。其中有三個屬性:test、var、scope。test表示測試的條件比喻(1>0),var表示測試結果導出來的名稱,scope表示范圍。默認為page。例子如下
<c:if test="${1<2}" var="testName" scope="application"></c:if> <c:out value="${testName}"></c:out>
所以我們開發的時候可以通過<c:if>來作為一個判斷語句,其他地方直接拿來用。
這個相當於Switch,case,Default。在我自定義標簽那篇提及過。其中<c:when>有一個屬性就是test是判斷的結果。舉個簡單例子如下
<c:choose> <c:when test='${user}=="zhangsan"'> <c:out value="張三"></c:out> </c:when> <c:when test='${user}=="lisi"'> 李四 </c:when> <c:otherwise> 無匹配 </c:otherwise>
</c:choose>
迭代標簽有2個一個是<c:forEach>,另一個是<c:forTokens>
這個主要針對包含多個對象集合進行迭代顯示。它有6個屬性,var、items、varStatus、begin、end、step。var表示迭代的對象,items表示要被迭代的集合對象,varStatus表示當前迭代對象的狀態,begin被迭代對象集合從哪個開始(默認是從第一個開始迭代),end表示被迭代對象集合從哪個結束(默認全部迭代完),step迭代的步長默認是1。
同樣舉個例子
ArrayList al = new ArrayList(); UserBean user1 = new UserBean("zhangsan", 25, "[email protected]"); UserBean user2 = new UserBean("lisi", 15, "[email protected]"); UserBean user3 = new UserBean("wangwu", 35, "[email protected]"); al.add(user1); al.add(user2); al.add(user3); <c:forEach var="userBean" items="<%=al%>" varStatus="status"> <tr> <td><c:out value="${userBean.age}"></c:out></td> <td>${userBean.userName}</td> <td>${status.count}</td> <td>${status.index}</td> <td>${status.first}</td> <td>${status.last}</td> </tr> </c:forEach>
我們看下結果
其中從結果我們可以看出varStatus的作用主要是判斷當前迭代對象的一個狀態,比statu.last表示判斷是否是最後一個對象。
這個標簽主要針對字符串,比喻String userNames="li;zhang;zhao"這個時候這個標簽就可以迭代把他們輸出來。這個屬性和上面標簽一樣,但是多了一個delims表示分割符。
String str="張三,李四,王五,"; <c:forTokens items="<%=str%>" delims="," var="name"> <td><c:out value="${name}"></c:out></td> </c:forTokens>
Url標簽包含<c:import>、<c:url>、<c:redirect>、<c:param>
是作為一個URL請求添加的參數,主要和<c:url>,<c:redirect>等配合使用
可以用<c:url>來定義一個URL鏈接在另一個url出引用。有4個屬性value、var、context、scope。value是要處理的url,var是要 導入url范圍變量的名稱,context是指定上下文的名字scope是JSP范圍默認page。同樣舉個例子
比喻我先定義一個url<c:url value="http://www.cnblogs.com/cate/java/" var="myurl" scope="session"></url>,然後我就可以直接引用了<a href='<c:out value="${myurl}"></c:out>'>博客園</a>,如果我要加請求參數怎麼辦呢,就要把上面的url改成
<c:url value="http://www.cnblogs.com/cate/java/" var="myurl" scope="session"> <c:param name="userName" value="zhangsan"></c:param> <c:param name="password" value="123456"></c:param>
</c:url>
我們運行看下結果是否把請求參數加上了
這個表示重定向,有2個屬性,一個是url表示定向到哪個地址,另一個則是content表示上下文的路徑。這個很簡單,寫法如下
<c:redirect url="${myurl}"></c:redirect>當然也可以加上請求的參數
<c:redirect url="${myurl}">
<c:param name="userName" value="zhangsan"></c:param>
</c:redirect>
這個表示要導入的資源,可以是一張照片,也可以是一個網站,(不僅可以導入本應用程序的資源也可以導入其他網站的資源)