java

位置:IT落伍者 >> java >> 浏览文章

Struts:自定义taglib的开发[1]


发布日期:2023年03月02日
 
Struts:自定义taglib的开发[1]

自定义标签必须实现下面三个接口中的一个TagIterationTagBodyTag

Tag

如果要实现这个接口可以通过扩展TagSupport这个类来写自己需要的方法而不需要把Tag接口中的所有方法实现

Tag接口的方法doStartTag()doEndTag()getParent()setParent()release()setPageContext()

在Tag类代码中不能像jsp一样直接使用out隐含对象他有一个对象可以使用pageContext通过它的getOut()方法可以得到out对象在标签内部访问任何的隐含对象都是通过调用pageContext的set方法

IterationTag

IterationTag接口与Tag接口类似用于当一个自定义标签需要重复计算它的代码体的情况下它扩展Tag接口并实现了一个新的方法doAfterBody()来实现循环这个方法只有从doStartTag()返回EVAL_BODY_INCLUDE时才被调用在执行doAfterBody()方法时如果返回的是EVAL_BODY_AGAIN那么将再次执行doAfterBody()方法直到doAfterBody()返回的是SKIP_BODY或者EVAL_BODY_INCLUDE

BodyTag

BodyTag接口扩展了IterationTag并提供了对代码体内容进行操作的功能就是在计算代码体的时候可以对已经形成的代码体进行修改BodyContent对象就是用来保存对自定义标签体计算的结果它有一个新方法doInitBody()这个方法只有在doStartTag()方法返回EVAL_BODY_BUFFERED时才调用此时它将创建一个BodyContent对象保存结果

扩展自定义标签

添加属性

首先要在tld文件中加入一个属性元素然后在java文件中需要定义这个属性以及它的的setter方法属性<attribute>元素有四个子元素分别是<name><required><rtexprvalue><description>这里<rtexprvalue>表示的是属性是否接受scriptlet表达式的计算结果默认情况下为false即只能接受静态值

添加变量

可以在tld文件中给自定义标签加入一个<variable>元素它的子元素包括<namegiven>表示保存变量的名字<variableclass>表示变量的java类型<declared>用boolean表示这个变量是否为新的<scope>表示变量的使用范围(AT_BEGIN表示从起始标签起AT_END表示从终止标签后NESTED表示起始标签和终止标签之间)定义了变量之后需要在java文件中把这个变量用pageContextsetAttribute(object)这里key值应该就是变量对外的名字

使用TagExtraInfo(TEI)类

这个对象中有两类对象可以使用TagData(保存标签属性的信息)VariableInfo(描述代码变量)

一段TagExtraInfo类代码实例

public VariableInfo[] getVariableInfo(TagData data) {

String variableName = datagetAttributeString(name);

VariableInfo vi =

new VariableInfo(variableNameString [] true VariableInfoAT_END);

VariableInfo[] tagVariables = new VariableInfo[];

tagVariables[] = vi;

return tagVariables;

}

可以通过TagData类的getAttributeString方法得到某个属性的值还有另外一个方法getAttribute也是得到某个属性的值不过返回的是一个对象而getVariableInfo方法必须返回一个VariableInfo数组除此之外还需要在tld中的元素定义<tagclass>后加入一个<teiclass>元素说明TEI类的全称

pageContext对象中含有的方法包括getOut()getPage()getRequest()getResponse()getServletConfig()getServletContext()getSession()

Tag接口中的返回常数意义

EVAL_BODY_INCLUDE告诉服务器正文的内容并把这些内容送入输出流

SKIP_BODY告诉服务器不要处理正文内容

EVAL_PAGE让服务器继续执行页面

SKIP_PAGE让服务器不要处理剩余的页面

[] []

               

上一篇:Struts:自定义taglib的开发[2]

下一篇:Hibernate3新特性及发展趋