开发定制标签库-6

来源:互联网 发布:工行网络金融品牌推广 编辑:程序博客网 时间:2024/05/16 18:52

继承TagSupport和BodyTagSupport类
前面我们依次介绍了Tag,IterationTag,BodyTag接口。实际应用当中,我们并不需要直接实现他们。jsp规范中已经为我们提供了两个类TagSupport和BodyTagSupport,用以对IterationTag和BodyTag的缺省实现。
所以,我们只需要根据需要去继承这两个类,然后重写我们需要定制的方法就可以了。

TagSupport类
该类是IterationTag的缺省实现。除了实现原有方法外,本身还增加了一些有用的其他方法和成员变量。下表列出其中重要的几个:

名称  描述  重写的方法和他们的返回值    void doStartTag()  继承自Tag。返回值SKIP_BODY。  void doAfterBody()  继承自IterationTag。返回值SKIP_BODY。  void doEndTag()  继承自Tag。返回值EVAL_PAGE。  处理嵌套标签的有用的方法    void setParent(Tag)  接受和维护一个父标签的引用。  Tag getParent() 返回父标签的引用。  Tag findAncestorWithClass(Tag,Class)  静态方法。寻找最近的指定类的标签。  标签属性操作    void setValue(String,Object)  设置属性。属性名是字符串,值可以是任何对象。  Object getValue(String)  返回给定属性名的属性的值。  Enumeration getValues()  返回一个所有值的枚举。  void removeValue(String)  删除给定的属性。  受保护的实例变量    PageContext pageContext  一个保存着PageContext对象的变量。   
BodyTagSupport类
该类同时继承了TagSupport类,并实现BodyTag接口。除了前表所示方法,该类还提供了一些其它方法便于使用。

名称  描述  重写的方法和他们的返回值    void doStartTag()  继承自Tag。返回值EVAL_BODY_BUFFERED。  void doAfterBody()  继承自IterationTag。返回值SKIP_BODY。  void doEndTag()  继承自Tag。返回值EVAL_PAGE。  用以处理缓冲的方法    void setBodyContent(BodyContent)  接受和维护一个BodyContent对象(缓冲对象)的引用。  BodyContent getBodyContent()  返回BodyContent对象的引用。  JspWriter getPreviousOut()  返回JspWriter对象,BodyContent就是对他的简单包裹。        
定制标签和JavaBeans之间的简单区分
虽然两者都是为了提高组件可重用性而设计的。但是一个经常被问起的问题是:如何决定在何时使用其中的一种技术,而不是另一种。
这里有个简单的比较,来帮助你如何决策。
.JavaBeans是jsp页的数据处理器并增加数据管理的逻辑。主要用以存储。定制标签,倾向于对特定请求的处理。
.标签是线程安全的,而bean则不是。Bean的线程安全是由开发人员手工实现的。
.标签了解他所运行的外部环境(pageContext),而bean则不。
.标签属于转换单位的一部分,而bean独立于转换单位之外。
.标签可以访问隐含对象,bean则不能。(这是对上两条的细节描述)
.标签只有页范围(page scope)。他们在一个请求内和一个页面内被创建。虽然他们可以访问所有的范围。beans则可以被创建于各种不同的范围。标签可以创建和维护bean,反之不然。
.标签的API是围绕jsp页的概念开发的,所以标签只能用在jsp页中。而bean却可以被更广泛的组件使用。
.标签不是持久化对象。而bean可以被持久化(序列化),以被后续使用。

相比之下标签较靠近用户,且只能用于jsp页面;而bean较靠近商业逻辑,更适合处理数据处理和维护类工作,且可以被任何组件重用。因此,首选的使用方法是用户的请求由标签负责处理,而需要应用商业逻辑和数据处理的时候,由标签再调用bean来处理。