2013年4月26日 星期五

SCWCD重點整理-9.JSTL(Jsp Standard Tag Library)

JSP的taglib指令的uri對映到tld的方式可區分為顯性與隱性。所謂的顯性(JSP2.0以前)就是指在DD中會去設定uri對映到tld檔的方式,如下:
     <taglib>
        <taglib-uri>ooxx</taglib-uri>
        <taglib-location>/tld/c.tld</taglib-location>
     </taglib>    
所以根據web.xml的taglib設定,若在Jsp中要使用此自訂標籤,會這樣打
<%@taglib prefix="c" uri="ooxx" %>
而隱性(JSP2.0)則是不在DD中設定,container會自動建立tld檔與uri的對映關係,但前提是tld檔必須放到特定的目錄下
1. /WEB-INF/下
2. /WEB-INF/子目錄
3.JAR檔( 在WEB-INF/lib目錄下)的META-INF下
4.JAR檔( 在WEB-INF/lib目錄下)的META-INF子目錄下


網站的輸出盡量使用<c:out>標籤輸出,如<c:out value='${userName}' default='guest' />
可防止 跨網站指令稿攻擊(XSS、cross-site scripting或 cross-site hacking),這是因為使用<c:out>標籤輸出時,預設escapeXml是開啟的狀態,會將html的特殊自元轉換成等效的html實體,如<轉成&lt , >轉成 &gt,因此可以防止<script></script>被瀏覽器解譯成javascript的標籤,從而防止了XSS的攻擊。
ps: 跨網站指令稿攻擊是攻擊者以特定的第三方網站當作攻擊媒介,將惡意的javascript輸入到最常使用的comment欄位,儲存入網站的資料庫後,讓下一位閱讀者在瀏覽該網站時,同時也去下載到攻擊者的惡意javascript並執行,來達到惡意攻擊效果。


<c:forEach>標籤如同for 迴圈,可以針對群集裡的每一個元素執行一次標籤的主體
群集: 廣義解釋為 陣列、collection、Map或者以逗號分隔的字串。
        <% 
           List colorList=new ArrayList();
           colorList.add("Blue");
           colorList.add("Black");
           colorList.add("Red");
           request.setAttribute("optionList", colorList);
        %>
        <select>
          <c:forEach varStatus="counter" var="option" items="${optionList}" >
                  <option value="${counter.count}" >${option}</option>
              </c:forEach>
        </select>
varStatus是一個指向 javax.servlet.jsp.jstl.core.LoopTagStatus的實例,可利用LoopTagStatus.count來當計數器,就如同for迴圈的 i 一般。


<c:if>標籤用來提供如if 判斷式的功能,用法如下
<c:if test="${ isLogin ==true }" > 已登入 </c:if>,若isLogin等於ture,則顯示 已登入


<c:choose>標籤與<c:when>、<c:otherwise>標籤合用,可達到如 if...else if...else if....else 的效果
       <c:choose>
                   <c:when test="${choice eq 'A'}" >Your Choice is A</c:when>
                   <c:when test="${choice eq 'B'}" >Your Choice is B</c:when>
                   <c:when test="${choice eq 'C'}" >Your Choice is C</c:when>
                   <c:otherwise >Your Choice is D</c:otherwise>
       </c:choose>


<c:set >標籤 可以用來設定Map的值、增加Map的項目或是增加某個作用域的屬性。它有兩種版本,var 與 target 。

var 是用來設定屬性值,設定屬性值時可將設定值放在value中,或是直接放到 <c:set > </c:set>的主體之中

        在value中設定值
        <c:set var="userName" scope="session"  value="John" />
       
        在session中設定屬性userName等於"John" 
        
        放到主體中設定
        <c:set var="welcomeString" scope="session"  >
              how are you ${sessionScope.userName}
        </c:set>
        在session中設定屬性userName等於"how are you " + 上列設的名稱 "John"

        <c:out value="${sessionScope.welcomeString}" />
        顯示結果 = how are you John 

        <c:set var="userName" scope="session"  value="${noValue}" />
        若 noValue這各EL被評算成null,則 userName這各屬性若存在於session,userName將會從
        session移除,若沒有指定scope,則會從page scope開始找起,若能在任一scope找到
        userName這各屬性,則將其從該scope移除!

target 是用來設定Map的key/value或是bean的特性/value,同樣的在設定值時,標籤也會分成沒有主體的設定方式跟有主體的設定方式


       <!-- c:set 設定Map/Bean範例 沒有主體 
         target屬性值必須是一個真的被評算成物件實體的EL
         不能只是代表"id"的字串實字
         -->
         <c:set target="${employee}" property="name" value="Justin" />
         設定employee的名稱=<c:out value="${employee.name}" />
         
         <br />
         <!-- c:set 設定Map/Bean範例 有主體 -->
         <c:set target="${employee}" property="name" >
              ${settingName}
         </c:set>
若employee是一個Map,那麼property就代表它的key,value就是要設定給key的值。若employee是一個Bean,則property就是Bean的特性,value就是要設定給特性的值。
如範例程式的註解,target不能是一個字串實字,它可以是代表真實物件的 EL表達式${...}或是Scripting<%=... %>,又或者是 <jsp:attribute>。
若target評算出來不是Map或Bean,則Container會丟出例外。
若評算出來target是bean,但此bean找不到與property指定相符的特性,則Container也會丟出例外。

<c:remove>標籤可以移除特定作用域的某個屬性,使用方式如下:
    <c:remove var="employee"  scope="request" />
其中 var必須是字串實字,不能是EL表達式;scope若不指定,則employee屬性會從所有作用域被移除,若不是真要從所有作用域將這各屬性移除,還是養成較好的習慣,指定 要移除的scope。


在JSP中,有三種嵌入內容的方式:

1.include 指令 : <%@ include file="xxx.jsp | xxx.html" %>  ,是一種靜態的嵌入方式 ,在轉譯
(即tmp.jsp->_tmpServlet.java)期間將 file屬性指定的內容增加到當前頁面。

2.<jsp:include>標準動作:<jsp:include page="xxx.jsp",是一種動態的嵌入方式,在請求期間將page屬性指定的內容增加到當前頁面。可與 <jsp:param name="pageTitle" value="welcome Justin" /> 合用

3.<c:import>JSTL標籤: <c:import url="http://www.example.com/header.jsp" />,是動態的,在請求期間將url屬性指定的內容增加到當前的頁面,用法與<jsp:include>很像,但<c:import>能嵌入Container以外的外部內容,所以更具彈性。
可與<c:param name="pageTitle" value="welcome Justin"  /> 合用。


<c:url>標籤可以讓JSP中的超連結 有URL重寫的能力,若再配合<c:param>標籤的使用,可以讓URL的參數一併被編碼,讓一些不安全的字元或被保留字元替換成其他字元。
        <c:set var="name" scope="request" value="Justin Yang"  />
        <c:url value="/welcomePage.jsp" var="welcomeHref"  >
            <c:param name="wholeName" value="${name}" />
        </c:url>
        產生的超連結:${welcomeHref}
 ${welcomeHref}實際產生出來的連結會像
/contextName/welcomePage.jsp?wholeName=Justin+Yang ,其中Justin Yang中間的空白會被自動編碼為'+',以讓超連結是一串正確的連結。



JSTL規格書下載

沒有留言:

張貼留言