Flex通信-Java服务端通信实例
本文转自: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 { // START SNIPPET: publish System.out.println("Server Starting..."); HelloWebservice hello = new HelloWebserviceImpl(); String address = "http://localhost:8888/hellows"; Endpoint.publish(address,hello); // END SNIPPET: publish } public 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() }); } ]]> </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:
<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> <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中都能找到):
<!-- Http Flex Session attribute and binding listener support --> <listener> <listener-class>flex.messaging.HttpFlexSession</listener-class> </listener> <!-- MessageBroker Servlet --> <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"/>? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |