struts2 的参数形式为 objectName.propertyName ,如果要结合httpService, 所有的参数都要自己处理过,所有才想写成一个过滤器,将参数处理过程交给过滤器去处理,将这块封装起来,对外的感觉是操作普通的object一样。
JSONSerialzationFilter.as
package com.zmsoft.main.util
{
import com.adobe.serialization.json.JSON;
import flash.utils.describeType;
import flash.utils.getQualifiedClassName;
import mx.core.mx_internal;
import mx.rpc.http.AbstractOperation;
import mx.rpc.http.SerializationFilter;
use namespace mx_internal;
/**
* json过滤器
* @author dcross
*/
public class JSONSerialzationFilter extends SerializationFilter
{
// replaces/returns previous with that name or null
static mx_internal var filterForResultFormatTable:Object=new Object();
/**
*
* @param resultFormat
* @param filter
* @return
*/
public static function registerFilterForResultFormat(resultFormat:String, filter:JSONSerialzationFilter):JSONSerialzationFilter
{
var old:JSONSerialzationFilter=filterForResultFormatTable[resultFormat];
filterForResultFormatTable[resultFormat]=filter;
return old;
}
/**
* 返回数据过滤
* @param operation
* @param result
* @return
*/
override public function deserializeResult(operation:AbstractOperation, result:Object):Object
{
if (result != null && result != "")
{
var resultData:String=String(result);
var resultObj:Object=JSON.decode(resultData);
return resultObj;
}
else
{
return result;
}
}
/**
*
* @param operation
* @param obj
* @param contentType
* @return
*/
override public function getRequestContentType(operation:AbstractOperation, obj:Object, contentType:String):String
{
return contentType;
}
/**
* 参数过滤
* @param operation
* @param params
* @return
* @throws ArgumentError
*/
override public function serializeParameters(operation:AbstractOperation, params:Array):Object
{
var argNames:Array=operation.argumentNames;
if (params == null || params.length == 0)
return params;
if (argNames == null || params.length != argNames.length)
throw new ArgumentError("HTTPMultiService operation called with " + (argNames == null ? 0 : argNames.length) + " argumentNames and " + params.length + " number of parameters. When argumentNames is specified, it must match the number of arguments passed to the invocation");
var obj:Object=new Object();
for (var i:int=0; i < params.length; i++)
{
var className:String=getQualifiedClassName(params[i]);
if (className.substr(0, 15) == "com.zmsoft.main")
{ //如果传的是自己定义的类对象
var simpleName:String=className.split("::")[1];
var strtus2Name:String=simpleName.substr(0, 1).toLowerCase() + simpleName.substr(1);
var xml:XML=describeType(params[i]);
for (var j:int=0; j < xml.child("variable").length(); j++)
{
var name:String=xml.child("variable")[j].@name;
if (params[i][name] != null)
{
obj[strtus2Name + "." + name]=params[i][name];
}
}
}
else
{
obj[argNames[i]]=params[i];
}
}
return obj;
}
/**
*
* @param operation
* @param obj
* @return
*/
override public function serializeBody(operation:AbstractOperation, obj:Object):Object
{
return obj;
}
/**
*
* @param operation
* @param obj
* @param url
* @return
*/
override public function serializeURL(operation:AbstractOperation, obj:Object, url:String):String
{
return url;
}
}
}
修改服务类:_Super_XXXXService.as
替换原来的 JSONSerialzationFilter 为自己定义的 JSONSerialzationFilter
private static var serializer0:JSONSerialzationFilter = new JSONSerialzationFilter();
operation = new Operation(null, "save");
operation.url = "save.action";
operation.method = "POST";
argsArray = new Array("book");
operation.argumentNames = argsArray;
operation.serializationFilter = serializer0;
operation.contentType = "application/x-www-form-urlencoded";
operation.resultType = Object;
operations.push(operation);
如果要执行一个保存方法:
var book:Book=new Book(); book.name=nameInput.text; book.memo=memoInput.text; saveResult.token=bookService.save(book);
struts2端不需要进行任何修改
本文介绍了一种Struts2与Flash应用整合的方法,通过自定义JSONSerialzationFilter来处理参数转换,实现了从Struts2端到Flash端的数据交互。此方案无需对Struts2做额外改动。
126

被折叠的 条评论
为什么被折叠?



