Flex与Java通信的方式有很多种,比较常用的有以下方式:
WebService:一种跨语言的在线服务,只要用特定语言写好并部署到服务器,其它语言就可以调用
HttpService:通过http请求的形式访问服务器
RmoteObject:通过AMF协议,以二进制的形式交互数据
Socket:套接字协议,服务器和客户端以IO的形式交互数据
上面几种各有个的优势:WebService常用于跨语言调用,不过解析协议需要花不少时间,运行速度不快;HttpService类似于Ajax;通常RmoteObject是最受欢迎的,因为它的运行效率快,数据解析方便。Socket编码稍微麻烦点,这里有一个Socket通信的例子,大家可以学习一下:http://blog.csdn.net/as_leon/article/details/5351713
?
今天针对WebService、HttpService和RmoteObject三种通信分别做一个例子,供大家学习参考。
?
在Flex页面上新建三个文本框和按钮,在文本框中输入内容再点击不同按钮调用不同通信方式,最后将Java返回的数据显示在界面上。首先看下运行效果:

?
【Java端代码】
JDK提供了比较全面的webservice支持,为了简化开发步骤,我使用了Apache CXF框架实现WebService的开发部署。CXF的使用可以参照这里:http://blessht.iteye.com/blog/1105562
?
首先创建一个接口:
?
- package?webservice;??
- ??
- import?javax.jws.WebService;??
- @WebService??
- public?interface?HelloWebservice?{??
- ????public?String?getWebservice(String?name);??
- }??
?然后创建该接口的实现类:
?
@WebService(endpointInterface="webservice.HelloWebservice",serviceName="hellows",portName="hellowsport")??
class?HelloWebserviceImpl?implements?HelloWebservice{??
public?String?getWebservice(String?name)?{??
????????return?"你好["+name+"]这是来自webservice的信息..."+this;??
????}??
}??
?最后创建服务器端启动代码,只要运行main方法即可。当前WebService没有部署在tomcat之类的服务器下,而是通过jetty部署的:
?
import?javax.xml.ws.Endpoint;??
class?WebserviceServer?{??
protected?WebserviceServer()?throws?Exception?{????
??????????
????????System.out.println("Server?Starting...");????
????????HelloWebservice?hello?=?new?HelloWebserviceImpl();???
????????String?address?=?"http://localhost:8888/hellows";??
????????Endpoint.publish(address,?hello);??
//?END?SNIPPET:?publish??
??????
static?void?main(String[]?args)?throws?Exception?{??
//启动web服务??
new?WebserviceServer();??
????????System.out.println("Server?ready...");??
????????Thread.sleep(5?*?60?*?1000);????
????????System.out.println("Server?exiting...");??
????????System.exit(0);??
}??
为了验证WebService是否启动成功,可以在浏览器下放入如下地址:http://localhost:8888/hellows?wsdl,如果部署成功,则浏览器会显示wsdl的xml配置信息。
?
【Flex端代码】
?
<fx:Script>??
- ????????<![CDATA[?
- ???????????????//WebService调用?
- ????????????protected?function?button3_clickHandler(event:MouseEvent):void?
- ????????????{?
- ????????????????var?ws:WebService?=?new?WebService();?
- ????????????????ws.wsdl?=?"http://localhost:8888/hellows?wsdl";?
- ????????????????ws.loadWSDL();?
- ????????????????ws.getWebservice(webservice_txt.text);?
- ????????????????ws.addEventListener(ResultEvent.RESULT,function?callback(e:ResultEvent):void{?
- ????????????????????webservice_result.text?=?e.result.toString()?
- ????????????????});?
- ????????????}?
- ???????????????
- ??????????????]]>??
- </s:Label?x="61"?y="215"?text="WebService:"/>??
- ????s:TextInput?x="152"?y="205"?id="webservice_txt"s:Button?x="289"?y="206"?label="发送"?click="button3_clickHandler(event)"s:Label?x="383"?y="215"?id="webservice_result"/>??
注意,WebService,HttpService和RemoteObject发送请求都是异步的,开发人员需要编写回调函数来获取返回数据。?
最后运行flex,在文本框中输入内容,点击发送按钮就能看到java服务端返回的数据。
?
?
【java代码】
首先创建一个servlet,这里获取key值为"name"的数据(所以Flex端需要发送一个key为"name"的参数),最后通过PrintWriter.write的形式将结果返回给客户端。这是一个典型的Ajax请求响应例子。
class?HelloHttp?extends?HttpServlet?{??
private?final?long?serialVersionUID?=?1L;??
protected?void?doGet(HttpServletRequest?request,?HttpServletResponse?response)?throws?ServletException,?IOException?{??
this.doPost(request,?response);??
void?doPost(HttpServletRequest?request,250); line-height:18px"> ????????String?name?=?request.getParameter("name");??
????????response.setCharacterEncoding("UTF-8");??
????????PrintWriter?pw?=?response.getWriter();??
????????pw.write("你好["+name+"]这是来自Httpservice的消息...当前Session是:"+request.getSession());??
????????pw.close();??
}??
?编写完成后,将java项目部署到服务器中(我使用的是tomcat)。
?
【Flex代码】
Flex端需要创建一个HttpService对象来访问刚才的Servlet:
span?style="white-space:?pre;">????span>????????????//HttpService的形式访问Java服务器?
????????????protected?function?button2_clickHandler(event:MouseEvent):void?
????????????????var?http:HTTPService?=?new?HTTPService();?
????????????????http.url?=?"http://localhost:8080/JavaToFlex/HelloHttp?name="+http_txt.text;?
????????????????http.send();?
????????????????http.addEventListener(ResultEvent.RESULT,147)">????????????????????http_result.text?=?e.result.toString();?
?????????????
????????????]]>??
s:Label?x="61"?y="138"?text="HttpService:"s:TextInput?x="152"?y="128"?id="http_txt"s:Button?x="289"?y="129"?label="发送"?click="button2_clickHandler(event)"s:Label?x="383"?y="138"?id="http_result"/>??
?
?
为了实现Flex调用Java代码,需要引入一个新的插件Blaseds。
把Blaseds项目WEB-INf下的flex文件夹拷贝到Java项目WEB-INF目录下,再将Blaseds项目下lib目录的jar文件引入到java项目中(注意jar文件冲突)。
随后编写一个Java类:
package?blaseds;??
import?flex.messaging.FlexContext;??
class?RemoteClass?{??
public?String?helloRemote(String?name){??
return?"你好["+name+"]这是来自JavaRemote的消息...当前Session是:"+FlexContext.getHttpRequest().getSession();??
}??
?随后在web.xml中添加如下内容(这些配置在Blaseds文件的web.xml中都能找到):
??
listener ????????listener-class>flex.messaging.HttpFlexSession ??????
servletdisplay-name>MessageBrokerServletservlet-nameservlet-class>flex.messaging.MessageBrokerServletinit-param ????????????param-name>services.configuration.fileparam-value>/WEB-INF/flex/services-config.xml ???????load-on-startup>1>RDSDispatchServlet>flex.rds.server.servlet.FrontEndServlet>useAppserverSecurity>false>??????????
>10servlet-mapping?id="RDS_DISPATCH_MAPPING"url-pattern>/CFIDE/main/ide.cfmservlet-mapping>/messagebroker/*>??
?
最后打开Java项目,打开/WEB-INF/flex/remoting-config.xml文件,在文件中添加RemoteClass的远程支持:
service?id="remoting-service"?class="flex.messaging.services.RemotingService"adaptersadapter-definition?id="java-object"??
????????????class="flex.messaging.services.remoting.adapters.JavaAdapter"??
????????????default="true"?default-channelschannel?ref="my-amf"?<!--?定义远程调用的目标名?-->??
destination?id="remoteClass"propertiessource>blaseds.RemoteClassdestinationservice>??
?随后将Java项目部署到服务器中。
?
【Flex端代码】
Flex端为了调用Java代码,需要创建一个RemoteObject实例,属性destination就是在Java端remoting-config.xml文件中定义的<destination id="remoteClass">,这样你可以把RemoteObject当作一个RemoteClass的实例使用。
?
????????????//RemoteObject远程调用Java方法?
????????????protected?function?button1_clickHandler(event:MouseEvent):void?
????????????????var?remote:RemoteObject?=?new?RemoteObject();?
????????????????remote.destination?=?"remoteClass";?
????????????????remote.helloRemote(remote_txt.text);?
????????????????remote.addEventListener(ResultEvent.RESULT,147)">????????????????????remote_result.text?=?e.result.toString();?
????????]]>??
s:Label?x="61"?y="67"?text="RemoteObject:"s:TextInput?x="152"?y="57"?id="remote_txt"s:Button?x="289"?y="58"?label="发送"?click="button1_clickHandler(event)"s:Label?x="383"?y="67"?id="remote_result"/>??