天天看點

JSP的<c:choose> <c:forEach> <c:if> <c:when> <c:set>标簽15.4.1 c:if标簽

JSP的<c:choose> <c:forEach> <c:if> <c:when> <c:set>标簽

JSP的&lt;c:choose&gt; &lt;c:forEach&gt; &lt;c:if&gt; &lt;c:when&gt; &lt;c:set&gt;标簽15.4.1 c:if标簽

JSP 标準标記庫( Standard Tag Library , JSTL) 是一組以标準化格式實作許多通用的 Web 站點功能的定制标記。

JSP 技術的優勢之一在于其定制标記庫工具。除了核心 JSP 标記,如 jsp:include 之外,定制标記庫工具使您能夠建立唯一的标記來描述以站點或應用程式為導向的操作。一旦您建立了定制标記庫 ( 簡稱 taglib) ,當您擴充項目或轉向另一個項目時您可以重複使用這些标記。您還可以将 taglib 傳遞給其它開發人員,進而他們可以在自己的網站上使用,或者在您 Web 應用程式的其它部分使用。   

       JSTL 的目标是為了簡化 JSP 頁面的設計。對于頁面設計人員來說,使用腳本語言(預設值是 JAVA 語言)操作動态資料是比較困難的,而采用标簽和表達式語言相對容易一些, JSTL 的使用為頁面設計人員和程式開發人員的分工協作提供了便利。

一. 配置 JSTL

包括兩個 JAR 檔案, jstl.jar 和 standard.jar 。是什麼沒有必要管,重在應用( 1+1 ? =2 ,我們沒有必要深究,隻需要知道這麼用就行。)。

原文引入:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>                                                              

二. Core 标簽庫

Core 标簽庫主要包括了一般用途的标簽、條件标簽、疊代标簽和 URL 相關的标簽。在 JSP 頁面使用 Core 标簽,要使用 taglig 指令,指定引用的标簽庫,如下:

<%@ taglib rui=”http://java.sun.com/jsp/jstl/core” prefix=”c” %>

一般用途的标簽有 <c:out> 、 <c:set> 、 <c:remove> 、 <c:cath>

1.<c:out>

用于計算一個表達式并将結果輸出。類似于 JSP 中 <%=%> 表達式,或者是 EL 中 $ ${el-expression} 。

2.<c:set>

用于設定範圍變量的值或者 javabean 對象的屬性。

看個實際例子:

<c:set var=”username” value=”lisi” scope=”session”/>

這樣就相當于設定了 session 。

3.<c:remove>

相對 <c:set> 其作用是移除範圍變量。比如: <c:remove var=”nusername” scope=”session”/>

4.<c:catch>

用于捕獲在其中嵌套的操作所抛出的異常對象,并将異常資訊儲存到變量中。

我們将有可能抛出異常的代碼放置到開始标簽 :<c:catch> 和結束标簽 :</c:catch> 之間。如果其中代碼出現異常,異常對象将被捕獲,儲存在 var 聲明的變量中,該變量總是有 page 範圍。如果沒有發生異常,而 var 所辨別的範圍變量将被移除。

如果沒有指定 var 屬性,異常隻是簡單的被捕獲,異常資訊并不會被儲存。

Eg :

<c:catch var=”exception”>

<%

       int i = 5;

       int j = 0;

       int k=i/j;

%>

</c:catch>

<c:out value=”${exception}” /><br>

<c:out value=”${exception.massage}”/>

後一句相當于: exception.getMessage()

條件标簽包括 <c:if><c:choose><c:when><c:otherwise>

1.<c:if>

用于實作 java 中的 if 語句功能。

<c:if test=”${user.visitCount==1}”>

       This is your first visit .

</c:if>

若為 true ,會列印中間部分。也可以聲明 var ,友善下一步判斷。

<c:if test=”${param.name==’admin’}” value=”result”/>

<c:out value=”${result}” />

2.<c:choose>

<c:choose> 和 <c:when> 、 <c:otherwise> 一起實作互斥條件執行,類似于 java 中的 if else.

<c:choose> 一般作為 <c:when> 、 <c:otherwise> 的父标簽。

eg :

<c:choose>

       <c:when test="${row.v_money<10000}">

              初學下海

       </c:when>

       <c:when test="${row.v_money>=10000&&row.v_money<20000}">

              身手小試

       </c:when>

       <c:otherwise>

              商業能手

       </c:otherwise>

</c:choose>

疊代标簽

疊代标簽有<c:forEach> 和 </c:forEach>

// 周遊記錄集

<c:forEach items="${finalResult.rows}" var="row">       

<tr class="<%=tdClass[(rank+1)%2]%>">

<td align="center"><span><%=rank%> </span></td>

<td align="center"><span ><c:out value="${row.player_name}"/></span> </td>

<td align="center"><span > ¥ <c:out value="${row.money}"/></span></td>

</tr>

<%rank++;%>     

</c:forEach>

也可以設定固定次數。

<c:forEach var =”i” begin=”100 “ end= “110”>

       ${i}

</c:forEach>

如果再加個 step= “ 2 ”那麼每次增長為 2 。

三. sql 标簽

設定資料源:

<sql:setDataSource dataSource="proxool.breadTycoon" />

// 将資料庫某查詢的結果聲明為一個變量

