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

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。
(完,待续.....................)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值