视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
基于Flex三种通讯方式的Java配置与整合
2025-10-02 04:38:29 责编:小OO
文档
基于Flex三种通讯方式的Java配置与整合

2013年8月13日

一、前言

在项目开发过程中,很多时候需要给第三方提供一些接口来处理项目中的一下数据,然而在使用flex的AMF通信方式来配置我们的java web project的时候,我们就无法来处理这样的需求,所以这个时候我们可以合理的引入httpservice通讯方式和webservice通讯方式来弥补java服务端这一缺陷。

下面我们提一下flex三种通讯方式:

通讯方式通信协议数据交互格式

优点缺点
HttpService常用的http协议XML数据格式通用,便于不同应用系统间交换数据1.数据在发送前需要转换成XML格式,接收后要解析XML数据。哪怕是只发送一个简单的的数字也要如此

2.在处理复杂数据类型如图片,对象的时候,非常不方便

WebServiceSOAP协议XML同上同上
RemoteObjectFlex自定义的高效二进制

数据通讯协议:AMF

任意(可以是数字,字符串,对象,图片等等)能够处理各种类型的数据类型,速度快需要专门的服务器端软件LCDS(FDS)或AmfPHP。LCDS(FDS)是收费的,价格不菲。

其中也可使用免费版本(blazeds),但是有。

(#)这里简单说明一下LCDS与blanzeds的区别。BlazeDS可以看成是LCDS的一个子集,而且是一个开源产品,在一般的项目中完全可以替代LCDS。

(抱歉,adobe官方的图片找不到了,所以找了张有水印的)

√ 代表此功能可用
FeaturesBlazeDSLCDS
Data management Services
Client-Server synchronization
Conflict resolution
Data paging
SQL adapter
Hibernate adapter
Document Services
LiveCycle remoting
RIA-to-PDF conversion
Enterprise-Class Flex application services
Data access/remoting
Proxy service
Automated testing support
Software clustering
Web tier compiler
Enterprise Integration
WSRP generation
Ajax data services
Flex-Ajax bridge
Runtime configuration
Open adapter architecture
JMS adapter
Server-side component framework integration
ColdFusion integration
Offline Application Support
Offline data cache
Local message queuing
Real - Time Data
Publish and Subscribe messaging
Real -time data quality of service
RTMP tunneling
FeaturesBlazeDSLiveCycle Data Services ES2
RPC services
Java remoting/Action Message Format (AMF)YesYes
Ajax client libraries to Java™ remotingYesYes
WS/JSON proxy serviceYesYes
Messaging
Servlet-based messaging services (hundreds of clients per CPU)YesYes
Java NIO high-performance messaging (thousands of clients per CPU)NoYes
Real Time Messaging Protocol (RTMP)NoYes
Data throttlingNoYes
Reliable communicationsNoYes
Data management
Transaction (batch processing)NoYes
Data pagingNoYes
Lazy loading (on demand)NoYes
Conflict resolution and synchronizationNoYes
SQL adapterNoYes
Hibernate adapterNoYes
"Fiber-aware" assemblerNoYes
Offline web applicationsNoYes
Development and deployment
Spring integration supportYesYes
Adobe Flash® Builder™ modeling plug-in

NoYes
Enterprise supportNoYes
RIA PDF generationNoYes
WSRP portal integrationNoYes
Load/stress testing toolNoYes
Edge serverNoYes
Enterprise support plansNoYes
这份是adobe公司给的对比

二、基础信息准备

基础准备,在这里我们使用的IDE是myeclipse10.7.1(因为在使用jar包的时候使用的是myeclipse自带包)。

JDK使用的是1.6.0.45

基本配置与框架使用

web层:

1)spring-flex 1.0.3(AMF)

2)struts 2.3.15.1(httpservice)

3)cxf 2.7.6(webservice)

service层: 

1)spring 3.1 [使用myeclipse自带]

DAO层:

1)hibernate 3.3 [使用myeclipse自带]

下载jar包

1.spring-flex 1.0.3(AMF)

http://www.springsource.org/download/community

