瘋狂

          STANDING ON THE SHOULDERS OF GIANTS
          posts - 481, comments - 486, trackbacks - 0, articles - 1
            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          Flex通信-Java服務(wù)端通信實(shí)例

          Posted on 2011-10-09 17:23 瘋狂 閱讀(2441) 評(píng)論(0)  編輯  收藏 所屬分類: flex

          轉(zhuǎn)自:http://blessht.iteye.com/blog/1132934
          Flex與Java通信的方式有很多種,比較常用的有以下方式:

          WebService:一種跨語(yǔ)言的在線服務(wù),只要用特定語(yǔ)言寫好并部署到服務(wù)器,其它語(yǔ)言就可以調(diào)用

          HttpService:通過(guò)http請(qǐng)求的形式訪問服務(wù)器

          RmoteObject:通過(guò)AMF協(xié)議,以二進(jìn)制的形式交互數(shù)據(jù)

          Socket:套接字協(xié)議,服務(wù)器和客戶端以IO的形式交互數(shù)據(jù)

          上面幾種各有個(gè)的優(yōu)勢(shì):WebService常用于跨語(yǔ)言調(diào)用,不過(guò)解析協(xié)議需要花不少時(shí)間,運(yùn)行速度不快;HttpService類似于Ajax;通常RmoteObject是最受歡迎的,因?yàn)樗倪\(yùn)行效率快,數(shù)據(jù)解析方便。Socket編碼稍微麻煩點(diǎn),這里有一個(gè)Socket通信的例子,大家可以學(xué)習(xí)一下:http://blog.csdn.net/as_leon/article/details/5351713

           

          今天針對(duì)WebService、HttpService和RmoteObject三種通信分別做一個(gè)例子,供大家學(xué)習(xí)參考。

           

          在Flex頁(yè)面上新建三個(gè)文本框和按鈕,在文本框中輸入內(nèi)容再點(diǎn)擊不同按鈕調(diào)用不同通信方式,最后將Java返回的數(shù)據(jù)顯示在界面上。首先看下運(yùn)行效果:

           

          • WebService通信

          【Java端代碼】

          JDK提供了比較全面的webservice支持,為了簡(jiǎn)化開發(fā)步驟,我使用了Apache CXF框架實(shí)現(xiàn)WebService的開發(fā)部署。CXF的使用可以參照這里:http://blessht.iteye.com/blog/1105562

           

          首先創(chuàng)建一個(gè)接口:

           

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

           然后創(chuàng)建該接口的實(shí)現(xiàn)類:

           

          Java代碼 復(fù)制代碼 收藏代碼
          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+"]這是來(lái)自webservice的信息..."+this;   
          9.     }   
          10. }  

           最后創(chuàng)建服務(wù)器端啟動(dòng)代碼,只要運(yùn)行main方法即可。當(dāng)前WebService沒有部署在tomcat之類的服務(wù)器下,而是通過(guò)jetty部署的:

           

          Java代碼 復(fù)制代碼 收藏代碼
          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.         //啟動(dòng)web服務(wù)   
          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. }  

          為了驗(yàn)證WebService是否啟動(dòng)成功,可以在瀏覽器下放入如下地址:http://localhost:8888/hellows?wsdl,如果部署成功,則瀏覽器會(huì)顯示wsdl的xml配置信息。

           

          【Flex端代碼】

           

           

          Xml代碼  
          1. <fx:Script>  
          2.         <![CDATA[  
          3.                //WebService調(diào)用  
          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="發(fā)送" click="button3_clickHandler(event)"/>  
          21.     <s:Label x="383" y="215" id="webservice_result"/>  

          注意,WebService,HttpService和RemoteObject發(fā)送請(qǐng)求都是異步的,開發(fā)人員需要編寫回調(diào)函數(shù)來(lái)獲取返回?cái)?shù)據(jù)。 

          最后運(yùn)行flex,在文本框中輸入內(nèi)容,點(diǎn)擊發(fā)送按鈕就能看到j(luò)ava服務(wù)端返回的數(shù)據(jù)。

           

           

           

          • HttpService通信

          【java代碼】

          首先創(chuàng)建一個(gè)servlet,這里獲取key值為"name"的數(shù)據(jù)(所以Flex端需要發(fā)送一個(gè)key為"name"的參數(shù)),最后通過(guò)PrintWriter.write的形式將結(jié)果返回給客戶端。這是一個(gè)典型的Ajax請(qǐng)求響應(yīng)例子。

           

          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+"]這是來(lái)自Httpservice的消息...當(dāng)前Session是:"+request.getSession());   
          13.         pw.close();   
          14.     }   
          15. }  
           編寫完成后,將java項(xiàng)目部署到服務(wù)器中(我使用的是tomcat)。

           

          【Flex代碼】

          Flex端需要?jiǎng)?chuàng)建一個(gè)HttpService對(duì)象來(lái)訪問剛才的Servlet:

           

          Xml代碼  
          1. <SPAN style="WHITE-SPACE: pre"> </SPAN><fx:Script>  
          2.         <![CDATA[  
          3.             //HttpService的形式訪問Java服務(wù)器  
          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="發(fā)送" click="button2_clickHandler(event)"/>  
          20.     <s:Label x="383" y="138" id="http_result"/>  
           

           

           

          • RemoteObject通信

          為了實(shí)現(xiàn)Flex調(diào)用Java代碼,需要引入一個(gè)新的插件Blaseds。

          把Blaseds項(xiàng)目WEB-INf下的flex文件夾拷貝到Java項(xiàng)目WEB-INF目錄下,再將Blaseds項(xiàng)目下lib目錄的jar文件引入到j(luò)ava項(xiàng)目中(注意jar文件沖突)。

          隨后編寫一個(gè)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+"]這是來(lái)自JavaRemote的消息...當(dāng)前Session是:"+FlexContext.getHttpRequest().getSession();   
          8.     }   
          9. }  

           隨后在web.xml中添加如下內(nèi)容(這些配置在Blaseds文件的web.xml中都能找到):

           

          Xml代碼 復(fù)制代碼 收藏代碼
          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項(xiàng)目,打開/WEB-INF/flex/remoting-config.xml文件,在文件中添加RemoteClass的遠(yuǎn)程支持:

           

          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.     <!-- 定義遠(yuǎn)程調(diào)用的目標(biāo)名 -->  
          14.     <destination id="remoteClass">  
          15.         <properties>  
          16.             <source>blaseds.RemoteClass</source>  
          17.         </properties>  
          18.     </destination>  
          19. </service>  

           隨后將Java項(xiàng)目部署到服務(wù)器中。

           

          【Flex端代碼】

          Flex端為了調(diào)用Java代碼,需要?jiǎng)?chuàng)建一個(gè)RemoteObject實(shí)例,屬性destination就是在Java端remoting-config.xml文件中定義的<destination id="remoteClass">,這樣你可以把RemoteObject當(dāng)作一個(gè)RemoteClass的實(shí)例使用。

           

          Xml代碼  
          1. <fx:Script>  
          2.         <![CDATA[  
          3.  
          4.             //RemoteObject遠(yuǎn)程調(diào)用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="發(fā)送" click="button1_clickHandler(event)"/>  
          21.     <s:Label x="383" y="67" id="remote_result"/>  
          主站蜘蛛池模板: 石嘴山市| 伊金霍洛旗| 曲水县| 安义县| 六安市| 崇信县| 广灵县| 思南县| 剑川县| 麻阳| 六安市| 宜都市| 岳阳市| 商水县| 崇仁县| 克什克腾旗| 丰县| 江华| 海宁市| 彭阳县| 泸溪县| 南陵县| 新营市| 双柏县| 杭州市| 娱乐| 江口县| 平乡县| 商河县| 师宗县| 宣武区| 昆山市| 英德市| 丹凤县| 宁武县| 永清县| 建德市| 信阳市| 韶关市| 抚州市| 卫辉市|