花了一天半,終於搞懂JSTL與Struts Tag之間的差異。JSTL的S是Standard,既是standard,存取session沒有再依附其它framework如Struts。以近日Survey的LazyValidatorForm為例,要把它當作attribute裡一個變數取值:

<c:out value="${lazyForm.map.vo.name_tw}" />

  lazyForm是定義在struts_config.xml的一個<form-bean> name,即LazyValidatorForm的別名。LazyValidatorForm是落實動態存取的Java Bean,其實作原型就是放一個map。是故lazyForm後接一個map,而vo是一個Java Bean,name_tw則是該vo的欄位。相形之下用Struts Tag就乾淨多了,不會無由來找個map:

<html:text name="lazyForm" property="vo.name_tw" />

  上述分辨很簡單,真正花時間搞懂的是兩者迴圈用法大異其趣,各有自己的棉角,先說用Struts Tag。其迴圈標籤叫<logic:iterate>:

<logic:iterate name='lazyForm' property='vo.accounts' id='acc'>
    alert('<bean:write name="acc" property="name_tw" />');
</logic:iterate>

  vo下的accounts是一個List,List裡放著Java Bean。<logic:iterate>的id屬性則是Iterator的名字,給標籤內的子標籤如<bean:write>或<html:text>等等struts tag類的使用。用到<logic:iterate>還得做一個無聊卻必須的設定,需在struts_config.xml加入<message-resources>設定,例:

<message-resources parameter="com.foo.ApplicationResource" />

  即便完全用不到ApplicationResource這個檔,若不設定,就會丟出以下的Exception:

Cannot find message resources under key org.apache.struts.action.MESSAGE

  而JSTL的迴圈標籤是<c:forEach>,事實也有iterator機制,叫var,而<logic:iterate>的iterator叫id,學標籤真的很煩>"<。例:

<c:forEach items="${lazyForm.map.vo.accounts}" var="acc" varStatus="status" >
    alert('<c:out value="${acc.name_tw}" />');
</c:forEach>

  對照一下和<logic:iterate>用法類似。而我是被varStatus影響到,想取得status.index作為陣列索引,卻不知道var變數原來是一個Iterator,囧rz…。

arrow
arrow
    全站熱搜

    Jemmy 發表在 痞客邦 留言(0) 人氣()