这里我们使用的是1.0.3这个版本。

2.blazeds(AMF)

adobe blazeds-bin-4.0.0.14931.zip

https://www.adobe.com/cfusion/entitlement/index.cfm?e=lc_blazeds

登录,下载blazeds,最新版本为4.0.0.14931。

3.backport-util-concurrent 3.1(AMF)

http://sourceforge.net/projects/backport-jsr166/files/backport-jsr166/3.1/

这个在下载时请注意版本,这里下载backport-util-concurrent-Java60-3.1.zip,这个为jdk1.6下的jar文件。

4.struts-2.3.15.1(httpservice)

http://struts.apache.org/download.cgi#struts2315

配置过SSH的程序员都知道,在eclipse中使用软件自带的struts时,在项目中展现的形式是这样的形式,而不能直接加入到WEB-INF/lib文件夹下面。

5.cxf 2.7.6(webservice)

http://cxf.apache.org/download.html

这里使用cxf框架来对webservice中spring的整合。

三、具体配置方案与测试

1.第一步我们先来配置SH(spring + hibernate)

1)创建java web project

2)增加spring支持

点击Next > 按钮下一步

Finish

3)增加hibernate支持

点击Next > 按钮 下一步

点击Next > 按钮下一步

点击Next > 按钮下一步

这里配置数据库连接信息,点击Next > 按钮进入下一个步骤

Finish 完成hibernate的配置

4)配置项目中的web.xml文件,使其支持spring、hibernate服务。

    spring

    org.springframework.web.context.ContextLoaderListener

    contextConfigLocation

    classpath:applicationContext.xml

    hibernateFilter

    org.springframework.orm.hibernate3.support.OpenSessionInViewFilter

    

        singleSession

        true

    

    

        flushMode

        AUTO 

    

    hibernateFilter

    /*

5)配置applicationContext.xml文件,增加spring事务管理功能

    

    

                value="jdbc:sqlserver://{ip}:{port};databaseName={dbname}">

    

    

    

    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

    

        

    

    

        

            

                org.hibernate.dialect.SQLServerDialect

            

        

    

    class="org.springframework.orm.hibernate3.HibernateTransactionManager">

    

    class="org.springframework.transaction.interceptor.TransactionInterceptor">

    

    

        

            PROPAGATION_REQUIRED

            PROPAGATION_REQUIRED,readOnly

            PROPAGATION_REQUIRED,readOnly

            PROPAGATION_REQUIRED,readOnly

            PROPAGATION_REQUIRED

            PROPAGATION_REQUIRED

            PROPAGATION_REQUIRED

        

    

    class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">

    

        

            *Service

        

    

    

        

            

        

    

配置spring通过service层来管理数据库事务。其中,dataSource和sessionFactory由eclipse自动产生。

6)测试spring、hibernate配置是否成功

a)在数据库中新建表Person,包含id(int自增)、name(varchar(16))和age(int)三字段。

b)增加hibernate annotation配置方式类

Person.java

package com.bean;

import javax.persistence.Column;

import javax.persistence.Entity;

import javax.persistence.GeneratedValue;

import javax.persistence.GenerationType;

import javax.persistence.Id;

import javax.persistence.Table;

@Entity

@Table(name = "person", schema = "dbo", catalog = "report")

public class Person implements java.io.Serializable {

    private static final long serialVersionUID = 1L;

    // Fields

    private Integer id;

    private String name;

    private Integer age;

    // Constructors

    /** default constructor */

    public Person() {

    }

    /** full constructor */

    public Person(Integer id, String name, Integer age) {

        this.id = id;

        this.name = name;

        this.age = age;

    }

    // Property accessors

    @Id

    @GeneratedValue(strategy = GenerationType.AUTO)

    @Column(name = "id", unique = true, nullable = false)

    public Integer getId() {

        return this.id;

    }

    public void setId(Integer id) {

        this.id = id;

    }

    @Column(name = "name", nullable = false, length = 16)

    public String getName() {

        return this.name;

    }

    public void setName(String name) {

        this.name = name;

    }

    @Column(name = "age", nullable = false)

    public Integer getAge() {

        return this.age;

    }

    public void setAge(Integer age) {

        this.age = age;

    }

}

