当前位置:天才代写 > tutorial > JAVA 教程 > Struts:自界说taglib的开拓

Struts:自界说taglib的开拓

2017-11-11 08:00 星期六 所属: JAVA 教程 浏览:263

副标题#e#

自界说标签必需实现下面三个接口中的一个: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;
  }


#p#副标题#e#

可以通过TagData类的getAttributeString要领获得某个属性的值,尚有别的一个要领getAttribute也是获得某个属性的值不外返回的是一个工具。而getVariableInfo要领必需返回一个VariableInfo数组。除此之外,还需要在tld中的元素界说<tag-class>后插手一个<tei-class>元素,说明TEI类的全称。

pageContext工具中含有的要领包罗:getOut();getPage();getRequest();getResponse();getServletConfig();getServletContext();getSession();

Tag接口中的返回常数意义:

EVAL_BODY_INCLUDE:汇报处事器正文的内容,并把这些内容送入输出流

SKIP_BODY:汇报处事器不要处理惩罚正文内容

EVAL_PAGE:让处事器继承执行页面

SKIP_PAGE:让处事器不要处理惩罚剩余的页面

EVAL_BODY_AGAIN:让处事器继承处理惩罚正文内容,只有doAfterBody要领可以返回

EVAL_BODY_BUFFERED:BodyTag接口的字段,在doStartTag()返回

EVAL_BODY_INCLUDE、SKIP_BODY一般由doStartTag()返回,而EVAL_PAPGE、SKIP_PAGE由doEndTag()返回。

在挪用doStartTag()要领之前其实标志还挪用了其他两个要领:setPageContext()和setParent();所以在后头的要领中可以利用pageContext和parent工具,假如需要的话。

让自界说标签在页面中建设工具时必需利用一个尺度的JSP工具TagExtraInfo类,它可以建设剧本变量还可以在编译的时候对标签举办检讨,TEI类仅可以生成由setAttribute要领存储在PageContext工具中的变量,而并不是单独生成变量。

通过TEI类界说剧本变量可以让利用者本身界说在页面中利用工具的名称。

除了利用TEI类要领之外,还可以简朴的在TLD中界说一个<variable>工具来利用自界说工具,用法如下:

#p#分页标题#e#

<variable>
<name-from-attribute>name</name-from-attribute>
<variable-class>String []</variable-class>
<declare>true</declare>
<scope>AT_END</scope>
</variable>

对付variable的子元素,<name-from-attribute>指的是建设的变量名称从属性name中来取得,虽然也可以通过<name-given>元素来限制变量的名称。留意这两个元素是互斥的。

一个扩展BodyTagSupport的自界说标志的生命周期如下:

1.建设标志

2.挪用Setter要领

3.挪用doStartTag()要领

4.挪用setBodyContent()要领

5.挪用InitBody()要领

6.处理惩罚标志的Body

7.doAfterBody();按照返回值,假如为EVAL_BODY_AGAIN,继承执行6,假如不是,执行8

8.挪用doEndTag()要领

9.判定标志是否需要重用,假如要,执行4;不然执行release()要领。

#p#副标题#e#

TagSupport类的要领findAncestorWithClass()要领可以用来查找指定的父类,它有两个参数一个为自己的类名,尚有一个就是要查找的父类的名称,假如没有返回null;譬喻ParentTag parent = (ParentTag) this.findAncestorWithClass(this,ParentTag.class);

自界说标志的验证要领:JSP1.1 TEI类可以在编译时刻检讨本身的标志,这个类中有一个isValid()要领,假如TLD中为这个标志界说了这个TEI类,那么网页在编译的时候将会挪用这个要领,而且会传入一个包括属性详细内容的参数TagData.(在JSP1.2中同样有效)

JSP1.2 JSP1.2中引入一个新的标志检讨要领,界说了一个新类TagLibraryValidator,而且可以由此派生出检讨符号的类,大大都环境下仅利用这个类的validate()要领,它有三个参数:prefix(在taglib指令中界说的前缀);uri(TLD文件中的URI);page(JSP页的PageData XML版本),validate()要领返回值为null时暗示验证乐成,不然返回的String范例将是一个错误信息。

当validator在TLD文件中界说时,它应该放在<tag>元素界说的外面,因为它是用来处理惩罚验证标志库中的所有标志的。

<validator><validator-class></validator-class></validator>.

较量JSP1.2和JSP1.1中的要领:TagLibraryValidator比TEI类更全面,可以用来检测整个网页,而不只仅是标志自己,可以用来处理惩罚标志间的相助,而且这种要领可以用来通知措施员错误出在那边,可是同时它的要领也比TEI类的要领巨大多了,因为它需要遍历整个XML版本的JSP(完成getAttributeValue要领)。

JSP1.2中的TryCatchFinally接口:这个接口主要是用于当自界说标志呈现异常时释放自界说标志中的资源利用的,它界说了两个要领:public void doCatch(Throwable t);(当doStartTag,doInitBody,doAfterBody,doEndTag要领呈现异常时会挪用这个要领)

piblic void doFinally();(当doEndTag被挪用后,无论是否呈现异常城市挪用这个要领,就像措施中的finally块,可以用来释放资源)

在JSP1.2中,可以通过在tld文件中插手一个元素<uri></uri>来指定本身的在taglib指令中利用的名称,然后把这个tld文件与Manifest.mf一起放在META-INF目次中,那么在页面中就可以很是利便地导入这些tld.

编写自界说标志的原则:

1.利用剧本变量(答允设计者为剧本变量起名、将剧本变量的数量减到最小、利用一个组合剧本工具和存取函数纵然用JavaBean)

2.当设计彼此协作的标志时应该只管制止建设一套新的语言,该当只管利用剧本变量3.编写代码而不是内容,不要在自界说标志中发生HTML,这样会失去通用性.

 

    关键字:

天才代写-代写联系方式