标记文件学习之要点

1. 标记文件使用一个页面来实现标记功能,而标记处理器使用一个java标记处理器类来实现标记功能.

2. 标记处理器有两种类型,传统和简单(简单标记和标记文件是jsp2.0中新增加的)

3.建立简单标记处理器时,可以扩展SimpleTagSupport(这个类实现了SimpleTag接口);

4.要部署一个标记处理器,必须创建一个TLD,使用JSTL和其他定制标记库所用的<tag>元素来描述标记.

5.如果使用一个有体的简单标记,要保证这个标记的TLD<tag>没有将<body-content>声明为empty.然后调用getJspBody().invoke()来处理体.

6.SimpleTagSupport类包括SimpleTag接口中所有方法的实现,另外还提供了3个便利方法,其中包括getJspBody(),可以用这个方法访问标记体的内容.

7. 简单标记生命周期:简单标记绝不会由容器重用,所以每次调用标记时,都会实例化标记处理器,并调用其setJspContext()方法.如果标记本身是 从另一个标记中调用的,则会调用setParent()方法。如果调用标记时有属性,对于每个属性会调用一个bean式的设置方法。如果调用标记时有体, 则用调用setJspBody()方法。最后,调用doTag()方法,结束时,撤销标记处理器实例。

8.只有调用标记时确实有体,才会 调用setJspBody()方法,如果调用标记时没有体,不论是空标记<my:tag />还是开始和结束标 记<my:tag></my:tag>之间没有任何内容,都不会调用setJspBody()方法。记住,如果标记有 体, TLD必须反映出这一点:<body-content>的值不能是empty。

9.简单标记的doTag()方法可以设置标记体使用的一个属性,为此先调用getJspContext().setAttribute(),再调用getJspBody().invoke()。

10.通过在循环中调用体(getJspBody().invoke(),可以迭代处理简单标记的体。

11.doTag()方法声明了一个JspException和一个IOException,所以可以直接写到JspWrite,而无需将其包装在一个try/catch中。

12.如果标记有一个属性,要在TLD中使用<attribute>元素声明这个属性,并在标记处理器中提供一个bean式的setter方法。调用标记时,会在doTag()之前先调用setter方法。

13.getJspBody()方法返回一个JspFragment,它有两个方法:invoke(java.io.Write)和getJspContext(),getJspContext()返回一个JspContext,标记处理器可以用这个jspContext访问PageCoutext API(访问隐隐约约式变量和作用域属性)。

14.如果向invoke()传入null,会把计算的体写至响应输出,不过,如果你想直接访问体内容,可以传入另一个Writer。

15.如果你希望当页面停止处理,可以抛出一个SkipPageException。如果调用标记的页面包含在另一个页面中,尽管被包含的页面在抛出异常之后就停止处理,但外层页面仍会继续。如:
if(thingsDontWork)
{
    throw new SkipPageException();
}

你可能感兴趣的:(java,bean,jsp,null,扩展,setter)