zoukankan      html  css  js  c++  java
  • Flex通信-Java服务端通信实例

    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返回的数据显示在界面上。首先看下运行效果:

    • WebService通信

    【Java端代码】

    JDK提供了比较全面的webservice支持,为了简化开发步骤,我使用了Apache CXF框架实现WebService的开发部署。CXF的使用可以参照这里:http://blessht.iteye.com/blog/1105562

    首先创建一个接口:

    Java代码  收藏代码
    1. package webservice;  
    2.   
    3. import javax.jws.WebService;  
    4.   
    5. @WebService  
    6. public interface HelloWebservice {  
    7.     public String getWebservice(String name);  
    8. }  

     然后创建该接口的实现类:

    Java代码  收藏代码
    1. package webservice;  
    2.   
    3. import javax.jws.WebService;  
    4.   
    5. @WebService(endpointInterface="webservice.HelloWebservice",serviceName="hellows",portName="hellowsport")  
    6. public class HelloWebserviceImpl implements HelloWebservice{  
    7.     public String getWebservice(String name) {  
    8.         return "你好["+name+"]这是来自webservice的信息..."+this;  
    9.     }  
    10. }  

     最后创建服务器端启动代码,只要运行main方法即可。当前WebService没有部署在tomcat之类的服务器下,而是通过jetty部署的:

    Java代码  收藏代码
    1. package webservice;  
    2.   
    3. import javax.xml.ws.Endpoint;  
    4.   
    5. public class WebserviceServer {  
    6.     protected WebserviceServer() throws Exception {    
    7.         // START SNIPPET: publish  
    8.         System.out.println("Server Starting...");    
    9.         HelloWebservice hello = new HelloWebserviceImpl();   
    10.         String address = "http://localhost:8888/hellows";  
    11.         Endpoint.publish(address, hello);  
    12.         // END SNIPPET: publish  
    13.     }  
    14.       
    15.     public static void main(String[] args) throws Exception {  
    16.         //启动web服务  
    17.         new WebserviceServer();  
    18.         System.out.println("Server ready...");  
    19.         Thread.sleep(5 * 60 * 1000);    
    20.         System.out.println("Server exiting...");  
    21.         System.exit(0);  
    22.     }  
    23. }  

    为了验证WebService是否启动成功,可以在浏览器下放入如下地址:http://localhost:8888/hellows?wsdl,如果部署成功,则浏览器会显示wsdl的xml配置信息。

    【Flex端代码】

    Xml代码  收藏代码
    1. <fx:Script>  
    2.         <![CDATA[ 
    3.                //WebService调用 
    4.             protected function button3_clickHandler(event:MouseEvent):void 
    5.             { 
    6.                 var ws:WebService = new WebService(); 
    7.                 ws.wsdl = "http://localhost:8888/hellows?wsdl"; 
    8.                 ws.loadWSDL(); 
    9.                 ws.getWebservice(webservice_txt.text); 
    10.                 ws.addEventListener(ResultEvent.RESULT,function callback(e:ResultEvent):void{ 
    11.                     webservice_result.text = e.result.toString() 
    12.                 }); 
    13.             } 
    14.                
    15.               ]]>  
    16. </fx:Script>  
    17.   
    18. <s:Label x="61" y="215" text="WebService:"/>  
    19.     <s:TextInput x="152" y="205" id="webservice_txt"/>  
    20.     <s:Button x="289" y="206" label="发送" click="button3_clickHandler(event)"/>  
    21.     <s:Label x="383" y="215" id="webservice_result"/>  

    注意,WebService,HttpService和RemoteObject发送请求都是异步的,开发人员需要编写回调函数来获取返回数据。 

    最后运行flex,在文本框中输入内容,点击发送按钮就能看到java服务端返回的数据。

    • HttpService通信

    【java代码】

    首先创建一个servlet,这里获取key值为"name"的数据(所以Flex端需要发送一个key为"name"的参数),最后通过PrintWriter.write的形式将结果返回给客户端。这是一个典型的Ajax请求响应例子。

    Java代码  收藏代码
    1. public class HelloHttp extends HttpServlet {  
    2.     private static final long serialVersionUID = 1L;  
    3.       
    4.     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
    5.         this.doPost(request, response);  
    6.     }  
    7.   
    8.     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
    9.         String name = request.getParameter("name");  
    10.         response.setCharacterEncoding("UTF-8");  
    11.         PrintWriter pw = response.getWriter();  
    12.         pw.write("你好["+name+"]这是来自Httpservice的消息...当前Session是:"+request.getSession());  
    13.         pw.close();  
    14.     }  
    15. }  

     编写完成后,将java项目部署到服务器中(我使用的是tomcat)。

    【Flex代码】

    Flex端需要创建一个HttpService对象来访问刚才的Servlet:

    Xml代码  收藏代码
    1. <span style="white-space: pre;">    </span><fx:Script>  
    2.         <![CDATA[ 
    3.             //HttpService的形式访问Java服务器 
    4.             protected function button2_clickHandler(event:MouseEvent):void 
    5.             { 
    6.                 var http:HTTPService = new HTTPService(); 
    7.                 http.url = "http://localhost:8080/JavaToFlex/HelloHttp?name="+http_txt.text; 
    8.                 http.send(); 
    9.                 http.addEventListener(ResultEvent.RESULT,function callback(e:ResultEvent):void{ 
    10.                     http_result.text = e.result.toString(); 
    11.                 }); 
    12.             } 
    13.              
    14.             ]]>  
    15.     </fx:Script>  
    16.   
    17. <span style="white-space: pre;">    </span><s:Label x="61" y="138" text="HttpService:"/>  
    18.     <s:TextInput x="152" y="128" id="http_txt"/>  
    19.     <s:Button x="289" y="129" label="发送" click="button2_clickHandler(event)"/>  
    20.     <s:Label x="383" y="138" id="http_result"/>  
    • RemoteObject通信

    为了实现Flex调用Java代码,需要引入一个新的插件Blaseds。

    把Blaseds项目WEB-INf下的flex文件夹拷贝到Java项目WEB-INF目录下,再将Blaseds项目下lib目录的jar文件引入到java项目中(注意jar文件冲突)。

    随后编写一个Java类:

    Java代码  收藏代码
    1. package blaseds;  
    2.   
    3. import flex.messaging.FlexContext;  
    4.   
    5. public class RemoteClass {  
    6.     public String helloRemote(String name){  
    7.         return "你好["+name+"]这是来自JavaRemote的消息...当前Session是:"+FlexContext.getHttpRequest().getSession();  
    8.     }  
    9. }  

     随后在web.xml中添加如下内容(这些配置在Blaseds文件的web.xml中都能找到):

    Xml代码  收藏代码
    1. <!-- Http Flex Session attribute and binding listener support -->  
    2.     <listener>  
    3.         <listener-class>flex.messaging.HttpFlexSession</listener-class>  
    4.     </listener>  
    5.   
    6.     <!-- MessageBroker Servlet -->  
    7.     <servlet>  
    8.         <display-name>MessageBrokerServlet</display-name>  
    9.         <servlet-name>MessageBrokerServlet</servlet-name>  
    10.         <servlet-class>flex.messaging.MessageBrokerServlet</servlet-class>  
    11.         <init-param>  
    12.             <param-name>services.configuration.file</param-name>  
    13.             <param-value>/WEB-INF/flex/services-config.xml</param-value>  
    14.        </init-param>  
    15.         <load-on-startup>1</load-on-startup>  
    16.     </servlet>  
    17.       
    18.     <servlet>  
    19.         <display-name>RDSDispatchServlet</display-name>  
    20.         <servlet-name>RDSDispatchServlet</servlet-name>  
    21.         <servlet-class>flex.rds.server.servlet.FrontEndServlet</servlet-class>  
    22.         <init-param>  
    23.             <param-name>useAppserverSecurity</param-name>  
    24.             <param-value>false</param-value>  
    25.         </init-param>          
    26.         <load-on-startup>10</load-on-startup>  
    27.     </servlet>  
    28.   
    29.     <servlet-mapping id="RDS_DISPATCH_MAPPING">  
    30.         <servlet-name>RDSDispatchServlet</servlet-name>  
    31.         <url-pattern>/CFIDE/main/ide.cfm</url-pattern>  
    32.     </servlet-mapping>  
    33.       
    34.     <servlet-mapping>  
    35.         <servlet-name>MessageBrokerServlet</servlet-name>  
    36.         <url-pattern>/messagebroker/*</url-pattern>  
    37.     </servlet-mapping>  

    最后打开Java项目,打开/WEB-INF/flex/remoting-config.xml文件,在文件中添加RemoteClass的远程支持:

    Xml代码  收藏代码
    1. <service id="remoting-service" class="flex.messaging.services.RemotingService">  
    2.   
    3.     <adapters>  
    4.         <adapter-definition id="java-object"  
    5.             class="flex.messaging.services.remoting.adapters.JavaAdapter"  
    6.             default="true" />  
    7.     </adapters>  
    8.   
    9.     <default-channels>  
    10.         <channel ref="my-amf" />  
    11.     </default-channels>  
    12.       
    13.     <!-- 定义远程调用的目标名 -->  
    14.     <destination id="remoteClass">  
    15.         <properties>  
    16.             <source>blaseds.RemoteClass</source>  
    17.         </properties>  
    18.     </destination>  
    19. </service>  

     随后将Java项目部署到服务器中。

    【Flex端代码】

    Flex端为了调用Java代码,需要创建一个RemoteObject实例,属性destination就是在Java端remoting-config.xml文件中定义的<destination id="remoteClass">,这样你可以把RemoteObject当作一个RemoteClass的实例使用。

    Xml代码  收藏代码
    1. <fx:Script>  
    2.         <![CDATA[ 
    3.  
    4.             //RemoteObject远程调用Java方法 
    5.             protected function button1_clickHandler(event:MouseEvent):void 
    6.             { 
    7.                 var remote:RemoteObject = new RemoteObject(); 
    8.                 remote.destination = "remoteClass"; 
    9.                 remote.helloRemote(remote_txt.text); 
    10.                 remote.addEventListener(ResultEvent.RESULT,function callback(e:ResultEvent):void{ 
    11.                     remote_result.text = e.result.toString(); 
    12.                 }); 
    13.             } 
    14.              
    15.         ]]>  
    16.     </fx:Script>  
    17.   
    18. <s:Label x="61" y="67" text="RemoteObject:"/>  
    19.     <s:TextInput x="152" y="57" id="remote_txt"/>  
    20.     <s:Button x="289" y="58" label="发送" click="button1_clickHandler(event)"/>  
    21.     <s:Label x="383" y="67" id="remote_result"/>  

    附件分享一下三种通信的实例代码

    jar文件太大所以去掉了,大家可以自己去官网下载相应jar包

  • 相关阅读:
    Excel 之查找与替换
    重拾Excel之为什么
    taobao
    祝我生日快乐
    啊哈哈哈哈!自由啦
    我是不是得了抑郁症?
    Be quiet
    tcpdump tutorial
    Java Thread 多线程同步、锁、通信
    java 堆、栈、常量池等
  • 原文地址:https://www.cnblogs.com/yaowen/p/4191045.html
Copyright © 2011-2022 走看看