TagSupport与BodyTagSupport的区别

1.TagSupport与BodyTagSupport的区别

TagSupport与BodyTagSupport的区别主要是标签处理类是否需要与标签体交互,如果不需要交互的就用TagSupport,否则如果需要交互就用BodyTagSupport。
交互就是标签处理类是否要读取标签体的内容和改变标签体返回的内容。用TagSupport实现的标签,都可以用BodyTagSupport来实现,因为BodyTagSupport继承了TagSupport。

2 doStartTag(),doEndTag()

doStartTag()方法是遇到标签开始时会呼叫的方法,其合法的返回值是EVAL_BODY_INCLUDE与SKIP_BODY,前者表示将显示标签间的文字,后者表示不显示标签间的文字;doEndTag()方法是在遇到标签结束时呼叫的方法,其合法的返回值是EVAL_PAGE与 SKIP_PAGE,前者表示处理完标签后继续执行以下的JSP网页,后者是表示不处理接下来的JSP网页

doAfterBody(),这个方法是在显示完标签间文字之后呼叫的,其返回值有EVAL_BODY_AGAIN与SKIP_BODY,前者会再显示一次标签间的文字,后者则继续执行标签处理的下一步。
预定的处理顺序是:doStartTag()返回SKIP_BODY,doAfterBodyTag()返回SKIP_BODY,doEndTag()返回EVAL_PAGE.

如果继承了TagSupport之后,如果没有改写任何的方法,标签处理的执行顺序是:
doStartTag() ->不显示文字 ->doEndTag()->执行接下来的网页

如果您改写了doStartTag(),则必须指定返回值,如果指定了EVAL_BODY_INCLUDE,则执行顺序是:
doStartTag()->显示文字->doAfterBodyTag()->doEndTag()->执行下面的网页

 

下面这个程序简单的示范如何使用自订标签来对网页内容作一些保护:

* GuardTag.java

  1. package onlyfun.caterpillar; 
  2. import java.io.*; 
  3. import javax.servlet.jsp.*; 
  4. import javax.servlet.jsp.tagext.*; 
  5. public class GuardTag extends TagSupport { 
  6.      public int doStartTag() throws JspException { 
  7.          String valid = 
  8.              pageContext.getRequest().getParameter("valid"); 
  9.          // 如果flag设定为key,就显示本体文字内容 
  10.          if(valid.equals("valid_user")) { 
  11.              return EVAL_BODY_INCLUDE; 
  12.          } 
  13.          return SKIP_BODY; 
  14.      } 

同样的,程序编译完之后,放置在WEB-INF/classes/之下,然后编译.tld档案,如下:

* guardtag.tld

  1. <?xml version="1.0" encoding="UTF-8" ?> 
  2. <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2eeweb-jsptaglibrary_2_0.xsd" version="2.0">     
  3.      <description>Tag Demo</description> 
  4.      <tlib-version>1.0</tlib-version> 
  5.      <jsp-version>2.0</jsp-version> 
  6.      <short-name>TagDemo</short-name> 
  7.      <uri>/TagDemo</uri> 
  8.      <tag> 
  9.          <description>Cuard BodyText</description> 
  10.          <name>guard</name> 
  11.          <tag-class>onlyfun.caterpillar.GuardTag</tag-class> 
  12.          <body-content>JSP</body-content> 
  13.      </tag> 
  14. </taglib> 

在<body-content>中设定的是JSP,这表示如果本体中包括JSP网页的内容,将会被编译执行,接下来您可以在web.xml中定义uri与.tld的名称对应关系,方法与前一个主题相同,这边就不重复说明了,然后撰写一个测试的JSP网页:

* test.jsp

  1. <%@taglib prefix="caterpillar" 
  2.             uri="http://caterpillar.onlyfun.net/"%> 
  3. <html> 
  4. <body> 
  5.      这个网页包括受保护的内容OOOXXXX........<p> 
  6.      <caterpillar:guard> 
  7.          ${ param.user }, 您好,幸运密码是 oooxxx ! 
  8.      </caterpillar:guard> 
  9. </body> 
  10. </html> 

为了要能看到幸运密码,您必须在请求中包括guard参数,假设请求是:http://localhost:8080/myjsp/test.j ... _user&user=Justin
这样就可以看到幸运密码了:

  1. <html>
  2. <body>
  3.      这个网页包括受包护的内容OOOXXXX.................<p>   
  4.          Justin, 您好,幸运密码是: oooxxx !   
  5. </body>
  6. </html>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值