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