這篇是與前一篇有關的(簡易解析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
沒有留言:
張貼留言