天天看點

自定義标簽 與 JSTL(JSP Standard Tag Library)

1.自定義标簽 【了解】     [1]簡介            > 在JSP2.0以後,在jsp頁面中不建議使用腳本片段<% %>和JSP表達式<%= %>         > 使用EL來替換的JSP表達式         > 使用标簽來替換腳本片段         > 在JSP中已經為我們提供了很多的諸如:<jsp:forward page=""></jsp:forward>             這樣的JSP動作标簽,這些标簽最終在被翻譯的時候都會被轉換為一段Java代碼         > 标簽就是以标簽的形式去調用Java程式            > 但是JSP的動作标簽并不能滿足我們的全部需求,是以我們還需要去自定義标簽         > 多個自定義标簽就組成了一個自定義标簽庫         > 每一個自定義标簽的背後都有一個标簽處理器類去支援他的功能       [2]使用步驟         1.建立标簽處理器類             - 建立一個标簽處理器類,要求我們要實作SimpleTag接口                 void doTag() --> 标簽處理器類中的主要方法,每次标簽執行時,doTag()方法都會被調用                 JspTag getParent() --> 擷取目前标簽的父标簽                 void setParent(JspTag parent) --> 設定目前标簽的父标簽,由伺服器調用                 void setJspBody(JspFragment jspBody) --> 設定标簽的标簽體,該方法由伺服器調用,用來設定目前标簽的标簽體                 void setJspContext(JspContext pc) --> 設定PageContext,PageContext可以用來擷取jsp中的其他隐含對象               - 我們說實作SimpleTag接口時,所有方法我們都需要去實作,而這些實作大部分都是重複,                 是以我們真實使用時,一般不會直接實作該接口,而是通過繼承SimpleTagSupport的方式去建立一個标簽處理器類。             - SimpleTagSupport中已經實作類SimpleTag中的所有方法,我們隻需要重寫doTag()方法即可,                 其他的JspContext,标簽體,父标簽,都可以直接去調用相應的get方法即可           2.在伺服器中注冊标簽處理器類(tld檔案)             - 編寫tld檔案(标簽庫的描述檔案),實際上它就是一個xml檔案,隻是他擴充名是tld             - tld檔案需要編寫在WEB-INF目錄下             - 标簽庫的描述資訊:                 <!-- 标簽庫的配置資訊 -->                 <tlib-version>1.0</tlib-version>                   <!-- 标簽的短名,标簽的字首 -->                 <short-name>a</short-name>                   <!-- 标簽庫的唯一辨別 -->                 <uri>http://www.bdp.com/taglib/a</uri>               - 自定義标簽的描述資訊:                 <!-- 具體标簽的配置資訊 -->                 <tag>                     <!-- 标簽的名字,通過标簽名來使用标簽 -->                     <name>MyTag</name>                       <!-- 标簽的全類名 -->                     <tag-class>com.bdp.taglib.MyTag</tag-class>                       <!-- 标簽體的類型 -->                     <body-content>empty</body-content>                 </tag>               - body-content                 - 用來設定标簽體的類型,四個可選值:                     1.empty 表示标簽沒有标簽體,是一個自結束标簽                     2.scriptless 表示當标簽體中的内容是一個EL表達式時,伺服器會自動解析EL表達式                     3.JSP 表示标簽體可以是一個JSP腳本片段                     4.tagdependent 表示當标簽體是一個EL表達式時,伺服器将不會解析                 - 結論:                     一般情況下,如果是一個自結束标簽,則使用empty                         如果有标簽體則使用scriptless               - 如果标簽中有屬性,則在tag标簽中還需要做如下的配置:                 <attribute>                     <name></name>                     <required></required>                     <rtexprvalue></rtexprvalue>                 </attribute>                   name:屬性名                 required:屬性是否是必須的,如果是必須則設定true,否則設定false                 rtexprvalue:如果屬性值是一個EL表達式是否自動解析,兩個值true則自動解析,false則不解析           3.在頁面引入标簽庫             <%@ taglib prefix="a" uri="http://www.bdp.com/taglib/a" %>              uri:和标簽庫uri一緻,标簽庫的唯一辨別,通過uri來導入指定的标簽庫             prefix:标簽的字首,可以随便寫,但是我們習慣和short-name一緻     2.JSTL(JSP Standard Tag Library)     [1] JSTL簡介         > JSTL是JSP的标準标簽庫         > JSTL為我們提供了一些常用的标簽,供我們日常開發使用(if 、 if...else 、周遊 、 日期格式化)         > 标簽庫             - core :核心标簽庫                 - 核心标簽庫是我們JSTL中最常用的一個标簽庫,它裡面封裝很多常用的功能                 - 核心标簽庫又稱為c标簽               - fn :函數标簽庫                 - 函數标簽庫中主要定義了一些字元串相關的方法,函數标簽庫需要結合EL表達式一起使用               - fmt :格式化标簽庫(國際化标簽庫)                 - 對日期和數字進行格式化(國際化)操作                 - 2016/1/18 1/18/2016   1000  1,000               - sql : 資料庫标簽庫                    - 在jsp中操作資料庫的标簽。已淘汰               - xml : xml标簽庫                    - 在jsp解析xml的标簽。已淘汰           > 使用JSTL需要先導入兩個jar包:             - taglibs-standard-impl-1.2.1.jar             - taglibs-standard-spec-1.2.1.jar       [2] 核心标簽庫            - 在頁面中引入核心标簽庫:             <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>            - 使用:             out                 作用:将一個對象輸出的頁面中                 參數:                     value:要輸出的内容,可以是一個EL表達式                     default:當value屬性為空時,要顯示的内容(預設值)                     escapeXml:是否自動轉義特殊字元,預設值為true,自動轉義                   例子:                     <c:out value="${code }" default="sunwukong" escapeXml="true" ></c:out>               set                 作用:向域中設定一個屬性                 參數:                     var:屬性名                     value:屬性值                     scope:要将屬性放入到的域中,可選值:page request session application                         如果不寫,預設是page                 例子:                     <c:set var="username" value="sunwukong" scope="request" ></c:set>                 remove                 作用:移除域中的指定屬性                 參數:                     var:要移除的屬性的屬性名                     scope:要移除屬性的域,可選值:page request session application                         如果不指定,則移除四個域中屬性                 例子:                     <c:remove var="username" scope="session"></c:remove>               if                 作用:可以java中的if類似                 屬性:                     test:test需要一個布爾值,如果值為true,則執行标簽體,否則不執行                 例子:                     <c:if test="${empty param.username}">請輸出使用者名!</c:if>                 choose when otherwise                 作用:和if else 類似                     choose有兩個子标簽,when otherwise,when和otherwise必須做完choose的子标簽出現,不能單獨使用。                     在choose可以指定多個when标簽,但是隻能指定一個otherwise,                         多個when标簽隻會有一個執行,如果when都不滿足條件,則執行otherwise。                 例子:                     <c:choose>                         <c:when test="${param.score==100 }">                             <h3>恭喜您,考了100分!</h3>                         </c:when>                         <c:when test="${param.score >= 90 }">                             <h3>您的分數是A!</h3>                         </c:when>                         <c:otherwise>                             <h3>恭喜你,沒及格!</h3>                         </c:otherwise>                     </c:choose>                 forEach                 作用1:可以周遊一組數                 屬性:                     begin:周遊的開始位置,注意不能小于0                     end:周遊的結束位置                     var:指定一個變量名                     step(可選):指定周遊時的步長(每次自增的長度)                 例子:                     <c:forEach begin="1" end="10" step="1" var="index">                         ${index}                     </c:forEach>                   作用2:可以周遊集合                     屬性:                         items:指定要周遊的集合,需要一個EL表達式                         var:指定一個變量名                         varStatus:周遊狀态,擷取目前元素周遊的狀态(index count first last)                     例子:                         <c:forEach items="${list }" var="hero">                             ${hero} <br />                         </c:forEach>                           <c:forEach items="${list }" var="hero" varStatus="vs">                             ${vs.last }--${vs.first }-${vs.index }---${vs.count }---${hero} <br />                         </c:forEach>       *******************************************************************************           ${vs.index}      輸出行号,從0開始。           ${vs.count}      輸出行号,從1開始。           ${vs.current}   目前這次疊代的(集合中的)項           ${vs.first}  判斷目前項是否為集合中的第一項,傳回值為true或false           ${vs.last}   判斷目前項是否為集合中的最後一項,傳回值為true或false           <c:forEach begin='1' end='5' step='2' items='${list}' var='item'>           begin、end、step分别表示:起始序号,結束序号,跳躍步伐。       *********************************************************************************                             注意:周遊Map時,是擷取的map中的一個一個鍵值對,我們可以通過.key擷取鍵,通過.value來擷取值                         <c:forEach items="${map}" var="stu">                             ${stu.key} --- ${stu.value} <br />                         </c:forEach>               url                 作用:用來為絕對路徑加上項目名                 參數:                     value:要設定的絕對路徑                     var:變量名,如果不指定var,則路徑會直接輸出,如果指定var,則路徑會放入到page域中                 例子:                     <c:url value="/index.jsp" var="url">                         <c:param name="username" value="sunwukong"></c:param>                         <c:param name="age" value="18"></c:param>                         <c:param name="gender" value="男"></c:param>                     </c:url>                 補充:                     我們可以使用c:param标簽在位址後附加請求參數,同時參數中的中文會自動進行url編碼               redirect                 作用:請求的重定向                 參數:                     url:指定重定向的目标位址,注意會自動加上項目名,就不要寫項目名                 例子:                     <c:redirect url="/index.jsp">                         <c:param name="username" value="sunwukong"></c:param>                         <c:param name="age" value="18"></c:param>                         <c:param name="gender" value="男"></c:param>                     </c:redirect>                 補充:                     我們可以使用c:param标簽在位址後附加請求參數,同時參數中的中文會自動進行url編碼          [3] 函數标簽庫            - 在頁面中引入函數标簽庫                <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>            - 使用:             函數标簽庫需要結合EL表達式一起使用,裡邊都是一些字元串的相關操作。         - 例子:             ${fn:xxxx}             <!-- fn:contains判斷一個字元串是否包含另一個 -->             ${fn:contains('hello','lO') }  <br />             <!-- fn:containsIgnoreCase判斷一個字元串是否包含另一個,忽略大小寫 -->             ${fn:containsIgnoreCase('hello','lO') }<br />             <!--fn:escapeXml自動轉義特殊字元  -->             ${fn:escapeXml("<html></html>") }<br />             <!--fn:join用于将一個String數組轉換為一個字元串,第二個參數需要指定一個連接配接符  -->             ${fn:join(strs,"@") }<br />             <!-- fn:split将一個字元串根據指定的字元拆分為一個數組,第二個參數需要指定一個拆分的字元 -->             ${fn:split("[email protected]@[email protected]@e","@")[2] }<br />             <!-- 将一個字元串轉換為大寫 -->             ${fn:toUpperCase("abcdefg") }<br />             - 具體用法參照alt+/    

轉載請注明出處!

http://www.cnblogs.com/libingbin/

感謝您的閱讀。如果文章對您有用,那麼請輕輕點個贊,以資鼓勵。

轉載于:https://www.cnblogs.com/libingbin/p/5978159.html