您的位置:首页 > 理论基础 > 计算机网络

Flex HTTPService初探(Flex跟JAVA等后台沟通的桥梁)

2012-04-18 09:07 405 查看
1.Flex HTTPService概念

它是Flex跟JAVA等后台沟通的桥梁的一种方式,这种方式在考勤以及智慧路灯都用得比较广泛,它能够很好的跟*.do,*.action方式的请求联系起来,可以将flex的参数传递给服务器端(JAVA部分),也可以从服务器端返回数据给Flex前端。当前Flex跟JAVA等服务器通信有好多种方式,比如remoteObject,RESTFULL等,在这里主要是HTTPService,下面我以例子讲解它的用法。

2.Flex HTTPSerivce两种方式

2.1标签方式(即静态方式) ,如下所示:

<mx:HTTPService id="ButtonOperate_Authority"

url="/sems/buttonItem.do?action=init" method= " POST "

result="button_operate_authority_resultHandler(event)"/>

它申明的地方在<fx: Declarations>< /fx: Declarations>之间。

然后在调用它的地方,使用 ButtonOperate_Authority.send()就可以将这个请求发送到服务器端,也可以将变量值传给服务器端,

比如ButtonOperate_Authority.send(AmmeterDTO).即将AmmeterDTO变量的值传送给服务器端。

2.2 通过类定义的方式(动态方式,比活灵活,但实现起来没标签那么简洁),如下所示:

var ammeter_query:HTTPService =new HTTPService();

ammeter_query.url = "/sems/ammeter.do";

ammeter_query.method = " POST" ;

ammeter_query.resultFormat="e4x";

//设置参数

var paramsHolder:URLVariables = new URLVariables();

paramsHolder.action="query";

paramsHolder.concentUID=concentUID;

//添加响应回调函数

ammeter_query.addEventListener(ResultEvent.RESULT, ammeter_query_resultHandler);

ammeter_query.addEventListener(FaultEvent.FAULT, ammeter_query_faultHandler);

//发送无参数请求给服务器

ammeter_query.send(paramsHolder);

这种方式可以传递多个变量值,类似**/*.do?action=query&concentUID=concentUID将两个变量传送给服务器端。而URLVariables类则用于封装这两个变量。

3.结果响应函数

public function ammeter_query_resultHandler(event:ResultEvent):void{

//得到电表XML字符串

var dataXML:XML = event.result as XML;

trace(dataXML.toString());

var ammeteritemNodeList:XMLList=dataXML.descendants("ammeteritem");

//获取它的后代所有节点

//遍历它的后代列表

for each (var node:XML in ammeteritemNodeList){

//trace("node.@uid:==========>"+node.@uid);

UID.text = node.@uid;

nodeName.text = node.@name;

mutualInductor.text =node.@ratio;

locationDesc.text = node.@address;

remark.text = node.@remark;

ammeterType.selectedIndex = node.@type;

}

}

注意到:
ammeter_query.resultFormat="e4x";这个赋值,它表示服务器返回的变量类型是XML类型的,所以我们看到它的响应函数用XML变量进行接收,否则不用的话,就会报错或得不到正确的结果。

4.错误响应函数

//查询出现异常的处理结果

function ammeter_query_faultHandler(event:FaultEvent):void

{

trace("ammeter_query_faultHandler:"+event.fault.toString())

}

我们可以看到它的错误类型和原因,如果是后台代码出现问题,我们还要去调试后台代码。下面写一小段后台代码供参考。如下。

5.后台片段代码

/**

* 执行查询电表方法,根据集中器ID,查询成功后往日志表填写正常日志信息,查询失败则写失败日志信息到日志表。

* @param response:当前请求的HttpServletResponse

* @throws Exception 执行异常

*/

@RequestMapping(params ="action=query", method = {RequestMethod.POST,RequestMethod.GET})

public void queryAllAmmeterDevices(HttpServletResponse response, String concentUID) throws Exception {

//根据Concentrator ID号查询,查询出XML字符串

String ammeterStringText = "";

//当前用户信息

UserDetails userDetails = (UserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal();

//日志信息服务DTO

OperationLogInfoDTO logDto = new OperationLogInfoDTO();

logDto.setCreateBy(userDetails.getUsername());

logDto.setCreateDate(new Date((new java.util.Date()).getTime()));

try {

//临时转换成Long整型

Long tempContentUID = (long) Double.parseDouble(concentUID);

//查询电表列表

ammeterStringText = ammeterService.queryAmmeterDataByConcentratorId(tempContentUID); //tempContentUID

//设置日志

logDto.setInfoMsg("查询成功查询"+concentUID+"集中器下的电表!");

logDto.setInfoLevel(SemsConstants.LOG_INFO_LEVEL_NORMAL);

logInfoService.addLogInfo(logDto);

} catch (Exception e) {

logDto.setInfoMsg("查询成功查询"+concentUID+"集中器下的电表失败!");

logDto.setInfoLevel(SemsConstants.LOG_INFO_LEVEL_EMERGENCY);

logInfoService.addLogInfo(logDto);

}

response.setCharacterEncoding("utf-8");

//解决中文乱码问题

response.getWriter().write(ammeterStringText);

//输出给前台使用

}

后台代码不是这部分讲的重点,后台代码比较复杂,迁移到多层之间的调用关系。 response可以将XML写至客户端Flex。

(完,待续.....................)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: