天天看点

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,如需转载请自行联系原作者