用了一段時間ofbiz自帶的form widgets工具,發現不是很好用。尤爲是與前端配合開發的時候,表單的樣式、效果受到了不少的限制。因而決定拋棄form widget,用freemarker。前端開發出來的效果和效率果真有了很大提交。可是存在一個問題,就是用freemarker寫的表單提交如何作校驗?和Struts不同,struts框架中自帶了form的驗證器。那麼ofbiz除了form widget之外,有沒有辦法實現表單驗證呢? 前端
答案就在ofbiz的service中。 java
由於ofbiz的邏輯層是一個一個的services,在給service的定義時,必需要給出傳入參數和返回結果(參考services.xml)。以下service中定義了一個createProduct的服務。須要傳入productId等參數。 框架
- <service name="createProduct" engine="java"
- location="com.openb2c.product.common.ProductServices"
- invoke="createProduct">
- <attribute name="productId" type="String" mode="IN"
- optional="false"></attribute>
- ......
- </service>
這裏能夠給每個attribute內加上這樣一個標籤:ide
- <attribute name="productId" type="String" mode="IN" optional="false">
- <type-validate class="org.ofbiz.base.util.UtilValidate "
- method="isNotEmpty ">
- <fail-message message="productId不能爲空" />
- </type-validate>
- </attribute>
這個<type-validate>標籤將會對attribute: productId進行校驗。工具
校驗的方法如上所見,裝載class"org.ofbiz.base.util.UtilValidate ",這個class是ofbiz自帶的一個驗證工具,固然也能夠寫你本身適用的驗證工具 。並調用class中的方法method"isNotEmpty"。這裏運用了java的反射技術。fail-message是當驗證不經過時,返回給服務調用者的錯誤信息。 spa
service會把全部的參數都驗證一遍,如有多個參數不經過的話,會把全部的不經過信息都返回。 orm
至此,只要咱們提交表單時,把request指向一個service。(在controller.xml中定義request-map,request-map中定義<event type="service" invoke="createProduct"/>)。當service校驗不經過時,就會把錯誤並錯誤信息一塊兒返回。只要在request-map的response中定義service失敗的頁面跳轉,便可把信息返回給用戶。 xml
另外,我使用的ofbiz版本(opentaps 1.0使用的)對一個參數只支持一個validator,要支持一個屬性多個validators的驗證,只需簡單的在ModelServiceReader(解釋services.xml的工具)的方法addValidators方法中稍做修改便可。 blog
到此,ofbiz表單部分比較知足咱們OpenB2C項目的開發需求。前端UI用freemarker較快作出好的頁面,而且能對錶單作驗證。開發