装饰模式在jsp tag extension中的应用

jsp中的标签定制可以帮助来更好的实现 presentation layer。

我在学习的时候,感觉最困惑的就是 BodyContent。API 和 specification 中对 BodyContent 介绍的非常少。后来我就看了BodyContent 的源码和一些jsp 翻译过来的java 源码,才算有了比较清楚的了解。下面是我的理解:

BodyContent 类对JspWriter 实现了装饰模式,其实也算不上装饰,只是为了实现JspWriter 的层层包装。对于一个两层的嵌套标签,


<c:parent>
parent
<c:child>
child
</c:child>
</c:parent>

容器在处理parent 标签时,创建一个BodyContent 对象,这个BodyContent 对象包装了真正的响应流,然后让隐含的out 引用指向这个BodyContent 对象。于是,"parent"就被写入到BodyContent,而不是响应流。

接下来,容器处理child标签。同样创建了一个BodyContent 对象,这个BodyContent包装了parent 标签的BodyContent,然后把这个BodyContent 对象赋给out引用。于是,"child"就被写入到这个BodyContent 对象。

这时,就形成了3 层的流包装。最内层标签的BodyContent 在流包装的最外层,流包装的最内层是真正的响应流。标签的嵌套顺序和流的嵌套顺序是反向的。每一层流包装中都有一些被输入的内容。

然后,最内层标签处理器的doAfterBody () 方法中,调用

bodyContent.writeOut (getEnclosingWriter ())
把自己的BodyContent 中的全部内容写入到内层的流中,然后最内层标签的BodyContent 就从流包装层次中剥离出来。每一层标签都是如此,这样所有标签的正文内容最终会被写入流包装的最内层,即真正的响应流。

好文章,我在使用时感觉似乎是这样,想不到你分析得这么透彻.

好文章,我在使用时感觉似乎是这样,想不到你分析得这么透彻.