JavaWeb_day5-監聽器和過濾器

002E:day6-EL.txt:00:1:14=4A4DBF6E:16=47d21313:003F:day7-自定義標籤和JSTL.txt:01207:1:14=48FFDE3E:16=47d21313:一自定義標籤:


1.JSP標籤的形式:
開始標記                      主體 結束標記
<前綴:標籤名 [屬性名="值"...]>主體</前綴:標籤名>
<前綴:標籤名 [屬性名="值"...] />


2.自定義標籤的執行過程
jsp                 -->    servlet
<jsp:useBean .../>  -->    標籤處理類(Java類)


3.兩種方式的處理類實現:
1)傳統標籤類: 
  a)只能決定是否顯示主體內容 TagSupport:
                   <my:Tag1  att="value"   - setAtt(..)
  doStartTag()               att2="value"> - setAtt2(..)
  doAfterBody()     body content
  doEndTag()       </my:Tag1>


 執行流程:
 1. 遇到開始標記: 調用屬性的set方法,把屬性的值傳到處理類中,然後調用doStartTag()
 2. 如果doStartTag()返回 SKIP_BODY(要求JSP容器忽略主體內容)直接跳到第4步。
                        EVAL_BODY_INCLUDE(要求JSP容器要顯示標籤主體內容)執行第3步 
 3. 顯示主體內容,然後調用doAfterBody(),如果它返回SKIP_BODY,它就執行第4步,如果它返回EVAL_BODY_AGAIN,重複執行主體內容.
 4. 遇到結束標記,調用doEndTag(),返回EVAL_PAGE,它就繼續處理剩下的頁面,如果返回SKIP_PAGE,這個標籤之後的所有內容不再處理。


  b)還可以決定是否更改主體內容 BodyTagSupport:
                  <my:Tag1  att="value"   - setAtt(..)
  doStartTag()              att2="value"> - setAtt2(..)    
  doAfterBody()     body content     - doInitbody(), setBodyContent() 緩存主體內容
  doEndTag()      </my:Tag1>
  執行流程:
  1. 遇到開始標記: 調用屬性的set方法,把屬性的值傳到處理類中,然後調用doStartTag()
  2. 如果doStartTag()返回 SKIP_BODY(要求JSP容器忽略主體內容)直接跳到第4步。
                        EVAL_BODY_INCLUDE(要求JSP容器要顯示標籤主體內容)執行第3步
                       EVAL_BODY_BUFFERED , 就會執行setBodyContent()和doInitBody()
  3. 顯示主體內容,然後調用doAfterBody(),如果它返回SKIP_BODY,它就執行第4步,如果它返回EVAL_BODY_AGAIN,重複執行主體內容.
  4. 遇到結束標記,調用doEndTag(),返回EVAL_PAGE,它就繼續處理剩下的頁面,如果返回SKIP_PAGE,這個標籤之後的所有內容不再處理。


2)簡單標籤處理類:SimpleTagSupport:   doTag()
  與傳統標籤處理類不同之處,頁面中每遇到一次對應的標籤時,容器都要創建一個實例。而傳統標籤處理類是針對一類標籤只有一個處理類的實例。




4. 標籤庫描述文件xxx.tld放置在WEB-INF或jar包的META-INF下:


5. 在頁面的使用:
  1)導入標籤庫描述文件:<%@ taglib uri="指定在tld文件中聲明的url" 
                                    prefix="指定引用自定義標籤的前綴" %>
  2)使用自定義的標籤: <前綴:標籤名 ...></前綴:標籤名>
   
6. 自定義標籤示例:
1) <my:hello name="zs"/>    - 頁面顯示:hello: zs  TagSupport
2) <my:upper count="3">hello,world</my:upper>  -頁面顯示效果: HELLO,WORLD HELLO,WORLD HELLO,WORLD    - BodyTagSupport


3) <my:if test="true|false">主體內容</my:if> 如果test爲true,就執行主體內容,否則不執行主體                   - SimpleTagSupport


4) 數據分頁的自定義標籤
<my:pager pageSize="10" pageNo="1" recordCount="100" url="index.jsp" />


7.自定義標籤打包:
-->jar包     用winrar來打成xxx.zip改成xxx.jar
   |-- 處理類的字節碼
   |--META-INF
         |-- MANIFEST.MF
         |-- XXX.tld 


8. 用標籤文件實現自定義標籤:--功能不夠強大。






二JSTL:JSP標準標籤庫
 1. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 完成一些通用的功能
   1). <c:out value="${}" /> 會把一些HTML的特殊字符進行轉換
   2). <c:set value="..." var="變量" scope=""/>
   3). <c:if test="布爾表達式" var="">....</c:if>
   4). <c:choose>
          <c:when test="">...</c:when>
          <c:when test="">...</c:when>
          <c:otherwise>...</c:otherwise>
       </c:choose>
 ★5). <c:forEach var="i" begin="1" end="100" step="1">${i}</c:forEach>
       <c:forEach var="str" items="${requestScope.list}"> ${str}</c:forEach>
       <c:forEach var="str" items="${requestScope.list}" varStatus="s">
           ${s.index}-${s.count}-${str}
       </c:forEach>
   6). <c:forTokens />


   7). <c:url value="URL路徑" var="" scope="">
          <c:param name="名" value="值"/>
       </c:url>   --> URL路徑?名=值 ;不支持Cookie: URL路徑;sessionid=xxxx?名=值


 2. <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> 國際化和格式化
   格式化:<fmt:formatNumber/> <fmt:formatDate/>
         <fmt:formatDate value="${date}" type="both"/>
   國際化:<fmt:setLocale>  <fmt:bundle>  <fmt:setBundle>   <fmt:message> 


 3. <%@ taglib uri="http://java.sun.com/jsp/jstl/sql"  prefix="sql" %> 操作數據庫
 
 4. <%@ taglib uri="http://java.sun.com/jsp/jstl/xml"  prefix="xml" %> 操作XML文件


 5. <%@ taglib uri="http://java.sun.com/jsp/jstl/functions"  prefix="fn" %> 一些函數的調用.只能用在EL中 ${fn:xxx(...)} 
     ${fn:length(collection)}, ${fn:trim(string)}



































發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章