經好友指點,原來HTML的<input>裡的id和name屬性還有細微的區分。Struts1的ActionForm只會接受name屬性,而JavaScript在搜索Element時,若沒有name屬性,則改查id屬性。

  Struts1演至2008年底釋出1.3.10版,當中最為人詬病的ActionForm設計有了替代方案-引用Bean Utilities。根據http://www.niallp.pwp.blueyonder.co.uk/lazyactionform.html的說明,可以在form-bean引用LazyValidatorForm,LazyValidatorForm係從Apache的Commons-BeanUtils的DynaBean演化而來不用再自己寫ActionForm,如下:

<struts-config>
    <form-beans>
        <form-bean name="lazyForm" type="org.apache.struts.validator.LazyValidatorForm"/>
    </form-beans>

    <action-mappings>
        <action path="/myActionPath" type="myPackage.MyAction" name="lazyForm" validate="true"/>
    </action-mappings>
</struts-config>

  但一開始就報錯:java.lang.IllegalArgumentException: Resources cannot be null。原因是validate設為true,改為false就可以work,或者在struts_config.xml裡加上如下的標籤,其引用的validator等相關xml可以去找,或是設成空的。

<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property property="pathnames" value="/WEB-INF/validator-rules.xml, /WEB-INF/validation.xml"/>
</plug-in>

  Action自Request取得ActionForm可以這麼寫:DynaBean dynaForm = (DynaBean)form;。用法就像request.getParameter一樣,甚至可以取得集合類別如后:Map address   = (Map)dynaForm.get("address");。

  Commons-BeanUtils甚至提供以下的用法,假設t是一個Java Bean的instance:

PropertyUtils.copyProperties(t, form);  // 將ActionForm copy到Java Bean
PropertyUtils.copyProperties(form, t);  // 將Java Bean copy到Action Form

  常常在三層式架構設計裡,最單純的情境是單一table的增改刪查,古早時代是ActionForm是前端到Value Object的Mapping,而JDBC的RowMapper又是Value Object到DB的另一個Mapping,沒有Generate code寫起來會很煩。但現在比較好了,除了前端到中間層是用PropertyUtils.copyProperties 搞定之外,Spring的JDBCTemplate也提供了類似BeanUtils取代了RowMapper,程式片段如下:

simpleJdbcTemplate.query(sql, ParameterizedBeanPropertyRowMapper.newInstance(VO.class), args);

  ParameterizedBeanPropertyRowMapper實作了RowMapper介面,傳入Value Object的class,就可以和SQL所撈出來的欄位做自動mapping,與Commons-BeanUtils作用相仿。

arrow
arrow
    全站熱搜

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