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 scriptgenerate scaffold recipe recipe
$ ruby scriptgenerate 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中:
圖九
相當簡單.但是,你要做更多的工作,你必須編譯.
cookbook2appviewsrecipe_form.rhtml
增加如下代碼:
<%= select("recipe", "category_id", Category.find(:all).collect{|c| [c.name, c.id] }) %></p>:
<p><labelfor="recipe_category_id">Category</label><br/>
結果是:
圖十
在這個環節,OpenXava中,你不得不在Category.java中使用JPA規定關聯:
@ManyToOne(optional=false) @DescriptionsList private Category category; and in Recipe.java: @OneToMany(mappedBy="category") private Collection |
圖十一
你有一個為修改產生的鏈接或者從這裡創建新類別.
不增加任何輔助編碼,如果使用者使用類別單元,他將獲得每一個類別中準則的收集,如下所示:
圖十二
在這裡,RnR應用程序還是不具備這種特性,你需要書寫一些Ruby 和HTML代碼來實現一樣的結果.
在這一塊,RnR 和 OX的主要差別是,在OX中你不需要書寫任何HTML類似的代碼,事實上你連用戶界面代碼都根本不需要書寫.
精確的基礎資料
Ruby on Rails指導的下一個步驟是為一種特性生成基礎資料.在RnR中你不得不編譯控制編碼從而達到這個目的.讓我們開看看.
修改以及更新的方法是增加如下代碼行:
@recipe.date = Time.now The 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 與Ruby on Rails對接已經有594次圍觀