Ruby 和rail回归框架 Ruby和 rail是非常简洁的很容易很丰富我无法避免的连续看到以及听到以上这样的说法比如说Bill Walton 写的Rail回顾上关于Ruby的文章提到如果我告诉你当你使用Rail开发一个Web应用程序可以比你使用一种特定的Java框架开发要快至少十倍的时候你会怎么想?
在尝试了RnR之后我发现这就是一个伴随旧技术的非常经典的框架
· Ruby是一种非常有力量的语言就像Smalltalk我选择静态语言
· 搭建的材料是被动代码生成就像是IDE wizards或者AppFuse我选择动态代码生成或者是更好的——根本就不需要代码生成
· 关系数据库中心编码发生器和ActiveRecord在表中会被首先想到然后是在类别中被想到我选择一种仅仅面向对象的就像是HibernateJPA 甚至是ODBMS
· MVC我正在寻找比旧式MVC框架更新很好的工具
Java的问题Java开发者
在Java的世界中生产力是文化问题而不是技术问题这就是所谓的这不是Java的错而是我们的错我们作为Java开发者需要设计出非常漂亮的体系以适用于任何地方的GoF模式使得任何工具都是可再度使用的把三层架构放到我们所有的系统中以及使用web服务器我们不是在寻找最直接的方法所以我们就没办法发现最直接的方法但是Java是一种非常简单的语言使得我们很轻易就可以接近软件开发
Java生产力其它的方法
解决生产力的一个方法是使用驱动模型这就是模型环节的开发仅仅是我们应用程序中的模型环节就可以使用框架来生产所有的应用程序MDA OpenXava Trails NakedObjects Roma框架和JMatter都是采用的这种方式
目标
这是所需要应用程序的主要界面
图一
基本上应用程序推测需要做三件事情
· 列出所有准则的清单
· 创造新准则和编辑现有的准则
· 为某个类别指定合适的准则
Ruby on Rails第一次沖刺
使用RnR的第一步是创建一个新的项目在命令行你需要输入
$ rails cookbook
现在你必须创建以及配置你的数据库
现在是时间输入你的第一行代码了在这个例子中使用SQL代码
drop tableif exists recipes;
drop table if exists categories;
create table categories (
id intnot null auto_increment
name varchar() not null default
primary key(id)
) engine=InnoDB;
create table recipes (
id int not null auto_increment
category_id int not null
title varchar() not null default
description varchar() null
date date null
instructions textnull
constraint fk_recipes_categories foreignkey
(category_id) references categories(id)
primary key(id)
) engine=InnoDB;
显然你需要在数据库上面执行这些语句
最后的步骤是生成Ruby代码你只需要执行OS框架的下一个命令
$ ruby script\generate scaffold recipe recipe
$ ruby script\generate scaffold category category
现在你已经拥有RnR应用程序的第一个版本并且准备运行
很少量的工作一个简单的创建表格然后执行向导让我们看看结果
Rails结果
这是应用程序的结果
图二
图三
图四
少量的工作少量的结果
JPA on OX的第一次沖刺
继续使用OpenXava使用OpenXava的第一步是创建新的项目
$ ant CreateNewProjectxml Dproject=CookBook
现在你必须创建以及配置你的数据库
现在是时间输入你的第一步代码了在这个例子中使用Java代码
Recipejava:
package okbookmodel;
importjavautil*;
import javaxpersistence*;
import orgopenxavaannotations*;
@Entity
@View(members=title; description; date; instructions)
public classRecipe {
@Id @GeneratedValue @Hidden
private Integerid;
@Required @Column(length=)
private Stringtitle;
@Column(length=)
private String description;
private Date date;
@Stereotype(HTML_TEXT)
private String instructions;
public Integer getId() {
return id;
}
public void setId(Integer id) {
thisid = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
thistitle = title;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
thisdescription = description;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
thisdate = date;
}
public String getInstructions() {
return instructions;
}
public void setInstructions(String instructions) {
thisinstructions = instructions;
}
}
Categoryjava:
package okbookmodel;
import javautil*;
import javaxpersistence*;
import orgopenxavaannotations*;
@Entity
public class Category {
@Id @GeneratedValue @Hidden
private Integer id;
@Required @Column(length=)
private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
thisid = id;
}
public String getName() {
return name;
}
public void setName(String name) {
thisname = name;
}
}
最后一个步骤是生成数据库图表你只需要执行项目中的一个小目标
$ ant updateSchema
现在你已经拥有OpenXava应用程序的第一个版本并且准备运行
少量的工作简单的POJO以及执行更新图表让我们看看结果
OpenXava结果
这是应用程序的结果
图五
图六
注意用户可以创建更新删除从列表生成PDF将列表输入到excel每一列的命令大型结果和过滤数据的支持分页而且你可以直接部署不需要代码仅仅是执行一个小目标JSR入口上的应用程序以及OpenXava的look & feel能够适用于入口的look & feel这就是一个应用程序准备产出的第一步
少量的工作完美的结果
观察这里RnR 与 OX之间的差别一个冷静的观点是在RnR中你先输入表而在OpenXava中先输入类别
控制器
Rails引起basic CRUD的控制逻辑你在下面可以看到
图七
另一方面OX不会为CRUD生成任何代码OpenXava仅有一个属性代码可以执行CRUD和打印将自动化配置给所有的实体你可以书写你自己的属性CRUD逻辑或者你可以为一个特有的实体书写详细逻辑但是你不会为每一个实体设置控制代码使用这种方法你需要维护少量的代码并且你可以改变CRUD独立单元的逻辑
Rails使用合成码OX使用属性代码
你可以在OpenXava wiki上面学到更多的OX控制器知识
增加关联
为了规范在Ruby中从类别增加关联你需要在categoryrb中书写如下代码
图八
以及在reciperb中
图九
相当简单但是你要做更多的工作你必须编译
cookbook\app\views\recipe\_formrhtml
增加如下代码
<p><labelfor=recipe_category_id>Category</label><br/>
<%= select(recipe category_id Categoryfind(:llect{|c| [cname cid] }) %></p>:
结果是
图十
在这个环节OpenXava中你不得不在Categoryjava中使用JPA规定关联
@ManyToOne(optional=false) @DescriptionsList
private Category category;
and in Recipejava:
@OneToMany(mappedBy=category)
private Collection recipes;
而且你不需要接触任何类似HTML代码
应用程序将会显示如下
图十一
你有一个为修改产生的链接或者从这里创建新类别
不增加任何辅助编码如果使用者使用类别单元他将获得每一个类别中准则的收集如下所示
图十二
在这里RnR应用程序还是不具备这种特性你需要书写一些Ruby 和HTML代码来实现一样的结果
在这一块RnR 和 OX的主要差别是在OX中你不需要书写任何HTML类似的代码事实上你连用户界面代码都根本不需要书写
精确的基础资料
Ruby on Rails指导的下一个步骤是为一种特性生成基础资料在RnR中你不得不编译控制编码从而达到这个目的让我们开看看
修改以及更新的方法是增加如下代码行
@recipedate = Timenow
The equivalent in OX is adding the @DefaultValueCalculator annotation in model:
@DefaultValueCalculator(CurrentDateCalculatorclass)
private Date date;
用一种更为公开的方法获得一样的结果
在这里尽管RnR中在控制器上放置的代码OX中统计基础资料的代码为了确认以及业务逻辑一般来说是放在模型上OX促进从控制器转移业务逻辑到模型上
RnR的相关文章中提到我改良模型文件所以我需要重新启动我们的web服务器尽管使用Eclipse WTP 我只需要按一下Ctrl 加上B在浏览器上点击刷新以便于看见OpenXava应用程序上面模型的变化
结论
Ruby on Rails 和 OpenXava之间最主要的差别是RnR是 MVC框架你不得不书写模型和控制器OX是模型驱动框架你只需要书写模型结果就是更少的代码更好的程序
另一个大的不同点是RnR使用被动代码生成方式;这就是说生成代码但是这之后如果你想要扩展或者提炼代码你不得不编译合成码OpenXava不需要使用代码生成器你所拥有的代码都是你所书写的你可以在Java的世界中找到提高生产力的方法