JSP自定义标签学习(高级)

关键字: 自定义标签

BodyTag接口
    接口BodyTag的实现类,它是负责操作主体内容(bodyContent).
定义方法:public void doInitBody();
    public int doAtferBody();
提示,那些在doStartTag()方法之后被调用的方法依赖于doStartTag()方法返回值并且看在JSP页面上是否自定义Action元素,而不是怎样在TLD文件中去申明
    在TLD文件中, 若<body-content>empty</body-content>的话,doStartTag()方法只能返回SKIP_BODY
    body-content有三个可选值:empty , JSP , tagdependent
    若没有设置的话,那么doStartTag()可以返回SKIP_BODY, EVAL_BODY_INCLUDE, or EVAL_BODY_BUFFERED.
返回值的说明:

    若SKIP_BODY返回的情况下,body不会被evaluated并且doEndTag()被调用;

    若EVAL_BODY_INCLUDE 返回,并且自定义action元素不为空的时候,那么doInitBody(),setBodyContent()不会被调用,而body evaluated并且"通过"当前的out对象,还有当action元素为空的时候,只有doStartTag(),doEndTag();
   
    当EVAL_BODY_BUFFERED 返回,并且自定义的action元素不为空的时候,setBodyContent(),doInitBody()被调用,body被evaluated,doAfterBody()被调用,直到大于0次迭代后,doEndTag()才被调用,还有当action元素为空的时候,只有doStartTag(),doEndTag();
主题内容
   1.自定义标记通常需要操控自己的主体内容,例如数据库查询需要将其主题内容解释为SQL
       
    2.工作方法
    servlet容器包含BodyContent对象栈,servlet容器在doStartTag()方法之后调用PageContext.pushBody(),就是说把当前的主体内容推入栈中,其中out变量重定向到当前的主体内容实例主题内容,保留一个到JspWriter对象的引用,即前一个输出,JspWriter将数据写入响应流中.这样就有效地创建了写入器栈
    servlet容器是在调用标记的doAfterBody和doEndTag方法之间调用PageContent.popBody()方法的
注意请不要在doEndTag()后面去访问BodyContent,因为servlet容器在调用标记处理程序的doEndTag()方法为止,servlet容器可能已经再次使用了该标记的主题内容,使用doEndTag方法访问自己主体内容的标记,可能会访问到其他标记的主体内容,或者可能访问到空值,这样就导致了不确定的行为

BodyTagSupport类,实现BodyTag接口的类
    public BodyContent getBodyContent();//返回主题内容
    public JspWriter getPreviousOut();//返回前一个out对象
    说了这么一大堆的东西,有什么用呢?我们来写个东西来说明以下:
打印出主体内容!
java 代码
 
  1. import java.io.IOException;  
  2.   
  3. import javax.servlet.jsp.JspException;  
  4. import javax.servlet.jsp.tagext.BodyTagSupport;  
  5.   
  6. public class PrintBodyTag extends BodyTagSupport {  
  7.     public int doAfterTag()throws JspException  
  8.     {  
  9.         try  
  10.         {         
  11.             this.getBodyContent().writeOut(getPreviousOut());//上面讲的理论!  
  12.         }catch(IOException e)  
  13.         {  
  14.             throw new JspException(e);  
  15.         }  
  16.         return SKIP_BODY;  
  17.     }  
  18. }  
部署tld文件
xml 代码
 
  1. ......  
  2.   <tag>  
  3.     <name>printBody</name>  
  4.     <tag-class>PrintBodyTag</tag-class>  
  5.       
  6.   </tag>  
  7.   ......  
页面加载:
html代码
 
  1. <%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>  
  2. <%@ taglib uri="http://www.eimhe.com/taglibs/util.tld" prefix="util"%>  
  3. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  4. <html>  
  5.   <head>  
  6.     <title>My JSP 'tag.jsp' starting page</title>  
  7.   </head>  
  8.   <body>  
  9.     <util:printBody>AAAAAAAA</util:printBody> //结果就是怎么样相信大家猜得到!AAAAAAAA  
  10.   </body>  
  11. </html>  

 

你可能感兴趣的:(JSP自定义标签学习(高级))