<sql:query var="finalResult" >

    select player_name,money from tb_player order by money DESC LIMIT 10   

</sql:query>

       然後可以:

<c:forEach items="${ finalResult.rows}" var="row" varStatus="s">

        advCosts[${s.index}]=${row.adv_cost};

   </c:forEach>

       資料更新标簽:

<sql:update>  

                call proc_set_role_salespro(?,?,?,?,?);

                <sql:param value="30"/>

                <sql:param value="39"/>

                <sql:param value="<%=spID%>"/>

                <sql:param value="<%=productID%>"/>

                <sql:param value="1"/>               

            </sql:update>

<sql:query var="queryAllChannelCount">

SELECT COUNT(*) as total FROM tb_channel WHERE game_id=? AND begin_round<func_cur_round(?) AND player_id=? AND channel_flag=0

<sql:param value="${gameID}"/>

<sql:param value="${gameID}"/>

<sql:param value="${playerID}"/>

</sql:query>

<c:forEach items="${queryAllChannelCount.rowsByIndex}" var="channelCN">

       <c:set value="${channelCN[0]}" var="channelTotal"/>

</c:forEach>

調用存儲過程更新資料庫:

<c:if test="${param.changsubmit!=null}" >

<c:forEach items="${paramValues.pro_id}" var="getpro_id" varStatus="getparamsta">

<sql:update>

call proc_set_role_product(?,?,?,?,?,?,?,?);

<sql:param value="${gameID}"/>

<sql:param value="${playerID}"/>

<sql:param value="${getpro_id}"/>

<sql:param value="${getpro_id}"/>

<sql:param value="${paramValues.pro_sort[getparamsta.index]}"/>

<sql:param value="${paramValues.price[getparamsta.index]}"/>

<sql:param value="${paramValues.output[getparamsta.index]}"/>

<sql:param value="0"/>

</sql:update>

</c:forEach>

</c:if>

四. 格式化标簽

<fmt: formatNumber value =”12.3” pattern=”.000”/>

将輸出 12.300. 應用樣式 ”.000”, 将使格式化後的小數部分有 3 位。不足 3 位将以 0 補齊。

       <fmt:formatDate value=”<%=new java.util.Date() %>” type=”date” />

       格式化的結果是: 2007-5-27 .

<fmt:formatDate value=”<%=new java.util.Date() %>” type=”time” />

格式化的結果是: 9:25:11

<fmt:formatDate value=”<%=new java.util.Date() %>” type=”both” />

格式化的結果是: 2007-5-27 9:25:11

補充知識點:

1. 替換 request.getParameter("test"):

<c:if test="${param.test!=null}" >

<c:out value="${param.test}" />

</c:if>

2. <c:redirect url="a.jsp">

3.<c:redirect url="/max.jsp" context="/ch16">

<c:param name="name1" value="665"/>

<c:param name="name3" value=" 斯蒂芬 "/>

</c:redirect>

4.<c:forTokens items="zhangsan:lisi:as" delims=":" var="name">

${name}

</c:forTokens>

15.4.1 c:if标簽

《Tomcat與Java Web開發技術詳解(第2版)》第15章JSTL Core标簽庫,本章對JSTL做了概要介紹,并且着重介紹了JSTL中的Core标簽庫的用法,本書第15章、第16章和第17章還會介紹JSTL中的其他标簽庫的用法。本節為大家介紹标簽。

15.4  條件标簽

條件标簽能夠實作Java語言中的if語句及if-else語句的功能,它包括以下幾種。

:用于實作Java語言中的if語句的功能。

、和:用于實作Java語言中的if-else語句的功能。

15.4.1  标簽

标簽用于實作Java語言中的if語句的功能,它的文法為:

  1. <</SPAN>c:if test="邏輯表達式"   
  2.     var="代表邏輯表達式的值的命名變量的名字"   
  3.     scope="{page|request|session|application}" / > 

标簽會把邏輯表達式的值存放在var屬性指定的命名變量中,scope屬性則指定命名變量的範圍,scope屬性的預設值是page(頁面範圍)。

例如以下标簽先判斷username請求參數的值是否為Tom,然後把判斷結果作為result命名變量存放在請求範圍内:

  1. <</SPAN>c:if test="${param.username=='Tom'}"  var="result" scope="request" /> 
  2. ${result} 

以上标簽等價于以下Java程式片段:

  1. <</FONT>%  
  2. String username=request.getParameter("username");  
  3. if(username!=null && username.equals("Tom"))  
  4.   request.setAttribute("result",true);  
  5. else  
  6.   request.setAttribute("result",false);  
  7. %> 

标簽還可以包含标簽主體,隻有當邏輯表達式的值為true時,才會執行标簽主體。例如:

  1. <</SPAN>c:if test="${param.save=='user'}" > 
  2.   Saving user  
  3.   <</SPAN>c:set var="user"  value="Tom" />   
  4. </</SPAN>c:if> 

以上标簽等價于以下Java程式片段:

  1. <</FONT>%  
  2. String save=request.getParameter("save");  
  3. if(save!=null && save.equals("user")){  
  4.   //對應<</SPAN>c:if>标簽的主體  
  5.   out.print("Saving user")  
  6.   pageContext.setAttribute("user","Tom");  
  7. }  
  8. %> 
JSTL标簽用法:<c:choose><c:forEach><c:if><c:when><c:set>