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)}



































你可能感兴趣的:(JavaWeb_day7-自定义标签和JSTL)