這篇文章,在草稿箱里沉積了好久,一直說要把它寫完,可老是被其他事情給占用。我現在的休息時間就是漫天涂鴉,已經好久沒去整理wmframework了,感覺自己都有點對它陌生了。今天發現剛好草稿箱里就剩下這個,那就把它寫完吧。
這里我主要介紹wmframework的1.0版本關于jsp請求數據處理,這個版本被運用在我做一個校務管理系統的時候,大體的處理流程和(一)中介紹那樣,有興趣可以回頭看看。wmframework v1.0整個版本的完善經歷了2年半左右的時間。當然這更多得益于項目組最終確定采用這個技術框架,有了更多的人使用,自然暴露的問題就逐漸增多。為了滿足通用與靈活多樣的特性,解決了各種自己原先沒考慮的需求,這中間我做了很多大大小小的修改完善。整個項目結束,最終1.0版本已就穩定下來了。
我先說下wmframework 提倡什么,它主要倡導的就是開發的分層性,這個你可以在我的《用WM framework進行MVC團隊組合模式的系統開發》找到答案。就單個模塊或功能點的開發而言,wmframework提出,多個jsp頁面請求公用一個action相應,一個service外部接口和一個dao完成處理,所以使用wmframework,常規下開發人員沒必要也不允許進行action、service、dao的編寫,因為wmframework自帶的公用定義已經完成了你的操作。不說別的光這點上就可以節省多少不必要的資源開銷,最終可以直接有效地降低開發人員的工作量,何樂而不為呢?
wmframework 主要是依托于ajax數據提交模式下運作的,在1.0中主要是以同步請求提交為主,下面我具體來說說前后臺jsp請求數據處理。
1.前臺數據封裝
使用wmframework 要求開發人員在jsp中除了使用html標簽,部分jstl及自定義標簽外,一般不提倡使用類似struts或spring自帶的mvc標簽,因為這些標簽本身就是一個javabean,如果用的過多,那必然增加jsp的頁面負載和請求加載速度,如直接使用html標簽,至少可以減少那些mvc標簽的解析過程。下面我給出一個jsp中一個表單元素的寫法:
<input type="text" issave="true" fieldname="userAccount" require="true" datatype="chars"
showmessage="用戶賬號為空或設置錯誤" maxlength="20" class="textfile" id='unit_account'/>
這里wmframework 擴展了html標簽,增加了幾個自定義的屬性。issave="true"表明當前表單元素是必須提交到后臺進行操作的;fieldname是匹配當前表單提交匹配domain(或pojo)的中某個屬性的名稱;require表明當前字段是否必填;datatype標識當前元素需要填入的數據類型,這里chars代表需要字符型;showmessage表示如當前表單元素校驗不通過;需要給出的提示信息。當然不光是input可以這樣定義,只要html支持的頁面標簽如select,textarea,image,div,tr,td等等都可以進行這些屬性的定義,這里就不一一羅列了。
2.前臺數據校驗
頁面元素定義完,接下來就是表單提交數據前,前臺js校驗問題了,這里wmframework 通過自定義的js對象WMvalidate完成,一般情況下不提倡直接調用WMvalidate中的方法,因為WMvalidate在被調用完成數據校驗的同時,其他對象在完成這些表單數據的裝載。
3.前臺數據提交
對于當前jsp表單數據的校驗與裝載過程,主要在前臺js的入口對象WMaction中完成,所以一般頁面中主要以調用WMaction為主。下面我給出jsp調用WMaction對象的一個實例,進行簡單說明:
這是一個提交按鈕觸發的onclick事件處理函數
function dosave() {
var ac = new action();//創建js對象請求action對象
ac.setForm(document.forms[0]);//設置本次提交表單數據所處的form對象,當一個頁面存在太多元素或form是,可以有效地減少沒必要的頁面元素遍列
ac.setUrl(cps+'/userAction.do?action=add');//設置本次提交的路徑url, cps為公共文件中定義的全局變量,var cps = "<%=request.getContextPath()%>";即當前上下文的js引用。
ac.setTextDiv('textdiv');//設置本次提交,需要隱藏按鈕所在的div的ID值。數據提交后,當前操作按鈕將被隱藏,避免用戶進行二次點擊操作
ac.setHitDiv('hitDiv');//設置異步提交時,進度條所在的div的ID值。數據處理過程中,提交按鈕將被隱藏,同時在相同位置將顯示一個進度條標識當前請求處理的進度
ac.setIsasy(true);//設置本次提交的操作方式:true 異步方式,即當前提交無需等待response的響應,可完成類似cpu多線程同時處理的方式, false 同步方式即當前請求提交后,必須等待response的響應,這好比數據庫中的排它鎖,一時僅能保證一個請求的處理。
ac.setFunctionname("insertUser");//設置本次提交執行的sqlmap配置文件中的xml節點方法的id值,對大小寫敏感,如果你了解ibatis,應該知道這里指的東西。
ac.setDomainname("OaUser");//設置本次提交數據封裝對象名稱(和后臺domain一致,不用加類全路徑,加已無所謂)對大小寫敏感,后臺自帶完成當前domain對象的全路徑添加匹配,這就要求,整個系統的domain存放在固定的package ,當然你實在不愿意,那就直接加上當前domain的這個包路徑,如 ac.setDomainname("com.test.OaUser");。
ac.execute();//發送數據請求,因為這里僅考慮的是進行簡單的保存或刪除操作,所以沒有添加回調函數的處理
}
如果你感覺前面的定義過于繁瑣難記,那可以使用第二種方式,直接獲得數據表單居于xml格式封裝的字符串,前面忘記說一點,wmframework 所有數據請求都是通過xml格式封裝并通過ajax發出的,這點我在(一)中已經進行了相關介紹說明。
給出一個定義的參考

