2014年8月26日 星期二

繼承struts tag取值

這篇是與前一篇有關的(簡易解析struts property tag 取值 )~

前一篇是用JSP的概念去parser struts的格式資訊,只需要J2EE的method就可以~
阿這一篇就是採用struts自己的功能來取,就是call struts的method...
(雖然有點懶惰~但還是去看了一下原始碼來用用~之後還是得靠他自己內部來call取值,在loop時,用原始方式就沒辦法拿到外部變數了Orz..得靠struts tag內的暫存才有辦法取得到)

1.  先找一個struts tag來繼承,先選最簡單的來練習
public class MyStrutsTag extends PropertyTag {

2. 通常有繼承,constructor照跑比較安全
public MyStrutsTag()  {
    super();
}

3. override doStartTag() ,這裡想了有點久,因為在原始碼內,doStartTag其實會call protected void populateParams(),看原始碼大家通常是改在這裡,但是因為我需要改寫最後輸出的out的內容,後來決定就在這邊先跳掉,讓流程SKIP_BODY

public int doStartTag() throws JspException {
        //前面這裡都照抄,讓該讀的資料都進來,也不知道有沒有用到,只是萬一要用就有
        ValueStack stack = getStack();
        component = getBean(stack, (HttpServletRequest) pageContext.getRequest(), (HttpServletResponse) pageContext.getResponse());
        Container container = (Container) stack.getContext().get(ActionContext.CONTAINER);
        container.inject(component);
       
        super.populateParams();

4. 開始改寫加入自己的東西,調用struts內的值,val要先處理到只剩取值表示法那樣:example: "result.dt",正常的話fVal就應該會是像struts tag取出的值了~

                  val = this.findPropertyValue(val);   
                  String expr = ComponentUtils.stripExpressionIfAltSyntax(this.getStack(), val);
                  Object fVal = this.findValue(expr);

                  if(fVal != null)  {
                      val = fVal.toString();
                  }


其實重點也就是只有,使用ComponentUtils,還有暫存資訊的getStack()...
另一點是還沒看到它解tag的attribute,所以~解tag的方式我還是用string->dom的方式取value

沒有留言: