jsp中的标签定制可以帮助来更好的实现 presentation layer。
我在学习的时候,感觉最困惑的就是 BodyContent。API 和 specification 中对 BodyContent 介绍的非常少。后来我就看了BodyContent 的源码和一些jsp 翻译过来的java 源码,才算有了比较清楚的了解。下面是我的理解:
BodyContent 类对JspWriter 实现了装饰模式,其实也算不上装饰,只是为了实现JspWriter 的层层包装。对于一个两层的嵌套标签,
|
容器在处理parent 标签时,创建一个BodyContent 对象,这个BodyContent 对象包装了真正的响应流,然后让隐含的out 引用指向这个BodyContent 对象。于是,"parent"就被写入到BodyContent,而不是响应流。
接下来,容器处理child标签。同样创建了一个BodyContent 对象,这个BodyContent包装了parent 标签的BodyContent,然后把这个BodyContent 对象赋给out引用。于是,"child"就被写入到这个BodyContent 对象。
这时,就形成了3 层的流包装。最内层标签的BodyContent 在流包装的最外层,流包装的最内层是真正的响应流。标签的嵌套顺序和流的嵌套顺序是反向的。每一层流包装中都有一些被输入的内容。
然后,最内层标签处理器的doAfterBody () 方法中,调用
bodyContent.writeOut (getEnclosingWriter ()) |