2013年8月13日
一、前言
在项目开发过程中,很多时候需要给第三方提供一些接口来处理项目中的一下数据,然而在使用flex的AMF通信方式来配置我们的java web project的时候,我们就无法来处理这样的需求,所以这个时候我们可以合理的引入httpservice通讯方式和webservice通讯方式来弥补java服务端这一缺陷。
下面我们提一下flex三种通讯方式:
| 通讯方式 | 通信协议 | 数据交互格式 | 优点 | 缺点 |
| HttpService | 常用的http协议 | XML | 数据格式通用,便于不同应用系统间交换数据 | 1.数据在发送前需要转换成XML格式,接收后要解析XML数据。哪怕是只发送一个简单的的数字也要如此 2.在处理复杂数据类型如图片,对象的时候,非常不方便 |
| WebService | SOAP协议 | XML | 同上 | 同上 |
| RemoteObject | Flex自定义的高效二进制 数据通讯协议:AMF | 任意(可以是数字,字符串,对象,图片等等) | 能够处理各种类型的数据类型,速度快 | 需要专门的服务器端软件LCDS(FDS)或AmfPHP。LCDS(FDS)是收费的,价格不菲。 其中也可使用免费版本(blazeds),但是有。 |
(抱歉,adobe官方的图片找不到了,所以找了张有水印的)
| √ 代表此功能可用 | ||
| Features | BlazeDS | LCDS |
| 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 | √ |
| Features | BlazeDS | LiveCycle Data Services ES2 |
| RPC services | ||
| Java remoting/Action Message Format (AMF) | Yes | Yes |
| Ajax client libraries to Java™ remoting | Yes | Yes |
| WS/JSON proxy service | Yes | Yes |
| Messaging | ||
| Servlet-based messaging services (hundreds of clients per CPU) | Yes | Yes |
| Java NIO high-performance messaging (thousands of clients per CPU) | No | Yes |
| Real Time Messaging Protocol (RTMP) | No | Yes |
| Data throttling | No | Yes |
| Reliable communications | No | Yes |
| Data management | ||
| Transaction (batch processing) | No | Yes |
| Data paging | No | Yes |
| Lazy loading (on demand) | No | Yes |
| Conflict resolution and synchronization | No | Yes |
| SQL adapter | No | Yes |
| Hibernate adapter | No | Yes |
| "Fiber-aware" assembler | No | Yes |
| Offline web applications | No | Yes |
| Development and deployment | ||
| Spring integration support | Yes | Yes |
| Adobe Flash® Builder™ modeling plug-in | No | Yes |
| Enterprise support | No | Yes |
| RIA PDF generation | No | Yes |
| WSRP portal integration | No | Yes |
| Load/stress testing tool | No | Yes |
| Edge server | No | Yes |
| Enterprise support plans | No | Yes |
二、基础信息准备
基础准备,在这里我们使用的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服务。
5)配置applicationContext.xml文件,增加spring事务管理功能
org.hibernate.dialect.SQLServerDialect
配置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 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 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 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文件 删除 增加 6)增加flex-spring jar包 将backport-util-concurrent.jar和org.springframework.flex-1.0.3.RELEASE.jar复制到项目的WEN-INF/lib文件夹下。 7)配置web.xml使项目支持flex-spring 8)配置spring文件使其支持flex remote 修改beans头文件为 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 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: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服务 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(" } catch (Exception e) { e.printStackTrace(); } return "success"; } public List System.out.println("action query"); List try { setServlet(); list = personService.query(); PrintWriter out = response.getWriter(); out.print(" } 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: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服务 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 } 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 return personService.query(); } public PersonService getPersonService() { return personService; } public void setPersonService(PersonService personService) { this.personService = personService; } } 4)修改spring文件 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文件就可以解决了,具体大家去网上找吧,我这里就不累赘了。下载本文