




已阅读5页,还剩14页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
当前对 Web 技术的要求在不断增加。它们必须能够管理用户帐户、上传内容和流媒体格式。这个要求需要 RIA 开发人员探寻这样的技术,即能精简开发流程同时提供广受追捧的功能。开发人员面对的难题就是,如何选择合适的技术集合来提供这些服务。常用缩略词 AMF:动作消息格式 API:应用程序编程接口 CSS:层叠样式表 GUI:图形用户界面 HTTP:超文本传输协议 JAR:Java 档案文件 POJO:简单 Java 对象 RIA:富互联网应用程序 RPC:远程过程调用 SDK:软件开发工具包 SQL:结构化查询语言 UI:用户界面 WAR:Web 档案 XML:可扩展标记语言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对象所需的属性和数据类型是:- String emailAddress- String firstName- long id- String lastName- String phoneNumber- long serialVersionUID+ Contact()+ Contact(String first, String last, String email, String number)+ String getEmailAddress()+ String getFirstName()+ long getId()+ String getLastName()+ String getPhoneNumber()+ void setEmailAddress(String address)+ void setFirstName(String first)+ void setId(long newId)+ void setLastName(String last)+ void setPhoneNumber(String number)+ String toString()注释业务对象JavaContact类被看作是一个充当业务对象的 POJO(简单 Java 对象),这意味着它代表业务领域特征和行为。Contact对象内的数据需要存留到数据库中。解决方案就是使用一个 ORM 框架,比如 Hibernate,它在对象与数据库表记录之间的来回映射中执行大量工作。如果使用了 Java Persistence API (JPA) 注释,完成 ORM 仅需要少量代码。清单 1显示了带注释的 Java 类Contact。清单 1. Java Contact 类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;EntityTable(name=contact)NamedQueries( NamedQuery(name = contact.findAll, query = from Contact), NamedQuery(name = contact.getById, query = select c from Contact c where c.id = :id) )public class Contact private static final long serialVersionUID = 123456789L; public Contact() firstName = N/A; lastName = N/A; emailAddress = N/A; phoneNumber = N/A; public Contact(String first, String last, String email, String number) firstName = first; lastName = last; emailAddress = email; phoneNumber = number; Id GeneratedValue(strategy = GenerationType.AUTO) Column(name = id, nullable = false, updatable=false) private long id; Column(name = lastName, nullable = false, unique = false) private String lastName; Column(name = firstName, nullable = false, unique = false) private String firstName; Column(name = emailAddress, nullable = false, unique = false) private String emailAddress; Column(name = phoneNumber, nullable = false, unique = false) private String phoneNumber; public void setPhoneNumber(String number) phoneNumber = number; public String getPhoneNumber() return phoneNumber; public String getEmailAddress() return emailAddress; public void setEmailAddress(String address) emailAddress = address; public String getFirstName() return firstName; public void setFirstName(String first) firstName = first; public String getLastName() return lastName; public void setLastName(String last) lastName = last; public long getId() return id; public void setId(long newId) id = newId; Override public String toString() return id + + firstName + + lastName + + emailAddress + + phoneNumber; 类很简单,但对于注释则有很多内容需要解释: Column:将属性标记为数据库内的一个列,可含有列名,不管它是否唯一且是否可为空 Entity:将类作为一个实体 bean 声明,表明它是一个要留存的 POJO GeneratedValue:指定生成主键的策略;包括AUTO、IDENTITY、SEQUENCE和TABLE Id:指明属性为每个 Java 对象的唯一标识符(即主键) NamedQueries:列出一组命名查询 NamedQuery:将预定义查询声明为一个字符串常量,以供执行时引用。 Table:将 Java 类指定为数据库内的一个表每次需要留存一个内存中的 Java 对象时,Hibernate 将任何 Java 对象的状态信息转换为一个 SQL 更新。同样地,带结果集的 SQL 语句用于填充 Java 对象。因此,可将所有对象保存为数据库内的记录,且可检索所有记录并将其转换回 Java 对象。注释告知 Hibernate 一个类中的哪些内容可以考虑留存。但它们只是类的一部分。业务服务:数据库连接执行 ORM 时需要有一个服务类来执行对 Hibernate 的调用。清单 2显示了ContactsService类,它充当应用程序服务。清单 2. ContactsService 类public class ContactsService private static Logger logger = Logger.getLogger(ContactsService.class); private static final String PERSISTENCE_UNIT = contacts; private static EntityManagerFactory emf = null; static (LOADING CONTACTSSERVICE CLASS.); emf = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT); public ContactsService() super(); public void addContact(Contact c) if(c = null) return; EntityManager em = emf.createEntityManager(); (PERSISTENCE ENTITYMANAGER ACQUIRED.); (ABOUT TO ADD CONTACT: fName: + c.getFirstName() + , lName: + c.getLastName() + , email: + c.getEmailAddress() + , phone: + c.getPhoneNumber(); EntityTransaction tx = em.getTransaction(); try tx.begin(); em.merge(c); mit(); catch (Exception e) logger.error(CONTACT APP PERSISTING ERROR: + e.getMessage(); tx.rollback(); finally (CONTACT APP CLOSING ENTITY MANAGER.); em.close(); public void editContact(Contact c) (CONTACT TO UPDATE: + c); addContact(c); public void deleteContact(Long id) (ABOUT TO DELETE CONTACT); EntityManager em = emf.createEntityManager(); (PERSISTENCE ENTITYMANAGER ACQUIRED.); Query contactByIdQuery = em.createNamedQuery(contact.getById); contactByIdQuery.setParameter(id, id); Contact c = (Contact) contactByIdQuery.getSingleResult(); EntityTransaction tx = em.getTransaction(); try tx.begin(); em.remove(c); mit(); catch (Exception e) logger.error(CONTACT APP PERSISTING ERROR: + e.getMessage(); tx.rollback(); finally (CONTACT APP CLOSING ENTITY MANAGER.); em.close(); public List getContacts() (ABOUT TO RETRIEVE CONTACTS); EntityManager em = emf.createEntityManager(); (PERSISTENCE ENTITYMANAGER ACQUIRED.); Query findAllContactsQuery = em.createNamedQuery(contact.findAll); List contacts = findAllContactsQuery.getResultList(); if (contacts != null) logger.debug(CONTACT APP RETRIEVED: + contacts.size() + CONTACT(S); return contacts; 每个方法都获取对EntityManager的一个引用,它提供对内存缓存的支持。缓存是一个能改进效率的强大特性,因为从一个数据库收发数据是一项很昂贵的操作。您必须确保所创建的每个缓存都服务于数据库,或在不需要时予以回滚。在 JPA 中,缓存的既定术语是持久化上下文(persistence context),且它由EntityManager类表示。每个持久化上下文管理一组实体,这些实体是标有Entity注释的 Java 对象。EntityManagerFactory类表示一个持久化单元(persistence unit),它负责配置到数据存储(例如,关系数据库)的连接、管理实体类型(即给定上下文内需要映射到数据存储的所有类),并最后提供持久化上下文的实例(即一个EntityManager)。试用 DB2 Express 9 数据库服务器免费版DB2 Express-C被设计为可在几分钟内启动并运行,它易于使用和嵌入,包含自管理功能,且嵌入了 DB2 for Linux,UNIX and Windows 的所有核心功能,比如 pureXML。DB2 Express-C 像其他 DB2 Express 版本一样提供相同的核心数据服务器基础功能,且提供一个坚实的基础来构建和部署使用 C/C+、Java、.NET、PHP、Ruby on Rails、Python 和其他编程语言开发的应用程序。尽管创建一个持久化上下文的过程很省时,但创建一个持久化单元的过程却很费时。建立到数据存储的连接、查找标注为实体的所有类、配置持久化逻辑以将这些类绑定到数据存储中的实体,整个过程不可能快速完成。因此,您需要在应用程序启动时创建一个EntityManagerFactory实例。对于持久化上下文,要务必确保在销毁掉一个EntityManager之后再创建另一个。另一个要遵循的重要规则就是entitymanager-per-request模式。该模式将数据库调用(例如,请求和更新)组合起来,这样就可以将它们一次性发送出去。这样做可以确保充分利用 JPA 的缓存机制。下一个需求就是客户端。应用程序:客户端层Flex 框架允许您创建可在 Adobe Flash Player 中播放的应用程序。Flex 包括: 称为MXML的一个声明性 XML UI 语言 ActionScript 编程语言 用于创建 UI、Web 连接和许多其他特性的运行时库 用于将应用程序编译为 SWF 文件的开发工具本文引用的客户端应用程序使用 Flex 第 4 版。在探讨客户端应用程序之前,要了解如何创建 Flex 应用程序,以及它们如何在 Flash Player 中作为可执行程序存在,这很重要。首先,您可以使用 MXML 标记和 ActionScript 代码创建应用程序。常用的工作流是使用 MXML 格式创建 GUI 的主要部分(呈现),然后使用 ActionScript 代码执行事件处理和业务逻辑。由于 MXML 和 ActionScript 都是基于文本的,创建 Flash 应用程序只需要一个标准文本编辑器和 Flex SDK。其次,编写完 Flex 应用程序之后,使用 MXML 编译器编译代码。然后 MXML 编译器创建可在 Web 浏览器内运行(通过 Flash Player 浏览器插件)的 SWF 文件。最后,Flash 应用程序在使用时间轴范例的 ActionScript Virtual Machine 2 (AVM2) 中运行。该范例将执行动作分成帧 就像电影一样。您在编译时指定 Flash 应用程序中的每秒帧数。此外,Flash Player 将执行动作分成以下已排序的任务: Flash Player 事件,比如计时器和鼠标事件 用户代码 预渲染逻辑,其中 Flash Player 试图确定是否因数据值变更而更新 GUI 与数据值变更相关的用户代码 Flash Player 渲染如果要渲染的每秒帧数很少,那么就可以执行大部分用户代码。但是,如果帧频很高(例如,每秒 60 帧),Flash Player 就不太可能执行多数用户代码,因为用户代码执行的时间可能比给定时间更长。在为 Flash Player 编写代码时,记住这一点很重要。MXMLMXML 是一个强大的声明性 XML 格式,有助于: 因 XML 格式的声明性质而最大限度地降低构建 GUI 所需的代码量 通过明确分离表示逻辑和交互逻辑降低 GUI 代码的复杂度 在进行软件开发时推进设计模式的使用清单 3显示了 MXMLApplication类。清单 3. ContactsApp 类 .mainBoxStyle borderStyle: solid; paddingTop: 5px; paddingBottom: 5px; paddingLeft: 5px; paddingRight: 5px; .textMessages fontWeight: bold; 关于清单 3,这里还有几点说明: 一个 MXML 文档的根元素是Application类的一个子类。 mx:Style元素允许 CSS 属性定义 UI 组件的本地样式。样式设计通过使用本地样式定义(见清单 3)、对外部样式表的引用、组件内的内联样式以及 ActionScript 中的setStyle方法完成。 RemoteObject类表示与服务器执行远程操作的一个 HTTP 服务对象。 mx:Script元素包括CDATA区域中的 ActionScript 代码块。 有一个布局(即VBox类)。 每次在应用程序中声明一个 UI 组件(例如,TextArea)时,就产生一个实例变量,稍后可使用组件的id属性在应用程序内引用该变量。 数据绑定通过大括号执行(例如, 将TextArea元素的text属性绑定到 ActionScriptmessage实例变量)。ActionScriptMXML 定义 GUI,而 ActionScript 提供用于处理事件、绑定数据(通过Bindable元数据标记)的行为,以及调用远程服务的能力。在清单 3中,createContact、editContact、deleteContact和getAllContacts方法都在服务器端调用远程方法。调用远程方法时,ActionScript 就有机会通过声明回调函数处理结果和任何错误了。在清单 3中,handleResult函数将结果作为一个Object接收,并将其投射到一个ArrayCollection。BlazeDS 将List转化为客户端上的一个ArrayCollection。清单 4展示了 ActionScript 类Contact,创建该类的目的在于表示 Flash 端的联系对象。清单 4. ActionScript Contact 类package bcit.contacts.dto RemoteClass(alias=bcit.contacts.Contact)public class Contact public function Contact() id = -1; public var id:Number; public var lastName:String; public var firstName:String; public var emailAddress:String; public var phoneNumber:String; pu
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 重难点解析鲁教版(五四制)8年级数学下册测试卷(A卷)附答案详解
- 中医助理医师测试卷往年题考附答案详解
- 电竞公司赛事调度管理规章
- 重难点解析北师大版8年级数学上册期末试题【综合题】附答案详解
- 自考专业(教育管理)考前冲刺试卷含答案详解【培优A卷】
- 电竞公司分部管理规章
- 自考专业(建筑工程)测试卷及答案详解(各地真题)
- 电竞公司应急队伍建设规章
- 主管护师(中级)真题附答案详解【基础题】
- 主管护师(中级)模拟题库有答案详解
- 2025年本科院校基建处招聘考试备考指南与模拟题
- 小学教师个人专业发展三年规划
- 2023年度保安员考试检测卷【研优卷】附答案详解
- 热电厂巡检工培训课件
- (正式版)DB15∕T 385-2020 《行业用水定额》
- 2025年农业面源污染治理农业面源污染治理技术手册报告
- 中国黄金知识培训课件
- 人教PEP版(一起)一年级上册英语全册教案
- 光伏施工基本知识培训课件
- 2025贵州毕节市赫章县招聘事业单位工作人员123人笔试备考题库及参考答案详解
- GB 21256-2025粗钢生产主要工序单位产品能源消耗限额
评论
0/150
提交评论