Java与RubyonRails对接

Ruby 和rail:回归框架

Ruby和 rail是非常简洁的,很容易,很丰富。我无法避免的连续看到以及听到以上这样的说法。比如 说,Bill Walton 写的Rail回顾上关于Ruby的文章提到:“如果我告诉你当你使用Rail开发一个Web应用 程序可以比你使用一种特定的Java框架开发要快至少十倍的时候,你会怎么想?”

在尝试了RnR之后,我发现这就是一个伴随旧技术的非常经典的框架:

· Ruby是一种非常有力量的语言,就像Smalltalk。我选择静态语言。

· 搭建的材料是被动代码生成。就像是IDE wizards或者AppFuse。我选择动态代码生成,或者是更好 的——根本就不需要代码生成。

· 关系数据库中心:编码发生器和ActiveRecord在表中会被首先想到,然后是在类别中被想到。我选 择一种仅仅面向对象的,就像是Hibernate、JPA 甚至是ODBMS。

· MVC:我正在寻找比旧式MVC框架更新很好的工具。

Java的问题:Java开发者

在Java的世界中,生产力是文化问题,而不是技术问题。这就是所谓的这不是Java的错,而是我们的 错,我们作为Java开发者需要设计出非常漂亮的体系,以适用于任何地方的GoF模式、使得任何工具都是 可再度使用的、把三层架构放到我们所有的系统中以及使用web服务器。我们不是在寻找最直接的方法, 所以我们就没办法发现最直接的方法。但是Java、是一种非常简单的语言,使得我们很轻易就可以接近软 件开发。

Java生产力:其它的方法

解决生产力的一个方法是使用驱动模型。这就是模型环节的开发,仅仅是我们应用程序中的模型环节 ,就可以使用框架来生产所有的应用程序。MDA 、OpenXava 、Trails、 NakedObjects、 Roma框架和 JMatter都是采用的这种方式。

目标

这是所需要应用程序的主要界面:

图一

基本上,应用程序推测需要做三件事情:

· 列出所有准则的清单

· 创造新准则和编辑现有的准则

· 为某个类别指定合适的准则

Ruby on Rails第一次冲刺

使用RnR的第一步是创建一个新的项目,在命令行你需要输入:

$ rails cookbook2

现在你必须创建以及配置你的数据库。

现在是时间输入你的第一行代码了,在这个例子中使用SQL代码:

drop table if exists recipes;  drop table if exists categories;   create table categories (  id int not null auto_increment,  name varchar(100) not null default '',     primary  key(id)  ) engine=InnoDB;  create table recipes (  id int not null auto_increment,  category_id int not null,  title varchar(100) not null default '',  description varchar(255) null,   date date null,  instructions text null,  constraint fk_recipes_categories foreign key  (category_id) references categories(id),  primary key(id)  ) engine=InnoDB;

显然你需要在数据库上面执行这些语句。

最后的步骤是生成Ruby代码,你只需要执行O.S框架的下一个命令:

$ ruby script/generate scaffold recipe recipe

$ ruby script/generate scaffold category category

现在,你已经拥有RnR应用程序的第一个版本,并且准备运行。

很少量的工作,一个简单的“创建表格”,然后执行向导。让我们看看结果。

Rails结果

这是应用程序的结果:

图二

图三

图四

少量的工作,少量的结果。

JPA on OX的第一次冲刺

继续使用OpenXava。使用OpenXava的第一步是创建新的项目:

$ ant CreateNewProject.xml -Dproject=CookBook

现在你必须创建以及配置你的数据库。

现在是时间输入你的第一步代码了,在这个例子中使用Java代码:

Recipe.java:  package org.openxava.cookbook.model;     import  java.util.*;  import javax.persistence.*;  import org.openxava.annotations.*;  @Entity  @View(members="title; description; date; instructions")  public class Recipe {  @Id @GeneratedValue @Hidden   private Integer id;  @Required @Column(length=100)  private String title;  @Column(length=255)  private String description;  private Date date;   @Stereotype("HTML_TEXT")  private String instructions;  public Integer getId() {  return id;  }  public void setId(Integer id) {  this.id = id;  }  public String getTitle() {  return title;  }  public void setTitle(String title) {  this.title = title;  }  public String getDescription() {  return description;  }  public void setDescription (String description) {  this.description = description;  }  public Date getDate() {  return date;  }  public void setDate(Date date) {   this.date = date;  }  public String getInstructions() {  return instructions;  }  public void setInstructions(String instructions) {   this.instructions = instructions;  }  }  Category.java:  package org.openxava.cookbook.model;  import java.util.*;  import javax.persistence.*;  import org.openxava.annotations.*;  @Entity  public class Category {  @Id @GeneratedValue @Hidden  private Integer id;   @Required @Column(length=100)  private String name;  public Integer getId() {  return id;  }  public void setId(Integer id) {  this.id = id;  }  public String getName() {  return name;  }  public void setName(String name) {  this.name = name;  }  }