注意:这里由于ID是自增类型所以需要增加

@GeneratedValue(strategy = GenerationType.AUTO)

的注解

c)建立DAO层java类

PersonDAO.java

package com.dao;

import java.util.List;

import org.hibernate.Query;

import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import com.bean.Person;

@SuppressWarnings("unchecked")

public class PersonDAO extends HibernateDaoSupport {

    public void saveOrUpdate(Person ps) {

        try {

            getHibernateTemplate().saveOrUpdate(ps);

        } catch (RuntimeException e) {

            throw e;

        }

    }

    public List query() {

        try {

            Query query = getSession().createQuery("from Person");

            return query.list();

        } catch (RuntimeException e) {

            throw e;

        }

    }

}

d)建立service层java类

Person.java

package com.service;

import java.util.List;

import com.bean.Person;

import com.dao.PersonDAO;

public class PersonService {

    private PersonDAO personDAO;

    public void save(Person ps) {

        try {

            personDAO.saveOrUpdate(ps);

        } catch (RuntimeException e) {

            throw e;

        }

    }

    public List query() {

        try {

            return personDAO.query();

        } catch (RuntimeException e) {

            throw e;

        }

    }

    public PersonDAO getPersonDAO() {

        return personDAO;

    }

    public void setPersonDAO(PersonDAO personDAO) {

        this.personDAO = personDAO;

    }

}

e)配置spring,增加上面几个类的服务支持

    

    

f)编写测试类

public static void main(String[] args) {

    ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");

    PersonService service = (PersonService) ac.getBean("PersonService");

    Person ps = new Person();

    ps.setName("name");

    ps.setAge(10);

    service.save(ps);

    List list = service.query();

    for (Person vo : list) {

        System.out.println(vo.getId() +  + vo.getName() +  + vo.getAge());

    }

}

报错误信息

java.lang.NoClassDefFoundError: org/objectweb/asm/Type

原因是缺少asm-3.3.jar包,可以从前面准备的struts-2.3.15.1中获取,并服务在项目的WEB-INF/lib文件夹下。

运行成功,控制台输出:1,name,10

测试成功,spring、hibernate整合(包含数据)没有问题。

接下去,我增加flex与spring直接的通讯整合。

2.增flex-spring服务支持,是项目支持AMF通讯协议(FSH)

1)解压blazeds-bin-4.0.0.14931.zip中blazeds.war文件

2)复制./blazeds/WEB-INF/lib下的jar包到项目的WEB-INF/lib文件夹下

3)复制./blazeds/WEB-INF/flex下的jar包到项目的WEB-INF文件夹下

4)删除messaging-config.xml、proxy-config.xml、remoting-config.xml和version.properties文件

5)修改services-config.xml文件

删除和< security />部分

增加

    

        

    

6)增加flex-spring jar包

将backport-util-concurrent.jar和org.springframework.flex-1.0.3.RELEASE.jar复制到项目的WEN-INF/lib文件夹下。

7)配置web.xml使项目支持flex-spring

    flex

    org.springframework.web.servlet.DispatcherServlet

contextConfigLocation

