`

Flex通信-Java服务端通信实例

    博客分类:
  • Flex
 
阅读更多

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

 

首先创建一个接口:

 

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服务端返回的数据。

 

 

  • HttpService通信

【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, 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:

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

 

  • RemoteObject通信

为了实现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"/>
 

 

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

 

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

 

 

  • 大小: 38.5 KB
6
2
分享到:
评论
1 楼 堕神阙 2015-02-05  
你好!看了您的这个篇帖子,帮助很大,方便的话请加我qq:1921959159,有问题向您请教

相关推荐

    flex-hessian-java实例.rar

    "java"目录可能包含了Java服务端的代码,包括接口定义、实现类和服务启动脚本。"web"目录可能包含了部署到Web服务器的WAR文件或相关配置,如Web.xml。"lib"目录则包含了项目中所需的第三方库,如Hessian的JAR文件。 ...

    flex4与Java通信实例

    在Flex中,RemoteObject组件用于与Java服务端的普通类进行通信。首先,我们需要创建一个Java类,例如`SimpleService`,包含一个可供调用的方法,如`sayHello`。然后,在BlazeDS配置文件`remoting-config.xml`中,...

    flex4.0和java后台通信实例

    可能需要在Flex客户端设置断点,同时在Java服务端使用日志记录或IDE的调试功能。 通过这个实例,你可以深入了解Flex与Java之间的交互原理,为后续的RIA开发打下坚实的基础。同时,这也是一种常见的前后端分离开发...

    跟我StepByStep学FLEX教程------王一松

    - **BlazeDS介绍**:BlazeDS是一种用于实现Flex和Java服务器之间通信的服务端组件。 - **通信机制**:探讨BlazeDS与Flex客户端之间的数据交换方式。 #### 21. Flex和Java通信之开发方式和工具准备 - **开发环境...

    最简单的java与flex通信实例与完全步骤总结

    这个最简单的Java与Flex通信实例展示了如何利用AMF协议,通过BlazeDS或GraniteDS进行前后端数据交互。通过这个实例,开发者可以深入理解Flex与Java的通信机制,并在此基础上扩展更复杂的应用场景,如实时数据推送、...

    flex通信之BlazeDS通信实例源码

    Flex通信是Adobe Flex框架中的一项关键技术,用于构建富互联网应用程序(RIA)。BlazeDS是Adobe提供的一个免费服务器端数据服务组件,它允许Flex客户端与Java应用程序进行实时的双向通信。本实例源码主要展示了如何...

    flex如何跟JAVA结合

    - **部署**:发布Flex应用程序到Web服务器,部署Java服务端代码到应用服务器(如Tomcat、Jetty等)。 **4. 示例与最佳实践** 在PPT中,可能会详细展示如何配置BlazeDS或LCDS,设置Flex客户端的AMF通道,以及在Java...

    flex与java的通信 Blazeds remoteObject

    其中,`myJavaMethod`是Java服务端的方法,`resultHandler`是处理返回结果的事件处理器。 5. **数据转换**:Blazeds自动处理AMF到Java对象的转换,使得Flex中的ActionScript对象可以无缝地映射到Java对象。例如,...

    flex+java的socket通信

    Flex 和 Java 分别作为前端显示技术和后端服务端技术的一种选择,它们之间的通信是实现这一架构的关键环节之一。本篇将围绕“Flex + Java 的 Socket 通信”这一主题展开,详细介绍其工作原理、实现方法以及具体的...

    Flex4 与Java通信,自己也在学习中!

    首先,在Flex端定义一个RemoteObject实例,指定服务端的URL和端口,然后映射Java的方法到Flex的方法调用。 2. HTTPService通信:另一种常用的方式是使用HTTPService,它是基于HTTP协议的。HTTPService可以调用...

    Flex和java的socket通信

    ### Flex和Java的Socket通信详解 ...这种技术不仅可以应用于简单的客户端-服务端通信场景,还可以扩展到更复杂的应用场景,如即时通讯系统等。希望本文能够帮助您更好地理解和掌握Flex与Java的Socket通信技术。

    Flex与Java Socket通信

    在Java服务端,我们需要创建一个ServerSocket实例,监听特定端口(例如719)。以下是一个简单的服务端代码示例: ```java import java.net.*; import java.io.*; public class Jserver1 { public static void ...

    Flex_LCDS_Java.rar_flex

    6. **实例演示**:提供一个简单的Flex应用与Java服务端通信的示例,可能包括用户登录、数据查询和更新等功能。 7. **错误处理和调试**:如何处理Flex与Java之间的通信错误,以及在开发过程中使用Flex Builder或IDE...

    flex与 java 通信常见错误

    这表明Flex应用试图通过远程对象调用的Java类`UserManager`无法被实例化,通常有以下几种情况: 1. **类不存在:** `UserManager`类未存在于预期的位置。 2. **类路径问题:** Java类的类路径配置不正确,导致无法...

    flex的socket客户端连接java多线程socket服务端demo

    而在Java服务端,步骤可能包括: 1. 创建`ServerSocket`实例,指定监听的端口。 2. 在循环中使用`ServerSocket.accept()`等待客户端连接,每次连接都会返回一个新的`Socket`对象。 3. 为每个新的`Socket`创建一个新...

    Flex + LCDS + Java 利用Eclipse Plugin开发Flex入门教程

    RemoteObject是Flex与Java服务之间通信的一种方式,它允许你在Flex客户端调用Java服务端的方法。配置RemoteObject,你需要在Flex的services-config.xml文件中定义服务端的端点,然后在ActionScript代码中创建...

Global site tag (gtag.js) - Google Analytics