<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實體,如<轉成< , >轉成 >,因此可以防止<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規格書下載