天天看點

JSTL與Struts的結合(二)

9.3  JSTL Core标簽庫

Core标簽庫,又被稱為核心标簽庫,該标簽庫的工作是對于JSP頁面一般處理的封裝。在該标簽庫中的标簽一共有14個,被分為了四類,分别是:

q         多用途核心标簽:<c:out>、<c:set>、<c:remove>、<c:catch>。

q         條件控制标簽:<c:if>、<c:choose>、<c:when>、<c:otherwise>。

q         循環控制标簽:<c:forEach>、<c:forTokens>。

q         URL相關标簽:<c:import>、<c:url>、<c:redirect>、<c:param>。

以下是各個标簽的用途和屬性以及簡單示例。

9.3.1  用于顯示的<c:out>标簽

<c:out>标簽是一個最常用的标簽,用于在JSP中顯示資料。它的屬性和描述如表9.3所示:

表9.3 <c:out>标簽屬性和說明

屬性 描述
value 輸出到頁面的資料,可以是EL表達式或常量(必須)
default 當value為null時顯示的資料(可選)
escapeXml 當設定為true時會主動更換特殊字元,比如“&lt;,&gt;,&amp;”(可選,預設為true)

在JSTL1.0的時候,在頁面顯示資料必須使用<c:out>來進行。然而,在JSTL1.1中,由于JSP2.0規範已經預設支援了EL 表達式 ,是以可以直接在JSP頁面使用表達式。下面看一個示例。

<c:out value="${sessionScope.anyValue}" default="no value" escapeXml="false"/>

該示例将從Session查找名為“anyValue”的 參數 ,并顯示在頁面,若沒有找到則顯示“no value”。

9.3.2  用于指派的<c:set>标簽

<c:set>标簽用于為變量或JavaBean中的變量屬性指派的工作。它的屬性和描述如表9.4所示:

表9.4 <c:set>标簽屬性和說明

屬性 描述
value 值的資訊,可以是EL表達式或常量
target 被指派的JavaBean執行個體的名稱,若存在該屬性則必須存在property屬性(可選)
property JavaBean執行個體的變量屬性名稱(可選)
var 被指派的變量名(可選)
scope 變量的作用範圍,若沒有指定,預設為page(可選)

當不存在value的屬性時,将以包含在标簽内的實體資料作為指派的内容。下面看一個示例:

<c:set value="this is andy" var="oneString"/>

${oneString} <br>

該示例将為名為“oneString”的變量指派為“this is andy”,其作用範圍為page。

9.3.3  用于删除的<c:remove>标簽

<c:remove>标簽用于删除存在于scope中的變量。它的屬性和描述如表9.5所示:

表9.5 <c:remove>标簽屬性和說明

屬性 描述
var 需要被删除的變量名
scope 變量的作用範圍,若沒有指定,預設為全部查找(可選)

下面看一個示例:

<c:remove var="sampleValue" scope="session"/>

${sessionScope.sampleValue} <br>

該示例将存在于Session中名為“sampleValue”的變量删除。下一句EL表達式顯示該變量時,該變量已經不存在了。

9.3.4  用于異常捕獲的<c:catch>标簽

<c:catch>标簽允許在JSP頁面中捕捉異常。它包含一個var屬性,是一個描述異常的變量,改變量可選。若沒有var屬性的定義,那麼僅僅捕捉異常而不做任何事情,若定義了var屬性,則可以利用var所定義的異常變量進行判斷轉發到其他頁面或提示報錯資訊。看一個示例。

<c:catch var="err">

         ${param.sampleSingleValue[9] == 3}

</c:catch>

${err}

當“${param.sampleSingleValue[9] == 3}”表達式有異常時,可以從var屬性“err”得到異常的内容,通常判斷“err”是否為null來決定錯誤資訊的提示。

9.3.5  用于判斷的<c:if>标簽

<c:if>标簽用于簡單的條件語句。它的屬性和描述如表9.6所示:

表9.6 <c:if>标簽屬性和說明

屬性 描述
test 需要判斷的條件
var 儲存判斷結果true或false的變量名,該變量可供之後的工作使用(可選)
scope 變量的作用範圍,若沒有指定,預設為儲存于page範圍中的變量(可選)

下面看一個示例:

<c:if test="${paramValues.sampleValue[2] == 12}" var="visits">

      It is 12

</c:if><br>

${visits} <br>

該示例将判斷request請求送出的傳入控件數組參數中,下标為“2”的控件内容是否為“12”,若為12則顯示“It is 12”。判斷結果被儲存在page範圍中的“visits”變量中。  

9.3.6  用于複雜判斷的<c:choose>、<c:when>、<c:otherwise>标簽

這三個标簽用于實作複雜條件判斷語句,類似“if,elseif”的條件語句。

q         <c:choose>标簽沒有屬性,可以被認為是父标簽,<c:when>、<c:otherwise>将作為其子标簽來使用。

q         <c:when>标簽等價于“if”語句,它包含一個test屬性,該屬性表示需要判斷的條件。

q         <c:otherwise>标簽沒有屬性,它等價于“else”語句。

下面看一個複雜條件語句的示例。

<c:choose>

         <c:when test="${paramValues.sampleValue[2] == 11}">

                   not 12 not 13,it is 11

         </c:when>

         <c:when test="${paramValues.sampleValue[2] == 12}">

                   not 11 not 13,it is 12

         </c:when>

         <c:when test="${paramValues.sampleValue[2] == 13}">

                   not 11 not 12,it is 13

         </c:when>

         <c:otherwise>

                   not 11 、12、13

         </c:otherwise>

