在使用openamf传参到java后台时,有时需要传递大量的参数,那么在前台的时候我们常用的方法是把参数设置给一个对象,通过openamf传到后台转成Map后,我们通过Map的key值去取相应的参数。如下所示例:

varrequest:Object =newObject();

request.coNbr=txtCoNbr.text;

request.servNbr = txtServNbr.text

Java后台在接收到这个参数后去从map中提取这些参数:

publicMap find( Map request)throwsException {

String coNbr = (String)request.get(“coNbr”);

String servNbr = (String)request.get(“servNbr”);

}

而且如果openamf的序列化的force-lower-case-keys参数设置为true时,map在get键值时还需要用小写:

String coNbr = (String)request.get(“conbr”);

这样,给代码的开发维护造成一定的困难,不容易发现其中的错误。特别是在需要传递很多参数时,前台设置和解析这些参数也是麻烦的事,对前台的传递参数前的验证也是不容易去做。

因此考虑使用VO来进行参数传递,VO中的属性包括一个传到后台的参数所需要几个属性,参数名称、参数描述、参数值、动作类型、是否必须等等。

其中的动作类型是预留的,用来表示如果要在后台数据库中查询是执行“=”还是“IN”的操作,是否必须是用来在前台进行验证时需要的。

Flex前台和Java后台设计相同结构的VO,并在openamf-config.xml中配置类型的自动映射。

然后前台和后台分别提供个解析参数的方法,就可以通用了,可以传递所需要的参数。

这样做的好处主要有下面几点:

l统一参数传递的方法

l提供统一的前台参数简单验证

l简化参数传递时的设置

l避免openamf序列化时的大小写问题

下面是具体的设计思路

1.1AS的条件VO对象设计前后台VO对象

1.1.1AS的条件VO对象

提供了条件所需要的几个基本属性,并提供了静态的参数解析方法,前面的常量是需要传递到后台的参数,大小写区分便于理解。传递到Java后台的条件是个VO对象数组(Array),这样java就能直接解析成ArrayList,ArrayList中是经过openamf类映射后的Java VO对象。

代码如下:

packagebss.flex.vo

{

importbss.base.control.AlertFX;

importbss.base.util.StringUtils;

/**

* 查询条件VO

* 用来保存单个查询条件

*

*

*/

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默认设置和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;

}

//验证查询条件

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,"数据验证");

returnfalse;

}

}

returntrue;

}

//解析查询请求条件

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对象

对象结构基本同AS的VO对象,代码如下:

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对象和Java对象的映射

这个需要在openamf-config.xml中添加如下配置:

bss.sa.datastruct.ConditionVO

bss.flex.vo.ConditionVO

1.4提供As参数解析方法

可以为As的VO对象添加一些有用的静态方法,用于解析其中的参数

1.5提供Java参数解析方法

这里是指解析从Flex前台传递来的VO列表对象,代码如下:

//解析前台传来的参数

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简单的前台数据验证

其中的getConditions方法是往Array里添加ConditionVO对象的,前台需要传递的条件。部分代码如下:

//取得查询条件

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);

}

下面这个方法是查询前的数据验证:

privatefunctionqueryHandler(event:*):void{

//确认后调用findBssOrder()方法

if(getConditions().length==0){

AlertFX.confirm("您没有选择任何查询条件,可能会比较慢,要继续查询吗?",closeHandler,"查询条件验证");

}else{

if(ConditionVO.validate(this.getConditions())){

findBssOrder();

}

}

}

1.7示例代码

下图是个示例,查询条件部分有四个条件,只选择了其中的两个:

获取其中参数,并放到列表中,见上面的getConditions()方法

传递参数:

vararyCond:Array =this.getConditions();

varrequest:Object =newObject();

request.conditions = aryCond;//参数列表传递

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里包含了选择的两个条件VO

Java后台参数解析:

ArrayList conditions = (ArrayList)request.get("conditions");

//解析需要的参数

String servNbr = parseCondition(conditions,"servNbr");

String coNbr = parseCondition(conditions,"coNbr");

parseCondition方法见上面第4点说明,解析参数时区分大小写。

1.7小结

参数传递是经常需要面对的问题,如何方便地解析参数便于我们进行前后台的开发,提高开发效果,不要被传递参数搞得头疼。