function dosave()
{
var ac = new action();//創建js對象請求action對象
ac.setForm(document.forms[0]);//設置本次提交表單數據所處的form對象,這里必須設置,不然WMvalidate沒法子幫你進行數據校驗
ac.setUrl(cps+'/userAction.do?action=add');//同上
ac.setTextDiv('textdiv');//同上
ac.setHitDiv('hitDiv');//同上
ac.setIsasy(true);//設置本次提交的操作方式:true 異步方式 false 同步方式
var xmlStr = " <?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+" <root>"
+" <vos id="OaUser"> "
+" <vo> "
+" <userName>測試用戶</userName> "
+" <userAccount>demo</userAccount> "
+" <password>123</password> "
+" <userType>1</userType> "
+" <departmentId>1</departmentId> "
+" <function>insertUser</function>"
+" </vo> "
+" </vos> "
+" </root> ";
ac.setXmlstr(xmlStr);//設置請求數據xml字符串
ac.execute();//同上
}
就這樣簡單的進行設置,就可以完成當前jsp頁面表單數據的提交保存操作,當然這里的設置過于簡單,其實在這里你還可以定義回調函數,操作失敗處理函數,操作成功處理函數,調試跟蹤器等,但在v1.o中這樣的定義僅支持在本次操作為同步提交的模式。即ac.setIsasy(false)。
WMaction.execute()執行后,會先調用WMvalidate進行數據校驗,當然你也可以不進行校驗,那就別設置上面的form參數,不過方式僅支持數據采用第二種提交;WMvalidate校驗通過,則判斷當前用戶使用哪種方式轉載數據;如第一種,則調用WMdataemun對象完成提交數據表單的枚舉類型封裝(在v2.0中這個對象已經被廢棄),即把表單數據轉載在一個js定義的枚舉對象中,以進行統一的xml字符串拼接讀取,這個過程在WMdocobject完成;如用戶采用第二種定義方式,那就不經過上述兩個對象的流轉,直接到WMservice對象中,在WMservice中最終構建XMLHttpRequest對象,并通過send方法把數據發送出去。這里給出個流程圖
至此jsp前臺請求處理過程介紹基本結束,可能整個過程看起來很簡單。確實很簡單,因為WMframework本就是簡單的東西,不過2.0版本相對處理就比這個繁瑣一些,可兼容的東西也多一些,不過對于中小型web運用開發來說,這樣的處理基本上足夠了。先寫到這里吧,下次再繼續,太多了看的人眼花,變成消化不良了不太好。。。
(注:本人文章均為原創,轉載請注明出處!20100616寫于深圳。)
一篇好的文章應該如一壇佳釀,未償已久醉于心;或如一壺好茶,品嘗之間回味無窮;或如與心愛的人共進晚餐,僅餐秀色足以飽食。我不妄想自己的文章能驚世駭俗,但始終期待有“和旋之音,擊缶之伴”。
posted on 2010-07-22 22:40
刀光劍影 閱讀(1139)
評論(0) 編輯 收藏