天天看點

Flex通信-Java服務端通信執行個體

Flex與Java通信的方式有很多種,比較常用的有以下方式:

WebService:一種跨語言的線上服務,隻要用特定語言寫好并部署到伺服器,其它語言就可以調用

HttpService:通過http請求的形式通路伺服器

RmoteObject:通過AMF協定,以二進制的形式互動資料

Socket:套接字協定,伺服器和用戶端以IO的形式互動資料

今天針對WebService、HttpService和RmoteObject三種通信分别做一個例子,供大家學習參考。

在Flex頁面上建立三個文本框和按鈕,在文本框中輸入内容再點選不同按鈕調用不同通信方式,最後将Java傳回的資料顯示在界面上。首先看下運作效果:

Flex通信-Java服務端通信執行個體

WebService通信

【Java端代碼】

首先建立一個接口:

Flex通信-Java服務端通信執行個體

package webservice;  

import javax.jws.WebService;  

@WebService  

public interface HelloWebservice {  

    public String getWebservice(String name);  

}  

 然後建立該接口的實作類:

Flex通信-Java服務端通信執行個體

@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部署的:

Flex通信-Java服務端通信執行個體

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端代碼】

Flex通信-Java服務端通信執行個體

<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服務端傳回的資料。

HttpService通信

【java代碼】

首先建立一個servlet,這裡擷取key值為"name"的資料(是以Flex端需要發送一個key為"name"的參數),最後通過PrintWriter.write的形式将結果傳回給用戶端。這是一個典型的Ajax請求響應例子。

Flex通信-Java服務端通信執行個體

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, HttpServletResponse response) throws ServletException, 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:

Flex通信-Java服務端通信執行個體

<span style="white-space: pre;">    </span><fx:Script>  

            //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"/>  

RemoteObject通信

為了實作Flex調用Java代碼,需要引入一個新的插件Blaseds。

把Blaseds項目WEB-INf下的flex檔案夾拷貝到Java項目WEB-INF目錄下,再将Blaseds項目下lib目錄的jar檔案引入到java項目中(注意jar檔案沖突)。

随後編寫一個Java類:

Flex通信-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中都能找到):

Flex通信-Java服務端通信執行個體

<!-- 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>  

        <display-name>RDSDispatchServlet</display-name>  

        <servlet-name>RDSDispatchServlet</servlet-name>  

        <servlet-class>flex.rds.server.servlet.FrontEndServlet</servlet-class>  

            <param-name>useAppserverSecurity</param-name>  

            <param-value>false</param-value>  

        </init-param>          

        <load-on-startup>10</load-on-startup>  

    <servlet-mapping id="RDS_DISPATCH_MAPPING">  

        <url-pattern>/CFIDE/main/ide.cfm</url-pattern>  

    </servlet-mapping>  

    <servlet-mapping>  

        <url-pattern>/messagebroker/*</url-pattern>  

最後打開Java項目,打開/WEB-INF/flex/remoting-config.xml檔案,在檔案中添加RemoteClass的遠端支援:

Flex通信-Java服務端通信執行個體

<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端為了調用Java代碼,需要建立一個RemoteObject執行個體,屬性destination就是在Java端remoting-config.xml檔案中定義的<destination id="remoteClass">,這樣你可以把RemoteObject當作一個RemoteClass的執行個體使用。

Flex通信-Java服務端通信執行個體

            //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(); 

        ]]>  

<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"/>  

附件分享一下三種通信的執行個體代碼

jar檔案太大是以去掉了,大家可以自己去官網下載下傳相應jar包

本文轉自農夫山泉别墅部落格園部落格,原文連結:http://www.cnblogs.com/yaowen/p/4191045.html,如需轉載請自行聯系原作者