裝飾模式在jsp tag extension中的應用

wwlhp@jdon.com發表於2003-12-08
jsp中的標籤定製可以幫助來更好的實現 presentation layer。

我在學習的時候,感覺最困惑的就是 BodyContent。API 和 specification 中對 BodyContent 介紹的非常少。後來我就看了BodyContent 的原始碼和一些jsp 翻譯過來的java 原始碼,才算有了比較清楚的瞭解。下面是我的理解:

BodyContent 類對JspWriter 實現了裝飾模式,其實也算不上裝飾,只是為了實現JspWriter 的層層包裝。對於一個兩層的巢狀標籤,
<c:parent>
  parent
  <c:child>
    child
  </c:child>
</c:parent>
<p class="indent">

容器在處理parent 標籤時,建立一個BodyContent 物件,這個BodyContent 物件包裝了真正的響應流,然後讓隱含的out 引用指向這個BodyContent 物件。於是,"parent"就被寫入到BodyContent,而不是響應流。

接下來,容器處理child標籤。同樣建立了一個BodyContent 物件,這個BodyContent包裝了parent 標籤的BodyContent,然後把這個BodyContent 物件賦給out引用。於是,"child"就被寫入到這個BodyContent 物件。

這時,就形成了3 層的流包裝。最內層標籤的BodyContent 在流包裝的最外層,流包裝的最內層是真正的響應流。標籤的巢狀順序和流的巢狀順序是反向的。每一層流包裝中都有一些被輸入的內容。

然後,最內層標籤處理器的doAfterBody () 方法中,呼叫
bodyContent.writeOut (getEnclosingWriter ())
把自己的BodyContent 中的全部內容寫入到內層的流中,然後最內層標籤的BodyContent 就從流包裝層次中剝離出來。每一層標籤都是如此,這樣所有標籤的正文內容最終會被寫入流包裝的最內層,即真正的響應流。

相關文章