close

  在OOP的設計裡,屬性名稱叫name、id、type、property等,在不同的套件或框架下,未必全然等義。在良葛格網站這篇文章寫著<html:form>的name屬性是struts_config.xml的ActionForm的name,實際上是type屬性,而且<html:form>根本連id、name屬性都沒有,強加反而造成JSP編譯錯誤。而<html:text>、<html:submit>等若不放在<html:form>下,POST到Server端是無法用DynaBean取值的,只能用request.getParameter取得。

  而ActionForm若是LazyValidatorForm,從Server傳到Client沒有問題,但從Client POST到Server,倘若使用<html:form>,則需在struts_config.xml裡,在<form-bean>下加<form-property>子標籤,如此,像<html:text property="customerName">的值才能POST到DynaBean:

<form-beans>
   <form-bean name="restrictedForm" type="org.apache.struts.validator.LazyValidatorForm">
       <set-property property="restricted" value="true"/>
       <form-property name="orderNumber" type="java.lang.Integer" />
       <form-property name="customerName" type="java.lang.String" />
       <form-property name="orderValue" type="java.lang.BigDecimal" />
       <form-property name="orderLines" type="org.apache.commons.beanutils.LazyDynaBean[]" />
   </form-bean>
</form-beans>

  之前試過可以在<html:text>再指定name屬性(即ActionForm名稱),則毋須置於<html:form>底下就能POST到DynaBean成功,但目前會失敗,目前試出來的是,submit可以post到DynaBean,而用Ajax去Post,則DynaBean都無法取到值(偶有成功),在猜是否與jQuery的serialize方法有關?!

  另外<form-bean>若把restricted屬性設為true(配置檔粗體字部份),可限制前端要POST的屬性名稱,未定義在<form-bean>裡的<form-property>是不會被當作submit的內容。

  此外,LazyValidatorForm的DynaBean使用上還要特別注意一點,比如dynaForm.set("vo", bean);。是把一個JavaBean設給DynaBean的key名為vo,可是當end user點選另一個url操作別的功能,也用到vo這個key name,會造成Cast的問題,所以切換時,該url事先做dynaBean.set("vo", null)予以清空,就不會有問題。

arrow
arrow
    全站熱搜

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