JavaWeb_day7-自定義標籤和JSTL
一自定義標籤:
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()
與傳統標籤處理類不同之處,頁面中每遇到一次對應的標籤時,容器都要創建一個實例。而傳統標籤處理類是針對一類標籤只有一個處理類的實例。
簡單標籤處理類在tld文件中聲明<body-content>時,不能使用JSP,只能是empty,scriptless, tagdependent中的一個值。
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)}
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()
與傳統標籤處理類不同之處,頁面中每遇到一次對應的標籤時,容器都要創建一個實例。而傳統標籤處理類是針對一類標籤只有一個處理類的實例。
簡單標籤處理類在tld文件中聲明<body-content>時,不能使用JSP,只能是empty,scriptless, tagdependent中的一個值。
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)}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.