继承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来处理。