</c:choose>

該示例将判斷request請求送出的傳入控件數組參數中,下标為“2”控件内容是否為“11”或“12”或“13”,并根據判斷結果顯示各自的語句,若都不是則顯示“not 11 、12、13”。

9.3.7  用于循環的<c:forEach>标簽

<c:forEach>為循環控制标簽。它的屬性和描述如表9.7所示:

表9.7 <c:forEach>标簽屬性和說明

屬性 描述
items 進行循環的集合(可選)
begin 開始條件(可選)
end 結束條件(可選)
step 循環的步長,預設為1(可選)
var 做循環的對象變量名,若存在items屬性,則表示循環集合中對象的變量名(可選)
varStatus 顯示循環狀态的變量(可選)

下面看一個集合循環的示例。

<%ArrayList arrayList = new ArrayList();

                   arrayList.add("aa");

                   arrayList.add("bb");

                   arrayList.add("cc");

%>

<%request.getSession().setAttribute("arrayList", arrayList);%>

<c:forEach items="${sessionScope.arrayList}" var="arrayListI">

         ${arrayListI}

</c:forEach>

該示例将儲存在Session中的名為“arrayList”的ArrayList類型集合參數中的對象依次讀取出來,items屬性指向了ArrayList類型集合參數,var屬性定義了一個新的變量來接收集合中的對象。最後直接通過EL表達式顯示在頁面上。下面看一個簡單循環的示例。

<c:forEach var="i" begin="1" end="10" step="1">

      ${i}<br />

</c:forEach>

該 示例 從“1”循環到“10”,并将循環中變量“i”顯示在頁面上。

9.3.8  用于分隔字元的<c:forTokens>标簽

<c:forTokens>标簽可以根據某個分隔符分隔指定字元串,相當于java.util.StringTokenizer類。它的屬性和描述如表9.8所示:

表9.8 <c:forTokens> 标簽 屬性和說明

屬性 描述
items 進行分隔的EL表達式或常量
delims 分隔符
begin 開始條件(可選)
end 結束條件(可選)
step 循環的步長,預設為1(可選)
var 做循環的對象變量名(可選)
varStatus 顯示循環狀态的變量(可選)

下面看一個示例。

<c:forTokens items="aa,bb,cc,dd" begin="0" end="2" step="2" delims="," var="aValue">

         ${aValue}

</c:forTokens>

需要分隔的字元串為“aa,bb,cc,dd”, 分隔符 為“,”。begin 屬性 指定從第一個“,”開始分隔,end屬性指定分隔到第三個“,”,并将做循環的 變量 名指定為“aValue”。由于步長為“2”,使用EL 表達式 ${aValue}隻能顯示“aa cc”。

9.3.9  用于包含頁面的<c:import>

<c:import>标簽允許包含另一個JSP頁面到本頁面來。它的屬性和描述如表9.9所示:

表9.9 <c:import>标簽屬性和說明

屬性 描述
url 需要導入頁面的URL
context Web Context該屬性用于在不同的Context下導入頁面,當出現context屬性時,必須以“/”開頭,此時也需要url屬性以“/”開頭(可選)
charEncoding 導入頁面的字元集(可選)
var 可以定義導入文本的變量名(可選)
scope 導入文本的變量名作用範圍(可選)
varReader 接受文本的java.io.Reader類變量名(可選)

下面看一個示例。

<c:import url="/MyHtml.html" var="thisPage" />

<c:import url="/MyHtml.html" context=”/sample2” var="thisPage"/>

<c:import url="www.sample.com/MyHtml.html" var="thisPage"/>

該示例示範了三種不同的導入方法,第一種是在同一Context下的導入,第二種是在不同的Context下導入,第三種是導入任意一個URL。

9.3.10  用于得到URL位址的<c:url>标簽

<c:url>标簽用于得到一個URL位址。它的屬性和描述如表9.10所示:

表9.10  <c:url>标簽屬性和說明

屬性 描述
value 頁面的URL位址
context Web Context該屬性用于得到不同Context下的URL位址,當出現context屬性時,必須以“/”開頭,此時也需要url屬性以“/”開頭(可選)
charEncoding URL的 字元集 (可選)
var 存儲URL的變量名(可選)
scope 變量名作用範圍(可選)

下面看一個示例:

<c:url value="/MyHtml.html" var="urlPage" />

<a href="${urlPage}" target="_blank" rel="external nofollow" >link</a>

得到了一個URL後,以EL表達式放入<a>标簽的href屬性,達到連結的目的。

9.3.11  用于頁面重定向的<c:redirect>标簽

<c:redirect>用于頁面的重定向,該标簽的作用相當于response.setRedirect方法的工作。它包含url和context兩個屬性,屬性含義和<C:url>标簽相同。下面看一個示例。

<c:redirect url="/MyHtml.html"/>

該示例若出現在JSP中,則将重定向到目前Web Context下的“MyHtml.html”頁面,一般會與<c:if>等标簽一起使用。

9.3.12  用于包含傳遞參數的<c:param>标簽

<c:param>用來為包含或重定向的頁面傳遞參數。它的屬性和描述如表9.11所示:

表9.11 <c:param>标簽屬性和說明

屬性 描述
name 傳遞的參數名
value 傳遞的參數值(可選)

下面是一個示例:

<c:redirect url="/MyHtml.jsp">

<c:param name="userName" value=”RW” />

</c:redirect>

該示例将為重 定向 的“MyHtml.jsp”傳遞指定參數“userName=’RW’”。

<script type="text/javascript"> </script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"> </script>