自定义taglib的开发(开源技术Struts)
来源:优易学  2011-12-13 14:17:34   【优易学:中国教育考试门户网】   资料下载   IT书店

  自定义标签必须实现下面三个接口中的一个:Tag、IterationTag、BodyTag
  1.Tag
  如果要实现这个接口,可以通过扩展TagSupport这个类,来写自己需要的方法,而不需要把Tag接口中的所有方法实现。
  Tag接口的方法:doStartTag()、doEndTag()、getParent()、setParent()、release()、setPageContext()
  在Tag类代码中不能像jsp一样,直接使用out隐含对象,他有一个对象可以使用pageContext,通过它的getOut()方法可以得到out对象。在标签内部,访问任何的隐含对象,都是通过调用pageContext的set方法。
  2.IterationTag
  IterationTag接口与Tag接口类似,用于当一个自定义标签需要重复计算它的代码体的情况下。它扩展Tag接口并实现了一个新的方法doAfterBody()来实现循环,这个方法只有从doStartTag()返回EVAL_BODY_INCLUDE时才被调用。在执行doAfterBody()方法时,如果返回的是EVAL_BODY_AGAIN,那么将再次执行doAfterBody()方法,直到doAfterBody()返回的是SKIP_BODY或者EVAL_BODY_INCLUDE.
  3.BodyTag
  BodyTag接口扩展了IterationTag并提供了对代码体内容进行操作的功能。就是在计算代码体的时候可以对已经形成的代码体进行修改。BodyContent对象就是用来保存对自定义标签体计算的结果。它有一个新方法doInitBody(),这个方法只有在doStartTag()方法返回EVAL_BODY_BUFFERED时才调用,此时它将创建一个BodyContent对象保存结果。
  扩展自定义标签:
  添加属性
  首先要在tld文件中加入一个属性元素,然后在java文件中需要定义这个属性以及它的的setter方法。属性<attribute>元素有四个子元素分别是<name>、<required>、<rtexprvalue>、<description>,这里<rtexprvalue>表示的是属性是否接受scriptlet表达式的计算结果,默认情况下为false,即只能接受静态值。
  添加变量
  可以在tld文件中给自定义标签加入一个<variable>元素,它的子元素包括<name-given>表示保存变量的名字,<variable-class>表示变量的java类型,<declared>用boolean表示这个变量是否为新的,<scope>表示变量的使用范围(AT_BEGIN表示从起始标签起,AT_END表示从终止标签后,NESTED表示起始标签和终止标签之间)。定义了变量之后,需要在java文件中把这个变量用pageContext.setAttribute("",object);这里key值应该就是变量对外的名字。
  使用TagExtraInfo(TEI)类
  这个对象中有两类对象可以使用,TagData(保存标签属性的信息)、VariableInfo(描述代码变量)
  一段TagExtraInfo类代码实例:
  public VariableInfo[] getVariableInfo(TagData data) {
  String variableName = data.getAttributeString("name");
  VariableInfo vi =
  new VariableInfo(variableName,"String []", true, VariableInfo.AT_END);
  VariableInfo[] tagVariables = new VariableInfo[1];
  tagVariables[0] = vi;
  return tagVariables;
  }
  可以通过TagData类的getAttributeString方法得到某个属性的值,还有另外一个方法getAttribute也是得到某个属性的值不过返回的是一个对象。而getVariableInfo方法必须返回一个VariableInfo数组。除此之外,还需要在tld中的元素定义<tag-class>后加入一个<tei-class>元素,说明TEI类的全称。
  pageContext对象中含有的方法包括:getOut();getPage();getRequest();getResponse();getServletConfig();getServletContext();getSession()。

[1] [2] 下一页

责任编辑:小草

文章搜索:
 相关文章
热点资讯
资讯快报
热门课程培训