java vo的使用_使用VO传递参数的设计 | 学步园相关推荐

  1. java 全排列 非递归_全排列(递归与非递归实现) | 学步园

    1.算法简述 简单地说:就是第一个数分别以后面的数进行交换 E.g:E = (a , b , c),则 prem(E)= a.perm(b,c)+ b.perm(a,c)+ c.perm(a,b) 然 ...

  2. java 三维向量类_计算几何,三维向量的旋转 | 学步园

    写这篇日志有两个目的:一来是想测试新装上去的LaTeX插件显示数学公式是否好用(不过貌似通过RSS获取到的日志是没有办法显示的--):二来是对于三维向量绕任意轴的旋转之前我都是用结论的,今天因为做计算 ...

  3. java jni c 指针_通过JNI传递C和Java之间的指针

    通过JNI传递C和Java之间的指针 目前,我正在尝试创build一个使用CUDAfunction的Java应用程序. CUDA和Java之间的连接工作正常,但我有另一个问题,并想问,如果我的想法是正 ...

  4. java包装和引用_回顾值传递和引用传递关于Java是值传递还是引用传递,网上有不一样的说法。1、基本类型或基本类型的包装类以及String是值传递,引用类型是引用传递。2...

    回顾值传递和引用传递 关于Java是值传递还是引用传递,网上有不一样的说法. 1.基本类型或基本类型的包装类以及String是值传递,引用类型是引用传递. 2.Java中只有值传递. 关于这个问题应该 ...

  5. java如何构建图_如何从传递边构建子图?

    我认为你最好的选择可能是使用subgraph()步骤,因为你通常可能提取边缘引发的子图,然后在该子图上执行一些Gremlin来引入可视化边缘并删除你不想要的东西 . 我可以使用TinkerPop打包的 ...

  6. java中对于框架的理解_接触Java项目一周后对一些基本框架的理解 | 学步园

    最近一周接触了一个Java EE的B/S项目,里面用到了SSH,部分持久层用的是ibatis,接触完后觉得有收获,于是把认识到的记录下来.同时欢迎高手拍砖. 现在终于知道所谓的三层框架(视图层,业务逻 ...

  7. java 动态线程池_线程池的参数动态调整

    经典面试题 这次的文章还是绕回了我写的第三篇原创文章<有的线程它死了,于是它变成一道面试题>中留下的几个问题: 哎,兜兜转转,走走停停.天道好轮回,苍天饶过谁? 在这篇文章中我主要回答上面 ...

  8. java构造函数内部调用_具有内部类构造函数参数的Java Reflection奇数

    java构造函数内部调用 关于Java内部类 Java允许成员类(在其他类内定义的类),局部类(在语句块内定义的类)和匿名类(无名称的类): class Outer {Object anonymous ...

  9. php list 传递 assign('list'_,thinkphp5分页传递参数

    按照惯例先描述问题: 需求分析:在后台管理文章的时候添加文章搜索,然后搜索出来的数据如果大,需要分页.这个时候就涉及到带参数分页. 分页类的便捷用法: 1,没有参数的时候直接 paginate 具体用 ...

  10. java post 注册_利用JAVA发送POST请求(垃圾注册就是这么产生的) | 学步园

    大伙都知道利用JAVA的net包的URL类和 URLConnection可以得到网页源代码(这个应该是蜘蛛程序的锥形吧),但是向网页发送数据怎么办呢,GET请求很好处理,直接在网址后面加参数就可以了, ...

最新文章

  1. 【代码片段】如何使用CSS来快速定义多彩光标
  2. 光流数据集FlyingChairs下载连接
  3. mysql空表不导出问题_解决Oracle 11g空表无法导出的问题
  4. File System Filter Driver Tutorial
  5. 试用GitHub Copilot一周后,我给你的建议是:不要使用它
  6. 我的python学习笔记全集_记录我的Python学习笔记
  7. 牛客网与leetcode刷题(高频题中简单or中等的)
  8. 美化UI合约区块链学习版系统+交易大厅
  9. CAsyncSocket使用总结
  10. [Luogu P2893][USACO08FEB]修路Making the Grade
  11. 下载网页中的html5视频之手动方法
  12. 八位抢答器【51单片机】
  13. 高响应比优先调度算法以及其优缺点
  14. 【其他】Hexo博客(Next主题)放弃多说,接入网易云跟贴
  15. FTP服务器文件的批量下载
  16. android 选择相册拍照图片 仿gridview九宫格 recycleview九宫格图片(可拖拽)
  17. 我把跨境电商当副业 ,一周赚了7000块:想给有梦想的人提个醒 !
  18. 大牛deep learning入门教程
  19. 手把手做一个JSP入门程序(一):程序基本介绍(JSP)
  20. 使用vue-seamless-scroll实现滚动,出现空白间隔的问题

热门文章

  1. 如何使用 win10 虚拟桌面
  2. win7查看远程连接了计算机名,win7怎么查看远程连接信息 win7远程连接设置教程...
  3. 某东薅羊毛脚本分析 如何自己薅羊毛
  4. H81主板 安装XP 网卡驱动
  5. Matlab建的模型如何导入MS中,lammps输出的模型如何导入MS中建模
  6. 【opencv】颜色空间总结
  7. openCV专栏(二):基础计算实战+色彩空间转换
  8. PostgreSQL的下载和安装使用步骤
  9. k8s 1.23 及keda 2.7.1 安装测试
  10. php判断是否夏令时,关于php:时区和夏令时问题