經好友指點,原來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> <action-mappings> |
但一開始就報錯:java.lang.IllegalArgumentException: Resources cannot be null。原因是validate設為true,改為false就可以work,或者在struts_config.xml裡加上如下的標籤,其引用的validator等相關xml可以去找,或是設成空的。
<plug-in className="org.apache.struts.validator.ValidatorPlugIn"> |
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作用相仿。