java vo的使用_使用VO传递参数的设计 | 学步园
在使用openamf傳參到j(luò)ava后臺(tái)時(shí),有時(shí)需要傳遞大量的參數(shù),那么在前臺(tái)的時(shí)候我們常用的方法是把參數(shù)設(shè)置給一個(gè)對(duì)象,通過openamf傳到后臺(tái)轉(zhuǎn)成Map后,我們通過Map的key值去取相應(yīng)的參數(shù)。如下所示例:
varrequest:Object?=newObject();
request.coNbr=txtCoNbr.text;
request.servNbr?=?txtServNbr.text
…
Java后臺(tái)在接收到這個(gè)參數(shù)后去從map中提取這些參數(shù):
publicMap?find(?Map?request)throwsException?{
String?coNbr?=?(String)request.get(“coNbr”);
String?servNbr?=?(String)request.get(“servNbr”);
}
而且如果openamf的序列化的force-lower-case-keys參數(shù)設(shè)置為true時(shí),map在get鍵值時(shí)還需要用小寫:
String coNbr = (String)request.get(“conbr”);
這樣,給代碼的開發(fā)維護(hù)造成一定的困難,不容易發(fā)現(xiàn)其中的錯(cuò)誤。特別是在需要傳遞很多參數(shù)時(shí),前臺(tái)設(shè)置和解析這些參數(shù)也是麻煩的事,對(duì)前臺(tái)的傳遞參數(shù)前的驗(yàn)證也是不容易去做。
因此考慮使用VO來進(jìn)行參數(shù)傳遞,VO中的屬性包括一個(gè)傳到后臺(tái)的參數(shù)所需要幾個(gè)屬性,參數(shù)名稱、參數(shù)描述、參數(shù)值、動(dòng)作類型、是否必須等等。
其中的動(dòng)作類型是預(yù)留的,用來表示如果要在后臺(tái)數(shù)據(jù)庫(kù)中查詢是執(zhí)行“=”還是“IN”的操作,是否必須是用來在前臺(tái)進(jìn)行驗(yàn)證時(shí)需要的。
Flex前臺(tái)和Java后臺(tái)設(shè)計(jì)相同結(jié)構(gòu)的VO,并在openamf-config.xml中配置類型的自動(dòng)映射。
然后前臺(tái)和后臺(tái)分別提供個(gè)解析參數(shù)的方法,就可以通用了,可以傳遞所需要的參數(shù)。
這樣做的好處主要有下面幾點(diǎn):
l統(tǒng)一參數(shù)傳遞的方法
l提供統(tǒng)一的前臺(tái)參數(shù)簡(jiǎn)單驗(yàn)證
l簡(jiǎn)化參數(shù)傳遞時(shí)的設(shè)置
l避免openamf序列化時(shí)的大小寫問題
下面是具體的設(shè)計(jì)思路
1.1AS的條件VO對(duì)象設(shè)計(jì)前后臺(tái)VO對(duì)象
1.1.1AS的條件VO對(duì)象
提供了條件所需要的幾個(gè)基本屬性,并提供了靜態(tài)的參數(shù)解析方法,前面的常量是需要傳遞到后臺(tái)的參數(shù),大小寫區(qū)分便于理解。傳遞到Java后臺(tái)的條件是個(gè)VO對(duì)象數(shù)組(Array),這樣java就能直接解析成ArrayList,ArrayList中是經(jīng)過openamf類映射后的Java VO對(duì)象。
代碼如下:
packagebss.flex.vo
{
importbss.base.control.AlertFX;
importbss.base.util.StringUtils;
/**
*?查詢條件VO
*?用來保存單個(gè)查詢條件
*
*
*/
publicclassConditionVO
{
publicstaticconstPROD_SPEC:String?="prodSpecId";
publicstaticconstORDER_TYPE:String?="orderTypeId";
publicstaticconstCONBR:String?="coNbr";
publicstaticconstACC_NBR:String?="servNbr";
publicstaticconstJOB_SPEC:String?="currentJobSpecId";
publicstaticconstBSS_ORDER_STATE:String?="orderStat";
publicstaticconstAREA:String?="areaId";
publicstaticconstCUST_NAME:String?="custName";
publicstaticconstBIND_NBR:String?="bindNbr";
publicstaticconstCODATE_START:String?="applDateStart";
publicstaticconstCODATE_END:String?="applDateEnd";
privatevar_name:String;
privatevar_desc:String;//屬性描述
privatevar_value:String;
privatevar_action:String?="?=?";//操作符,例如是?=?還是?IN
privatevar_isRequired:Boolean?=true;//是否必須有值
publicfunctionConditionVO()
{
//TODO:?implement?function
}
publicfunctionset?name(value:String):void{
//desc默認(rèn)設(shè)置和name一樣
if(desc?==null){
this._desc?=?value;
}
this._name?=?value;
}
publicfunctionget?name():String{
returnthis._name;
}
publicfunctionset?desc(value:String):void{
this._desc?=?value;
}
publicfunctionget?desc():String{
returnthis._desc;
}
publicfunctionset?value(val:String):void{
this._value?=?val;
}
publicfunctionget?value():String{
returnthis._value;
}
publicfunctionset?action(value:String):void{
this._action?=?value;
}
publicfunctionget?action():String{
returnthis._action;
}
publicfunctionset?isRequired(value:Boolean):void{
this._isRequired?=?value;
}
publicfunctionget?isRequired():Boolean{
returnthis._isRequired;
}
//驗(yàn)證查詢條件
privatestaticfunctionvalidate(aryCond:Array):Boolean{
for(vari:int=0;i
varitem:ConditionVO?=?aryCond[i]?as?ConditionVO;
if(item.isRequired?&&?StringUtils.isEmpty(item.value)){
AlertFX.error(item.desc+"必須選擇或輸入值!",null,"數(shù)據(jù)驗(yàn)證");
returnfalse;
}
}
returntrue;
}
//解析查詢請(qǐng)求條件
publicstaticfunctionparseRequest(ary:Array):Object{
varrequest:Object?=newObject();
if(ary!=null){
for(vari:int=?0;i
varitem:ConditionVO?=?ary[i]?as?ConditionVO;
request[item.name]?=?item.value;
}
}
returnrequest;
}
//從查詢列表中搜索指定的條件并返回
publicstaticfunctionsearchConditionValue(ary:Array,name:String):String{
if(ary!=null){
for(vari:int=?0;i
varitem:ConditionVO?=?ary[i]?as?ConditionVO;
if(item.name?==?name){
returnitem.value;
}
}
}
returnnull;
}
//詳情輸出
publicfunctiontoString():String{
returnthis._name?+"?=?"+this._value+
"/n?desc?=?"+_desc+
"/n?isRequired?=?"+_isRequired+
"/n?action?=?"+this._action;
}
}
}
1.1.2Java的條件VO對(duì)象
對(duì)象結(jié)構(gòu)基本同AS的VO對(duì)象,代碼如下:
packagebss.sa.datastruct;
importjava.io.Serializable;
publicclassConditionVOimplementsSerializable?{
/**
*
*/
privatestaticfinallongserialVersionUID?=?1L;
privateString?name;
privateString?desc;
privateString?value;
privateString?action;
privatebooleanisRequired;
publicConditionVO()?{
}
publicString?getAction()?{
returnaction;
}
publicvoidsetAction(String?action)?{
this.action?=?action;
}
publicString?getDesc()?{
returndesc;
}
publicvoidsetDesc(String?desc)?{
this.desc?=?desc;
}
publicbooleangetIsRequired()?{
returnisRequired;
}
publicvoidsetIsRequired(booleanisRequired)?{
this.isRequired?=?isRequired;
}
publicString?getName()?{
returnname;
}
publicvoidsetName(String?name)?{
this.name?=?name;
}
publicString?getValue()?{
returnvalue;
}
publicvoidsetValue(String?value)?{
this.value?=?value;
}
publicString?toString(){
returngetName()+"="+getValue()+","+
"desc="+getDesc()+","+
"action="+getAction()+","+
"isRequired="+getIsRequired()+"/n";
}
}
1.3配置AS對(duì)象和Java對(duì)象的映射
這個(gè)需要在openamf-config.xml中添加如下配置:
bss.sa.datastruct.ConditionVO
bss.flex.vo.ConditionVO
1.4提供As參數(shù)解析方法
可以為As的VO對(duì)象添加一些有用的靜態(tài)方法,用于解析其中的參數(shù)
1.5提供Java參數(shù)解析方法
這里是指解析從Flex前臺(tái)傳遞來的VO列表對(duì)象,代碼如下:
//解析前臺(tái)傳來的參數(shù)
publicString?parseCondition(ArrayList?ary,String?condName){
if(ary!=null){
for(inti=0;i
ConditionVO?vo?=?(ConditionVO)ary.get(i);
if(vo.getName().equals(condName)){
returnvo.getValue();
}
}
}
returnnull;
}
1.6簡(jiǎn)單的前臺(tái)數(shù)據(jù)驗(yàn)證
其中的getConditions方法是往Array里添加ConditionVO對(duì)象的,前臺(tái)需要傳遞的條件。部分代碼如下:
//取得查詢條件
privatefunctiongetConditions():Array{
varconditionList:Array?=newArray();
if(chkProdSpec.selected){
varitem:ConditionVO?=newConditionVO();
item.name?=?ConditionVO.PROD_SPEC;
item.value?=?prodSpec.value;
conditionList.push(item);//往列表里添加條件VO
}
if(chkOrderType.selected){
varitem:ConditionVO?=newConditionVO();
item.name?=?ConditionVO.ORDER_TYPE;
item.value?=?orderType.value;
conditionList.push(item);
}
…
下面這個(gè)方法是查詢前的數(shù)據(jù)驗(yàn)證:
privatefunctionqueryHandler(event:*):void{
//確認(rèn)后調(diào)用findBssOrder()方法
if(getConditions().length==0){
AlertFX.confirm("您沒有選擇任何查詢條件,可能會(huì)比較慢,要繼續(xù)查詢嗎?",closeHandler,"查詢條件驗(yàn)證");
}else{
if(ConditionVO.validate(this.getConditions())){
findBssOrder();
}
}
}
1.7示例代碼
下圖是個(gè)示例,查詢條件部分有四個(gè)條件,只選擇了其中的兩個(gè):
獲取其中參數(shù),并放到列表中,見上面的getConditions()方法
傳遞參數(shù):
vararyCond:Array?=this.getConditions();
varrequest:Object?=newObject();
request.conditions?=?aryCond;//參數(shù)列表傳遞
logger.debugMore("request",request);
看下打印的日志:
[ 2008/11/25 09:43:35- debug ] request
(Object)#0
conditions = (Array)#1
[0] (bss.flex.vo::ConditionVO)#2
action = " = "
desc = "prodSpecId"
isRequired = true
name = "prodSpecId"
value = "2"
pageno = 10
pagenum = 1
[ 2008/11/25 09:45:12- debug ] request
(Object)#0
conditions = (Array)#1
[0] (bss.flex.vo::ConditionVO)#2
action = " = "
desc = "prodSpecId"
isRequired = true
name = "prodSpecId"
value = "2"
[1] (bss.flex.vo::ConditionVO)#3
action = " = "
desc = "coNbr"
isRequired = true
name = "coNbr"
value = "82200711127777777777"
pageno = 10
pagenum = 1
可以看到conditions里包含了選擇的兩個(gè)條件VO
Java后臺(tái)參數(shù)解析:
ArrayList conditions = (ArrayList)request.get("conditions");
//解析需要的參數(shù)
String servNbr = parseCondition(conditions,"servNbr");
String coNbr = parseCondition(conditions,"coNbr");
parseCondition方法見上面第4點(diǎn)說明,解析參數(shù)時(shí)區(qū)分大小寫。
1.7小結(jié)
參數(shù)傳遞是經(jīng)常需要面對(duì)的問題,如何方便地解析參數(shù)便于我們進(jìn)行前后臺(tái)的開發(fā),提高開發(fā)效果,不要被傳遞參數(shù)搞得頭疼。
總結(jié)
以上是生活随笔為你收集整理的java vo的使用_使用VO传递参数的设计 | 学步园的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 物联网技术(基本概述说明)
- 下一篇: 开源ERP Tryton 的用户权限管理