本文章主要讲一下如何用J2EE+Flex+MySQL编写简单而强大的RIA,对于JAVA程序员来说,这是一个很实用的技术,也是很重要的内容。希望对于这方面有兴趣的朋友有所帮助吧。
Adobe Flex 是一个客户端技术,它为开发人员提供丰富的 API 集合来创建 GUI、绘制图形、播放和流放媒体、连接到 Web 服务。在转子泵服务器端,Java 技术提供的功能包括关系型数据库管理系统(RDBM)的连接、服务请求的多线程处理以及随需求增加而进行的最佳伸缩。将这两种技术结合使用可提供一个满足 RIA 转子泵应用程序需求的强大的技术堆栈。
本文展示如何编写一个简单而强大的 RIA,能使用客户端的 Flex、服务器端 Java 技术以及后端数据库的 MySQL。
样例应用程序
样例应用程序(来自下面的 下载 部分)提供一个丰富的 UI,支持通过 Adobe Flash? (SWF) 应用程序创建、读取、更新和删除(CRUD) 联系信息。这个三层的 Web 架构如 图 1 所示,其中客户端由嵌入在一个 Web 页面中的 SWF 文件表示,服务器应用程序在一个 Java servlet 容器(本例中为 Apache Tomcat)内运行,且数据库是 MySQL。这三层共同创建一个功能分布式应用程序。
▲图1 Contacts 应用程序
对于 Flash 应用程序与 Java servlet 容器之间的通信,Adobe BlazeDS 框架提供对象远程调用 — 即一种允许 Adobe ActionScript? 对象与 Java 对象相互调用的 PRC 形式。Java 服务器应用程序与关系数据库之间的通信由 Hibernate Object Relational Mapping (ORM) 框架处理。Hibernate 允许将 Java 对象转换为 SQL代码,反之亦然。
应用程序:服务器层
第一步是要创建一个 Java 类,它包含存储联系信息所需的信息。样例应用程序包含一个带基本信息的简单模型。Contact 对象所需的属性和数据类型是:
#div_code img{border:0px;}
-StringemailAddress-StringfirstName-longid-StringlastName-StringphoneNumber-longserialVersionUID+Contact()+Contact(Stringfirst,Stringlast,Stringemail,Stringnumber)+StringgetEmailAddress()+StringgetFirstName()+longgetId()+StringgetLastName()+StringgetPhoneNumber()+void setEmailAddress(Stringaddress)+void setFirstName(Stringfirst)+void setId(longnewId)+void setLastName(Stringlast)+void setPhoneNumber(Stringnumber)+StringtoString()
注释业务对象
Java Contact 类被看作是一个充当业务对象的 POJO(简单 Java 对象),这意味着它代表业务领域特征和行为。Contact 对象内的数据需要存留到数据库中。解决方案就是使用一个 ORM 框架,比如 Hibernate,它在对象与数据库表记录之间的来回映射中执行大量工作。如果使用了 Java Persistence API (JPA) 注释,完成 ORM 仅需要少量代码。 清单 1 显示了带注释的 Java 类 Contact。
清单 1. Java Contact 类
#div_code img{border:0px;}
package bcit.contacts;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
@Entity
@Table(name="contact")
@NamedQueries( {
@NamedQuery(name="contact.findAll", query="from Contact"),
@NamedQuery(name="contact.getById", query="select c from Contact c where c.id = :id")
} )publicclass Contact {privatestatic finallongserialVersionUID=123456789L;publicContact() {
firstName="N/A";
lastName="N/A";
emailAddress="N/A";
phoneNumber="N/A";
}publicContact(Stringfirst,Stringlast,Stringemail,Stringnumber) {
firstName=first;
lastName=last;
emailAddress=email;
phoneNumber=number;
}
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="id", nullable=false, updatable=false)privatelongid;
@Column(name="lastName", nullable=false, unique=false)privateStringlastName;
@Column(name="firstName", nullable=false, unique=false)privateStringfirstName;
@Column(name="emailAddress", nullable=false, unique=false)privateStringemailAddress;
@Column(name="phoneNumber", nullable=false, unique=false)privateStringphoneNumber;publicvoid setPhoneNumber(Stringnumber) { phoneNumber=number; }publicStringgetPhoneNumber() { return phoneNumber; }publicStringgetEmailAddress() { return emailAddress; }publicvoid setEmailAddress(Stringaddress) { emailAddress=address; }publicStringgetFirstName() { return firstName; }publicvoid setFirstName(Stringfirst) { firstName=first; }publicStringgetLastName() { return lastName; }publicvoid setLastName(Stringlast) { lastName=last; }publiclonggetId() { return id; }publicvoid setId(longnewId) { id=newId; }
@OverridepublicStringtoString() {
return id+""+firstName+""+lastName+""+emailAddress+""+phoneNumber;
}
}