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端不需要进行任何修改