转自:http://blessht.iteye.com/blog/1132934
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); ??
- }??
?然后创建该接口的实现类:
?
-
package?webservice; ??
- ??
-
import?javax.jws.WebService; ??
- ??
-
@WebService(endpointInterface="webservice.HelloWebservice",serviceName="hellows",portName="hellowsport") ??
-
public?class?HelloWebserviceImpl?implements?HelloWebservice{ ??
- ????public?String?getWebservice(String?name)?{ ??
- ????????return?"你好["+name+"]这是来自webservice的信息..."+this; ??
- ????} ??
- }??
?最后创建服务器端启动代码,只要运行main方法即可。当前WebService没有部署在tomcat之类的服务器下,而是通过jetty部署的:
?
-
package?webservice; ??
- ??
-
import?javax.xml.ws.Endpoint; ??
- ??
-
public?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); ??
- ??????????
- ????} ??
- ???? ??
- ????public?static?void?main(String[]?args)?throws?Exception?{ ??
- ??????????
- ????????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()??
-
????????????????});??
-
????????????}??
-
????????????????
-
??????????????]]>??
-
</fx:Script>??
- ??
-
<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请求响应例子。
?
-
public?class?HelloHttp?extends?HttpServlet?{ ??
- ????private?static?final?long?serialVersionUID?=?1L; ??
- ???? ??
- ????protected?void?doGet(HttpServletRequest?request,?HttpServletResponse?response)?throws?ServletException,?IOException?{ ??
- ????????this.doPost(request,?response); ??
- ????} ??
- ??
- ????protected?void?doPost(HttpServletRequest?request,?IOException?{ ??
- ????????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><fx:Script>??
- ????????<![CDATA[??
-
????????????//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,function?callback(e:ResultEvent):void{??
-
????????????????????http_result.text?=?e.result.toString();??
-
????????????????});??
-
????????????}??
-
??????????????
-
????????????]]>??
- ????</fx:Script>??
- ??
-
<SPAN?style="WHITE-SPACE:?pre">?</SPAN><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; ??
- ??
-
public?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</listener-class>??
- ????</listener>??
- ??
- ??????
- ????<servlet>??
- ????????<display-name>MessageBrokerServlet</display-name>??
- ????????<servlet-name>MessageBrokerServlet</servlet-name>??
- ????????<servlet-class>flex.messaging.MessageBrokerServlet</servlet-class>??
- ????????<init-param>??
- ????????????<param-name>services.configuration.file</param-name>??
- ????????????<param-value>/WEB-INF/flex/services-config.xml</param-value>??
- ???????</init-param>??
- ????????<load-on-startup>1</load-on-startup>??
- ????</servlet>??
- ???? ??
- ????<servlet>??
- ????????<display-name>RDSDispatchServlet</display-name>??
- ????????<servlet-name>RDSDispatchServlet</servlet-name>??
- ????????<servlet-class>flex.rds.server.servlet.FrontEndServlet</servlet-class>??
- ????????<init-param>??
- ????????????<param-name>useAppserverSecurity</param-name>??
- ????????????<param-value>false</param-value>??
- ????????</init-param>???????? ??
- ????????<load-on-startup>10</load-on-startup>??
- ????</servlet>??
- ??
- ????<servlet-mapping?id="RDS_DISPATCH_MAPPING">??
- ????????<servlet-name>RDSDispatchServlet</servlet-name>??
- ????????<url-pattern>/CFIDE/main/ide.cfm</url-pattern>??
- ????</servlet-mapping>??
- ???? ??
- ????<servlet-mapping>??
- ????????<servlet-name>MessageBrokerServlet</servlet-name>??
- ????????<url-pattern>/messagebroker/*</url-pattern>??
- ????</servlet-mapping>??
?
最后打开Java项目,打开/WEB-INF/flex/remoting-config.xml文件,在文件中添加RemoteClass的远程支持:
?
-
<service?id="remoting-service"?class="flex.messaging.services.RemotingService">??
- ??
- ????<adapters>??
- ????????<adapter-definition?id="java-object"??
- ????????????class="flex.messaging.services.remoting.adapters.JavaAdapter"??
- ????????????default="true"?/>??
- ????</adapters>??
- ??
- ????<default-channels>??
- ????????<channel?ref="my-amf"?/>??
- ????</default-channels>??
- ???? ??
- ??????
- ????<destination?id="remoteClass">??
- ????????<properties>??
- ????????????<source>blaseds.RemoteClass</source>??
- ????????</properties>??
- ????</destination>??
-
</service>??
?随后将Java项目部署到服务器中。
?
【Flex端代码】
Flex端为了调用Java代码,需要创建一个RemoteObject实例,属性destination就是在Java端remoting-config.xml文件中定义的<destination id="remoteClass">,这样你可以把RemoteObject当作一个RemoteClass的实例使用。
?
-
<fx:Script>??
- ????????<![CDATA[??
- ?
-
????????????//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,function?callback(e:ResultEvent):void{??
-
????????????????????remote_result.text?=?e.result.toString();??
-
????????????????});??
-
????????????}??
-
??????????????
-
????????]]>??
- ????</fx:Script>??
- ??
-
<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"/>