JSP资料辅导(4--2)

带Body的自定义标签

1,必须实现Tag接口的doStartTag()和doEndTag()方法;
2,可以实现IterationTag接口的doAfterBody()方法;
3,可以实现BodyTag接口的doInitBody和setBodyContent方法;
4,doStartTag方法可以返回SKIP_BODY、EVAL_BODY_INCLUDE、或者EVAL_BODY_BUFFERED(当你想使用     BodyContent);
5,doEndTag方法可以返回SKIP_PAGE或EVAL_PAGE;
6,doAfterBody方法可以返回EVAL_BODY_AGAIN, SKIP_BODY;

 

定义脚本变量的标签(迭代标签)

1,定义脚本标签的二个步骤:  
   . 在标记库描述符(TLD)文件中列明脚本变量;  
   . 定义标签扩展信息类(TEI)并且在TLD文件中包括这个类元素(tei-class);
2,变量必须在标签处理程序类中使用pageContext.setAttribute()方法设置;
3,标签扩展信息类(TEI)必须继承TagExtraInfo以及覆盖getVariableInfo()方法;
4,变量的范围可以是AT_BEGIN, NESTED, AT_END(标签扩展信息类(TEI)的VariableInfo中定义)之一;

 

脚本变量的有效性
变量     |   有效性                   
---------------------------------------
NESTED   | 标签中的参数在starttag到endtag之间是有效的
AT_BEGIN | 标签中的参数在标签的开始到JSP页面结束是有效的
AT_END   | 标签中的参数在标签的结束到JSP页面结束是有效的

 

Tag接口的方法

 

interface javax.servlet.jsp.tagext.Tag
------------------------------------------------------
+EVAL_BODY_INCLUDE:int
+EVAL_PAGE:int//继续执行页面
+SKIP_BODY:int//跳出标签体
+SKIP_PAGE:int//跳出页面,也就是整个JSP不会再运行
------------------------------------------------------
+release():void
+getParent():javax.servlet.jsp.tagext.Tag
+setParent(javax.servlet.jsp.tagext.Tag):void
+doEndTag():int
+doStartTag():int
+setPageContext(javax.servlet.jsp.PageContext):void

 

Tag的生命周期

 

1,setPageContext(javax.servlet.jsp.PageContext):void
2,setParent(javax.servlet.jsp.tagext.Tag):void
3,setAttribute:void
4,doStartTag():int
5,doEndTag():int
6,release():void

 

BodyTag和Tag接口的关系

 

interface javax.servlet.jsp.tagext.BodyTag-->interface javax.servlet.jsp.tagext.Tag
------------------------------------------
+EVAL_BODY_AGAIN:int//继续执行标签体
-----------------------------------------
+doInitBody():void
+setBodyContent(javax.servlet.jsp.tagext.BodyContext):void
+doAfterBody():int

 

BodyTag的处理过程

 

1,setPageContext(javax.servlet.jsp.PageContext):void
2,setParent(javax.servlet.jsp.tagext.Tag):void //设置此标签的父标签,也就是上一层标签
3,setParent()
4,doStartTag():int
5,setBodyContent(javax.servlet.jsp.tagext.BodyContent):void//设置方法体
6,doInitBody():void//
7,doAfterBody():int
/* 这个方法会被不断的调用直到不再满足条件,通过这个方法来控制返回,从而控制循环是否中断
  SKIP_BODY是跳出标签体的,EVAL_BODY_INCLUDE是继续执行标签体,通过返回这两个值来控制循环是否*/
8,doEndTag():int
9,release():void

 

SimpleTag接口的方法

 

javax.servlet.jsp.tagext.SimpleTag
------------------------------------------
+doTag():void
+getParent():JspTag
+setJspBody(JspFragment jspBody):void
+setJspContext(JspContext pc):void
+setParent(JspTag parent):void

 

SimpleTage接口的生命周期(JSP2.0的自定义标签接口)


1,new:      
   每次遇到标签,容器构造一个SimpleTag的实例,这个构造方法没有参数。和红典的标签一样,          SimpleTag不能缓冲,故不能重用,每次都需要构造新的实例。
2,setJspContext()、setParent(): 只有这个标签在另一个标签之,才调用setParent()方法;
3,设置属性:调用每个属性的setter方法;
4,setJspBody();
5,doTag(): 所有标签的逻辑、迭代和Body计算,都在这个方法中;
6,return

 

例:

package com.tag;
public class HelloTag implements Tag
{
  private PageContext pageContext;
  private Tag parent;
 
     public HelloTag(){ 
    super();
     }
    
    /**
      *设置标签的页面的上下文
      */
     public void setPageContext(final PageContext pageContext) {
           this.pageContext=pageContext; 
     }
    /**
      *设置上一级标签
      */
     public void setParent(final Tag parent) {  
          this.parent=parent;  
     }
     /**
      *开始标签时的操作
      */
     public int doStartTag() throws JspTagException{  
          return SKIP_BODY;  //返回SKIP_BODY,表示不计算标签体
     }
     /**
      *结束标签时的操作
      */
     public int doEndTag() throws JspTagException{
        try{  
             pageContext.getOut().write("Hello World!你好,世界!");
        }             
          catch(java.io.IOException e){
             throw new JspTagException("IO Error: " + e.getMessage());
          } 
          return EVAL_PAGE;
      }
     /**
      *release用于释放标签程序占用的资源,比如使用了数据库,那么应该关闭这个连接。
      */
     public void release() {}   
     public Tag getParent(){   
        return parent;
     }
}

 

xxx.tld

<?xml version="1.0" encoding="ISO-8859-1" ?>
<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/j2ee web-jsptaglibrary_2_0.xsd"
    version="2.0">
 
  <tag>
    <description>Extends TagSupport</description>
    <name>hello</name>
    <tag-class>com.tag.HelloWorldTag</tag-class>
    <body-content>jsp</body-content>
  </tag>
</taglib>

web.xml

<web-app>
<taglib-uri>/xxx</taglib-uri>
 <taglib-location>/WEB-INF/tlds/xxx.tld</taglib-location>
</web-app>

xxx.jsp

<%@ taglib uri="/xxx" prefix="mytag" %>
<%@ page contentType="text/html; charset=gb2312" %>
<html><head><title>first cumstomed tag</title></head><body>
<p>以下的内容从Taglib中显示: </p>
<p><i><mytag:hello_int/></i>
<br>
<p><mytag:hello_int></mytag:hello_int>
</body></html>

你可能感兴趣的:(jsp,Web,xml,servlet,脚本)