1

    flex

    /messagebroker/*

8)配置spring文件使其支持flex remote

修改beans头文件为

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"

    xmlns:flex="http://www.springframework.org/schema/flex"

    xsi:schemaLocation="http://www.springframework.org/schema/beans

    http://www.springframework.org/schema/beans/spring-beans-3.1.xsd

    http://www.springframework.org/schema/flex    http://www.springframework.org/schema/flex/spring-flex-1.0.xsd">

增加flex支持

7)测试AMF通讯配置方式是否正确

a)java web项目中增加dest类。

PersonDest.java

package com.dest;

import java.util.List;

import com.bean.Person;

import com.service.PersonService;

public class PersonDest {

    private PersonService personService;

    public List query() {

        return personService.query();

    }

    public String save(Person ps) {

        personService.save(ps);

        return "success";

    }

    public PersonService getPersonService() {

        return personService;

    }

    public void setPersonService(PersonService personService) {

        this.personService = personService;

    }

}

b)在spring中配置PersonDest为flex RemoteObject对接类

    

    

    

c)建立flex测试application

Person.as

package com.bean {

    

    [RemoteClass(alias="com.bean.Person")] 

    public class Person {

        

        // public var id:int;

        public var name:String;

        public var age:int;

        

        public function Person() {}

    }

}

fsh_fb.mxml

               xmlns:s="library://ns.adobe.com/flex/spark"

               xmlns:mx="library://ns.adobe.com/flex/mx"

               width="100%" height="100%">

    

                    import com.bean.Person;

            

            import mx.controls.Alert;

            import mx.rpc.Responder;

            import mx.rpc.events.FaultEvent;

            import mx.rpc.events.ResultEvent;

            import mx.rpc.http.mxml.HTTPService;

            import mx.rpc.remoting.mxml.RemoteObject;

            

            private function send():void {

                var remote:RemoteObject = new RemoteObject();

                remote.destination = "PersonDest";

                remote.endpoint = "/fsh/messagebroker/amf";

                remote.showBusyCursor = true;

                remote.addEventListener(ResultEvent.RESULT, function(rstEvt:ResultEvent):void {

                    testId.text = String(rstEvt.result);

                });

                remote.addEventListener(FaultEvent.FAULT, function(fltEvt:FaultEvent):void {

                    Alert.show("Error: " + fltEvt.message.toString());

                });

                var ps:Person = new Person();

                ps.name = "AAA";

                ps.age = 12;

                remote.save(user);

            }

        ]]>

    

    

        

        

            

        

    

d)测试结果

运行

结果

界面

数据库

3.增struts服务支持,是项目支持http通讯协议(httpservice)

1)解压下载的struts-2.3.15.1-all.zip文件。

2)解压struts-2.3.15.1/apps/ struts2-blank.war文件。

struts2-blank项目是struts2的一个基础配置项目,接下来我们可以使用这个项目来参考配置我们的struts框架。

3)复制struts2-blank/WEB-INF/lib中的jar文件到我们项目的WEB-INF/lib文件夹中。

4)复制struts2-blank/WEB-INF/classes中的struts.xml文件到我们的src文件目录下。

5)配置web.xml使其支持struts服务

    struts2

    org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter

    struts2

    *.do

6)建立action类

PersonAction.java

package com.dest;

import java.io.PrintWriter;

import java.util.List;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.ServletActionContext;

import com.bean.Person;

import com.opensymphony.xwork2.ActionContext;

import com.opensymphony.xwork2.ActionSupport;

import com.service.PersonService;

public class PersonAction extends ActionSupport {

    private static final long serialVersionUID = 1L;

    private PersonService personService;

    private HttpServletRequest request;

    private HttpServletResponse response;

    public String save() {

        System.out.println("action save");

        try {

            setServlet();

            String name = request.getParameter("name");

            int age = Integer.parseInt(request.getParameter("age"));

            Person person = new Person();

            person.setName(name);

            person.setAge(age);

            personService.save(person);

            PrintWriter out = response.getWriter();

            out.print("success");

        } catch (Exception e) {

            e.printStackTrace();

        }

        return "success";

    }

    public List query() throws Exception {

        System.out.println("action query");

        List list = null;

        try {

            setServlet();

            list = personService.query();

            PrintWriter out = response.getWriter();

            out.print("" + list.size() + "");

        } catch (Exception e) {

            e.printStackTrace();

        }

        return list;

    }

    private void setServlet() {

        ActionContext ctx = ActionContext.getContext();

        request = (HttpServletRequest) ctx.get(ServletActionContext.HTTP_REQUEST);

        response = ServletActionContext.getResponse();

        response.setContentType("text/xml");

    }

    public PersonService getPersonService() {

        return personService;

    }

    public void setPersonService(PersonService personService) {

        this.personService = personService;

    }

}

7)配置对应的spring和struts文件

spring

    

struts

    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"

    "http://struts.apache.org/dtds/struts-2.3.dtd">

    

    

    

    

    

        

        

    

运行项目报错误信息:

Cannot locate the chosen ObjectFactory implementation: sprin

Cannot locate the chosen ObjectFactory implementation: spring - [unknown location]

缺少struts使用spring管理的jar包,从下载的struts2的lib文件夹中找到并添加struts2-spring-plugin-2.3.15.1.jar到项目中。

8)测试httpservice通讯

编写flex application文件

               xmlns:s="library://ns.adobe.com/flex/spark"

               xmlns:mx="library://ns.adobe.com/flex/mx"

               width="100%" height="100%">

    

                    import mx.rpc.Responder;

            import mx.rpc.events.FaultEvent;

            import mx.rpc.events.ResultEvent;

            import mx.rpc.http.mxml.HTTPService;

            

            private function servlet():void {

                var httpSrv:HTTPService = new HTTPService();

                httpSrv.method = "POST";

                httpSrv.resultFormat = "array";

                httpSrv.url = "/fsh2/query.do";

                httpSrv.showBusyCursor = true;

                var params:Object = new Object();

                params.name = "name";

                params.age = 12;

                httpSrv.send().addResponder(new mx.rpc.Responder(

                    function(evt:ResultEvent):void {

                        trace("11111111" + evt.result.source[0].rtn);

                        testId.text = evt.result.source[0].rtn;

                    },

                    function(evt:FaultEvent):void {

                        trace("22222222" + evt.message);

                    }

                ));

            }

        ]]>

    

    

        

        

            

        

    

运行结果:

点击按钮发送请求:

配置成功。

4.增cxf服务支持,是项目支持sopa通讯协议(webservice)

1)添加cxf项目核心jar包,重复的以高版本为准

cxf-2.7.6.jar、wsdl4j-1.6.3.jar、neethi-3.0.2.jar和xmlschema-core-2.0.3.jar四个jar包

2)修改web.xml支持cxf服务

    cxf

    org.apache.cxf.transport.servlet.CXFServlet

    1

    cxf

    /ws/*

3)增加webservice服务类

PersonWSI.java

package com.dest;

import java.util.List;

import javax.jws.WebService;

import com.bean.Person;

@WebService

public interface PersonWSI {

    String save(Person person);

List query();

}

PersonWS.java

package com.dest;

import java.util.List;

import javax.jws.WebService;

import com.bean.Person;

import com.service.PersonService;

@WebService

public class PersonWS implements PersonWSI {

    private PersonService personService;

    @Override

    public String save(Person person) {

        personService.save(person);

        return "success";

    }

    @Override

    public List query() {

        return personService.query();

    }

    public PersonService getPersonService() {

        return personService;

    }

    public void setPersonService(PersonService personService) {

        this.personService = personService;

    }

}

4)修改spring文件

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"

    xmlns:flex="http://www.springframework.org/schema/flex" xmlns:jaxws="http://cxf.apache.org/jaxws"

    xsi:schemaLocation="http://www.springframework.org/schema/beans

    http://www.springframework.org/schema/beans/spring-beans-3.1.xsd

        http://www.springframework.org/schema/flex

        http://www.springframework.org/schema/flex/spring-flex-1.0.xsd

        http://cxf.apache.org/jaxws

        http://cxf.apache.org/schemas/jaxws.xsd">

    

5)运行测试webservice是否发布成功

输入地址:http://localhost:8080/fsh/ws

http://localhost:8080/fsh/ws/person?wsdl

运行成功,配置完成。

    至此,3种协议的服务配置结束。

四、总结

到现在还是有些地方不太清楚,希望在项目中可以发现新问题、新思路,不断磨合这套系统使其更加符合实际需求。

结束了,大家会发现项目里面的jar包很多,而且很多存在两个版本,只要挑选高版本,删除低版本的jar包基本就不会存在问题了。关于log4j的问题,增加一个log4j.properties文件就可以解决了,具体大家去网上找吧,我这里就不累赘了。下载本文

显示全文
专题