最后一个步骤是生成数据库图表,你只需要执行项目中的一个小目标:

$ ant updateSchema

现在,你已经拥有OpenXava应用程序的第一个版本,并且准备运行。

少量的工作,简单的POJO,以及执行“更新图表”。让我们看看结果。

OpenXava结果

这是应用程序的结果:

图五

图六

注意,用户可以创建更新、删除、从列表生成PDF、将列表输入到excel、每一列的命令、大型结果和 过滤数据的支持分页。而且你可以直接部署,不需要代码,仅仅是执行一个小目标,JSR-168入口上的应 用程序,以及OpenXava的look & feel能够适用于入口的look & feel。这就是一个应用程序准备 产出的第一步。

少量的工作,完美的结果。

观察这里RnR 与 OX之间的差别,一个冷静的观点是在RnR中,你先输入表,而在OpenXava中先输入类 别。

控制器

Rails引起basic CRUD的控制逻辑,你在下面可以看到:

图七

另一方面,OX不会为CRUD生成任何代码,OpenXava仅有一个属性代码,可以执行CRUD和打印,将自动 化配置给所有的实体。你可以书写你自己的属性CRUD逻辑,或者你可以为一个特有的实体书写详细逻辑, 但是你不会为每一个实体设置控制代码。使用这种方法,你需要维护少量的代码,并且你可以改变CRUD独 立单元的逻辑。

Rails使用合成码,OX使用属性代码。

你可以在OpenXava wiki上面学到更多的OX控制器知识。

增加关联

为了规范在Ruby中从类别增加关联,你需要在category.rb中书写如下代码:

图八

以及在recipe.rb中:

图九

相当简单。但是,你要做更多的工作,你必须编译。

cookbook2/app/views/recipe/_form.rhtml

增加如下代码:

Category

:

结果是:

图十

在这个环节,OpenXava中,你不得不在Category.java中使用JPA规定关联:

@ManyToOne(optional=false) @DescriptionsListprivate Category category;and in Recipe.java:@OneToMany(mappedBy="category")private Collection recipes;

而且你不需要接触任何类似HTML代码。应用程序将会显示如下:

图十一

你有一个为修改产生的链接或者从这里创建新类别。

不增加任何辅助编码,如果使用者使用类别单元,他将获得每一个类别中准则的收集,如下所示:

图十二

在这里,RnR应用程序还是不具备这种特性,你需要书写一些Ruby 和HTML代码来实现一样的结果。

在这一块,RnR 和 OX的主要差别是,在OX中你不需要书写任何HTML类似的代码,事实上你连用户界面 代码都根本不需要书写。

精确的基础资料

Ruby on Rails指导的下一个步骤是为一种特性生成基础资料。在RnR中你不得不编译控制编码从而达 到这个目的。让我们开看看。

修改以及更新的方法是增加如下代码行:

@recipe.date = Time.nowThe equivalent in OX is adding the @DefaultValueCalculaTor annotation in model:@DefaultValueCalculaTor(CurrentDateCalculaTor.class)private Date date;

用一种更为公开的方法获得一样的结果

在这里,尽管RnR中在控制器上放置的代码,OX中统计基础资料的代码,为了确认以及业务逻辑,一般 来说是放在模型上。OX促进从控制器转移业务逻辑到模型上。

RnR的相关文章中提到:“我改良模型文件,所以我需要重新启动我们的web服务器”。尽管使用 Eclipse WTP 我只需要按一下Ctrl 加上B,在浏览器上点击刷新以便于看见OpenXava应用程序上面模型的 变化。

结论

Ruby on Rails 和 OpenXava之间最主要的差别是RnR是 MVC框架,你不得不书写模型和控制器。OX是 模型驱动框架,你只需要书写模型。结果就是更少的代码,更好的程序。

另一个大的不同点是RnR使用被动代码生成方式;这就是说,生成代码,但是这之后如果你想要扩展或 者提炼代码,你不得不编译合成码。OpenXava不需要使用代码生成器,你所拥有的代码都是你所书写的。 你可以在Java的世界中找到提高生产力的方法。

没有什么可留恋,只有抑制不住的梦想,没有什么可凭仗,

Java与RubyonRails对接

相关文章:

你感兴趣的文章:

标签云: