`
tacone
  • 浏览: 31602 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Jason Rudolph 关于Groovy的新教程:Grails + EJB Step by Step (前言)

    博客分类:
  • mvc
阅读更多
本文转引自http://www.infoq.com/cn/articles/grails-ejb-tutorial
作者 Jason Rudolph 译者 胡键
这是grails很好的一个入门教程,对比JAVA应用可以省略大量的代码(下面是前言部分,转引者略有改动)
前言
Ruby on Rails不断地受到软件工程世界的关注,但企业依旧对其表示怀疑。为什么会这样?我们怀疑:“构建于脚本语言之上的框架,怎能适合我的企业应用?!”针对Ruby on Rails,典型的论调就是缺少对企业服务(如分布式事务、消息传递等)的支持。对很多企业而言,如果平台没有这些服务,那么它将不可能被考虑。

Grails旨在解决那些关注点,并证明快速应用开发(RAD)对企业是可行的。Grails建构于Groovy之上,提供了与Java的无缝集成。它能直接访问你的业务所依赖的那些企业服务,同时为你的工具集增添强大的动态语言结构。

作为展示它企业集成能力的令人印象深刻的一个例子,Grails可让你快速而简单的基于已有EJB3实体Bean构建一个Web应用。但是,它的能力并不是仅此而已。Grails大幅增强了你的实体Bean的能力,而且这些完全是动态做到的,没有更改任何你的EJB源码。Grails对象关系映射(GORM)建立在Hibernate3(最终将提供对Java持久化API的支持)之上,利用Groovy的元对象协议(MOP)为你的不同静态实体Bean增加了各种方便的动态方法。这些方法不仅能从Grails和Groovy访问,而且你的Java代码同样能访问它们!我们瞬间就拥有了JEE/EJB3的企业级能力和RAD Web应用开发的全部好处!

那么,让我们看看基于EJB3实体Bean构建Grails应用要做哪些工作。在以下步骤中,我们将创建一个新的Grails应用,将实体Bean导入到应用,为实体Bean产生快速构建缺省Web界面的脚手架代码(scaffolding),然后再探索Grails为实体Bean增加的一些方便的动态方法。

首先,我们需要从一个EJB3应用开始。(Grails并不需要你以一个EJB3应用作为起点。但是,本文的一般性假设是你有兴趣将RAD Web开发并入你的EJB3项目。)假设我们有一些EJB3实体Bean,它们代表一个公司里的员工(EmployeeBean)和分配给员工的计算机(ComputerBean)。(如果遇到任何问题,请参见资源小节。你将在那儿找到该Grails应用的完整源代码——一个使用这些实体Bean的简单JEE应用——以及其它有用的东西。)
【附件一为类结构图】


以下是支持我们实体Bean的两张表。(例子中,我们将使用MySQL 5.0。你可以使用这个脚本创建一个名为ejb3example的新数据库,它同时将生成这些表。)
【附件二为表脚本】
构建与这些数据交互的Web用户界面,并和已有代码集成要花多长时间呢?它这不应该花费太多的时间,但是,我们肯定已经接受了这样的观点,即这个过程需要重大的努力。使用Grails,无需如此。
下面是POJO代码
package com.jasonrudolph.ejb3example.entity;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

@Entity
@Table(name = "employees")
public class EmployeeBean implements Serializable {

	/** The primary key for this employee. */
	private int id;

	/** The network ID (i.e., user ID) for this employee. */
	private String networkId;

	/** The first name for this employee. */
	private String firstName;

	/** The last name for this employee. */
	private String lastName;

	/** The date on which this employee began his/her employment. */
	private Date startDate;

	/** The collection of computers assigned to this employee. */
	private Collection<ComputerBean> computers = new ArrayList();

	public EmployeeBean() {
	}

	public EmployeeBean(String networkId, String firstName, String lastName,
			Date startDate) {
		this.networkId = networkId;
		this.firstName = firstName;
		this.lastName = lastName;
		this.startDate = startDate;
	}

	/**
	 * @return the system-generated primary key for this employee
	 */
	@Id
	@GeneratedValue
	public int getId() {
		return this.id;
	}

	/**
	 * Sets the primary key for this employee. Only the EJB container should
	 * invoke this method.
	 *
	 * @param id
	 *            the primary key for this employee
	 */
	public void setId(int id) {
		this.id = id;
	}

	@Column(name = "network_id")
	public String getNetworkId() {
		return this.networkId;
	}

	public void setNetworkId(String networkId) {
		this.networkId = networkId;
	}

	@Column(name = "first_name")
	public String getFirstName() {
		return this.firstName;
	}

	public void setFirstName(String firstName) {
		this.firstName = firstName;
	}

	@Column(name = "last_name")
	public String getLastName() {
		return this.lastName;
	}

	public void setLastName(String lastName) {
		this.lastName = lastName;
	}

	@Column(name = "start_date")
	public Date getStartDate() {
		return startDate;
	}

	public void setStartDate(Date startDate) {
		this.startDate = startDate;
	}

	/**
	 * @return the collection of computers assigned to this employee
	 */
	@OneToMany(fetch = FetchType.EAGER, cascade = { CascadeType.ALL }, mappedBy = "employeeBean")
	public Collection<ComputerBean> getComputers() {
		return this.computers;
	}

	/**
	 * Sets the collection of computers assigned to this employee.
	 *
	 * @param computers
	 *            the collection of computers assigned to this employee
	 */
	public void setComputers(Collection<ComputerBean> computers) {
		this.computers = computers;
	}
}







  • 描述: 类图
  • 大小: 30.4 KB
  • 描述: 表
  • 大小: 33.2 KB
分享到:
评论

相关推荐

    Machine Learning: Step-by-Step Guide To Implement Algorithms with Python

    Machine Learning: Step-by-Step Guide To Implement Machine Learning Algorithms with Python By 作者: Rudolph Russell ISBN-10 书号: 1719528403 ISBN-13 书号: 9781719528405 出版日期: 2018-05-22 pages ...

    Groovy Recipes Greasing the Wheels of Java.pdf

    Jason Rudolph,著有《Grails入门》,认为本书是将Groovy融入每个Java开发者工具箱的必备指南。Dierk König,Canoo Engineering AG的成员,则将其比作在Groovy“烘焙”中不可或缺的秘方集,能让开发者迅速掌握解决...

    Programming Groovy

    - **Jason Rudolph (《Getting Started with Grails》作者)**:认为本书是快速掌握Groovy元编程的最佳资源之一。 - **Scott Davis (aboutGroovy.com 编辑)**:强调本书不仅仅停留在语法层面,而是深入探讨了Groovy...

    Grails入门指南 中文版

    Grails是一套用于快速Web应用开发的开源框架,它基于Groovy编程语言,并构建于Spring、Hibernate和其它标准Java框架之上,从而为大家带来一套能实现超高生产力的一站式框架。 本书作者 Jason Rudolph 译者 陈俊 林...

    代码之美精选版

    - **Grails框架**: Jason Rudolph介绍的Grails框架示例,不仅讲解了框架本身的优势,也展示了如何利用现代编程语言和框架提升开发效率。 #### 四、对软件工程师的意义 - **启发创新思维**: 通过对代码之美的探索...

    鲁道夫新标签画廊「Rudolph New Tab Gallery」-crx插件

    一个新的标签画廊,从经典的圣诞节特别鲁道夫图像! 请给我们评分! 如果您觉得我们不值得5星级,请给我们发送电子邮件或先致电给我们! 我们希望收到你的来信! support@brandthunder.com或614.321.9316 *高分辨率...

    Node.js-Rudolph-

    Node.js-Rudolph-

    YURAZ_RSAXEL 脚本程序绘制了 Axel Rudolph 水平线 - MetaTrader 5脚本.zip

    《MetaTrader 5脚本与Axel Rudolph水平线绘制技术》 MetaTrader 5(MT5)是一款广泛应用于外汇、股票和其他金融市场的交易平台,它提供了丰富的交易功能和强大的技术分析工具。在MT5中,用户可以利用MQL5编程语言...

    nativescript-bored-rudolph:NativeScript插件,用于在刷新后的布局内隐藏游戏

    NativeScript-Bored-Rudolph :recycling_symbol_selector: 用于拉动刷新布局内的自定义隐藏游戏的NativeScript插件。 演示版 本机图书馆 安装 从命令提示符/终端转到应用程序的根文件夹并执行: tns plugin add ...

    rudolph:使用经典FRP的纯功能路由器。 用TypeScript编写

    **鲁道夫(Rudolph)** 是一个专注于纯函数式编程(Pure Functional Programming, PFP)的路由器库,它采用经典的功能响应式编程(Functional Reactive Programming, FRP)范式构建。鲁道夫的核心是利用TypeScript...

    Foundations+of+Semantic+Web+Technologies....pdf

    1. 文档标题:“Foundations of Semantic Web Technologies”表明这是一本关于语义网技术基础的教程资源。语义网是互联网的一个扩展,它通过使用标准的、可相互理解的方式来交换信息,使得网络上的数据能够被机器...

    dotfiles:bash,completions,git,irb,rails,VS Code等的配置文件

    杰森·鲁道夫(Jason Rudolph)的点文件 这些是用于以我喜欢的方式设置系统的配置文件。 安装 git clone git://github.com/jasonrudolph/dotfiles ~/.dotfiles cd ~/.dotfiles rake install 环境 我在macOS上运行,...

    论文研究-一种分析和设计认证协议的新逻辑 .pdf

    这篇论文研究了一种新的认证协议分析和设计逻辑,该逻辑是对传统BAN逻辑的扩展。BAN逻辑由Burrows, Abadi和Needham提出,是基于逻辑的认证协议分析方法中的一种重要手段。本文的作者缪祥华和张云生,通过对BAN逻辑的...

    正则表达式

    此外,网络上还有许多教程和在线练习资源可以帮助你提升正则表达式的使用技能。 通过以上介绍,我们可以看到正则表达式是一种功能强大且灵活多变的文本处理工具,它不仅能够简化文本匹配的过程,还能够提高数据处理...

    Digital Software Magazine September 2007

    该期杂志包含了软件行业的多个主题内容,其中重点介绍了一项名为“FeaturePlan 3.0”的新发布,以及一篇关于安全测试与管理的文章。 ### 二、“FeaturePlan 3.0”发布详情 **发布方:** - 发布方为Ryma Technology...

    Bluetooth Essentials for Programmers

    - **Larry Rudolph**:拥有纽约大学库朗特研究所博士学位,目前是麻省理工学院的研究科学家以及新英格兰复杂科学研究所的教员。其最新的研究集中在移动计算领域。 #### 适用对象 - 对蓝牙技术感兴趣的编程爱好者。...

Global site tag (gtag.js) - Google Analytics