jsp页面中的自定义标签2
带属性的标签 【程序编程相关:(转载)异步IO、APC、IO完成端口、】
【推荐阅读:(转载)异步IO、APC、IO完成端口、】
对于每一个标签属性,都必须在标签handler中定义一个属性以及符合javabean结构规范的get与set方法.例如,logic:present标签的标签handler 【扩展信息:(转载)异步IO、APC、IO完成端口、】
在标签handler中定义属性
<logic:present parameter="clear">
包含下列声明与方法:
protected string parameter = null;
public string getparameter() { return (this.parameter); } public void setparameter(string parameter) { this.parameter = parameter; }注意,如果属性命名为id并且标签handler继承自tagsupport类,那么就不需要定义属性与set与get方法,因为它们已经由tagsupport定义了.
值为string的标签属性可以指定标签handler可用的隐式对象的一个属性.通过向隐式对象的[set|get]attribute方法传递标签属性值可以访问一个隐式对象属性.这是将脚本变量名传递给标签handler的好方式,在这里脚本变量与储存在页面上下文中的对象相关联(见隐式对象).
attribute元素
对于每一个标签属性,都必须在attribute元素中指定这个属性是否是必需的.其值是否可以由表达式确定.还可能指定属性的类型.对于静态值,类型总是java.lang.string.如果rtexprvalue元素是true或者yes,那么type元素定义会将任何指定的表达式的预期返回类型指定为属性的值.
<attribute>
<name>attr1</name> <required>true|false|yes|no</required> <rtexprvalue>true|false|yes|no</rtexprvalue> <type>fully_qualified_type</type> </attribute>如果tag属性不是必需的,那么标签handler应该提供一个默认值.
logic:present标签的tag元素声明parameter属性不是必需的(因为标签还可以测试是否存在其它实体,如bean属性)以及其值可以由运行时表达式设置.
<tag>
<name>present</name> <tag-class>org.apache.struts.taglib. logic.presenttag</tag-class> <body-content>jsp</body-content> ... <attribute> <name>parameter</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> ... </tag>属性验证
标签库的文档应该描述标签属性的有效值.在转换jsp页面时,web容器将强制应用每一个属性的tld元素中包含的限制.
在转换时还用从tagextrainfo派生的类的isvalid方法验证传递给标签的属性.这个类也用于提供有关标签定义的脚本变量的信息(见提供有关脚本变量的信息).
用tagdata对象向isvalid方法传递属性信息,它包含每一个标签属性的属性-值元组.因为验证在转换时发生,所以在请求时计算的属性值将设置为tagdata.request_time_value.
<tt:twa attr1="value1"/>标签有下列tld attribute元素:
<attribute>
<name>attr1</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute>这个声明表明attr1的值可以在运行时确定.
下面的isvalid方法检查attr1的值是否为有效的布尔值.注意由于的attr1值可以在运行时计算,所以isvalid必须检查标签用户是否选择了提供运行时值.
public class twatei extends tagextrainfo {
public boolean isvalid(tagdata data) { object o = data.getattribute("attr1"); if (o != null && o != tagdata.request_time_value) { if (((string)o).tolowercase().equals("true") || ((string)o).tolowercase().equals("false") ) return true; else return false; } else return true; } }带正文的标签
标签handler
带正文的标签的标签handler根据标签handler是否需要与正文交互而有不同的实现.我们说的交互的意思是标签handler读取或者修改正文的内容.
标签handler不与正文交互如果标签handler不需要与正文交互,那么标签handler应该实现tag接口(或者从tagsupport派生).如果需要对标签的正文进行判断,那么dostarttag方法就需要返回eval_body_include,否则,它应该返回skip_body.
如果标签handler需要反复地判断正文,那么它就应该实现iterationtag接口或者从tagsupport派生.如果它确定需要再次评估正文,那么它应该从dostarttag与doafterbody方法返回eval_body_again.
标签handler与正文交互如果标签handler需要与正文交互,那么标签handler必须实现bodytag (或者从bodytagsupport派生).这种处理器通常实现doinitbody与doafterbody方法.这些方法与由jsp页面的servlet传递给tag handler的正文内容交互.
... 下一页