2013年4月23日 星期二

SCWCD重點整理-10.開發自訂標籤

1.自訂標籤延伸API部署於 javax.servlet.jsp.tagext套件中,其API類別圖如下:
自訂標籤API類別關係圖
自訂標籤API類別關係圖


  • Tag File :
    • 副檔名為tag、tagx
    • 合法的body-content元素:empty | scriptless | tagdependent
    • 只有Tag File才有的指令:tag 、attribute:、variable
    • Containe會去哪裡找Tag File?
      • /WEB-INF/tags目錄下
      • /WEB-INF/tags的子目錄下
      • /在WEB-INF/lib/下的JAR檔中的META-INF/tags目錄下
      • /在WEB-INF/lib/下的JAR檔中的META-INF/tags子目錄下
      • 若Tag file被部屬在jar檔中,JAR檔中的META-INF/TLDS必須有tld檔
      • 詳細的實作設定可參考良葛格學習筆記-TLD檔案
  • SimpleTagSupport:
    • 實做SimpleTag
    • 在doTag()中,利用getJspContext()取得 JspContext後,可使用setAttribute,將value寫入 pageScope中.
    • getJspBody.invoke(null),設定為null,表示資訊預設寫入getJspContext().getOut所取得的JspWriter中,整各指令作用為呼叫標籤主體。
    • body-content不能為Jsp,即標籤的body不能使用Scripting.(包含<% %>,<%= %>,    <%! %>等
  • Classic Tag:
    • Tag Support :
      • 繼承此類別的標籤處理器,不具有修改bodyContent的能力
      • 從IterationTag得到的doAfterBody()方法讓標籤處理器能重複繞行標籤主體
      • doStartTag()、doAfterBody預設傳回SKIP_BODY(不評算主體)
      • doStartTag()回傳EVAL_BODY_INCLUDE,表示評算主體
      • doEndTag()回傳EVAL_PAGE,評算標籤結束後的剩餘頁面
    • BodyTagSupport:
      • 繼承此類別可直接存取主體內容並且以某種方式修改
      • 當doStartTag()回傳EVAL_BODY_BUFFERED時,會先執行:
        • setBodyContent(BodyContent)
        • doInitBody()
        • 再繼續評算標籤主體
      • doStartTag()預設傳回EVAL_BODY_BUFFERED
    • Classic Tag透過Tag.getParent()回傳Tag,故僅能有Classic Tag的父標籤
      • 若想讓內層的Classic Tag取得外層為SimpleTag的取法:
         TagAdapter tagAdapter=(TagAdapter)this.getParent();
         out.println(tagAdapter.getAdaptee());
        
        此處是利用 TagAdapter將外層為JspTag介面的SimpleTag包裝起來後,再由tagAdapter.getAdaptee()取出真正的SimpleTag
    • 而SimpleTag透過SimpleTag.getParent()回傳的是JspTag,故其父標籤可以是Classic Tag或是SimpleTag

沒有留言:

張貼留言