程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java 與Ruby on Rails對接

Java 與Ruby on Rails對接

編輯:關於JAVA
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都是采用的這種方式。

  目標

  這是所需要應用程序的主要界面:

  Java 與Ruby on Rails對接

  圖一

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

  · 列出所有准則的清單

  · 創造新准則和編輯現有的准則

  · 為某個類別指定合適的准則

  Ruby on Rails第一次沖刺

  使用RnR的第一步是創建一個新的項目,在命令行你需要輸入:

  $ rails cookbook2

  現在你必須創建以及配置你的數據庫。

  現在是時間輸入你的第一行代碼了,在這個例子中使用SQL代碼:

  

      drop tableif exists recipes;

  drop table if exists categorIEs;

  create table categorIEs (

  id intnot 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 textnull,

  constraint fk_recipes_categorIEsforeign 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結果

  這是應用程序的結果:

  Java 與Ruby on Rails對接

  圖二

  Java 與Ruby on Rails對接

  圖三

  Java 與Ruby on 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 classRecipe {

  @Id @GeneratedValue @Hidden

  private Integerid;

  @Required @Column(length=100)

  private Stringtitle;

  @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結果

  這是應用程序的結果:

  Java 與Ruby on Rails對接

  圖五

  Java 與Ruby on Rails對接

  圖六

  注意,用戶可以創建更新、刪除、從列表生成PDF、將列表輸入到Excel、每一列的命令、大型結果和過濾數據的支持分頁。而且你可以直接部署,不需要代碼,僅僅是執行一個小目標,JSR-168入口上的應用程序,以及OpenXava的look &feel能夠適用於入口的look & feel。這就是一個應用程序准備產出的第一步。

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

  觀察這裡RnR 與 OX之間的差別,一個冷靜的觀點是在RnR中,你先輸入表,而在OpenXava中先輸入類別。

  控制器

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

  Java 與Ruby on Rails對接

  圖七

  另一方面,OX不會為CRUD生成任何代碼,OpenXava僅有一個屬性代碼,可以執行CRUD和打印,將自動化配置給所有的實體。你可以書寫你自己的屬性CRUD邏輯,或者你可以為一個特有的實體書寫詳細邏輯,但是你不會為每一個實體設置控制代碼。使用這種方法,你需要維護少量的代碼,並且你可以改變CRUD獨立單元的邏輯。

  Rails使用合成碼,OX使用屬性代碼。

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

  增加關聯

  為了規范在Ruby中從類別增加關聯,你需要在category.rb中書寫如下代碼:

  Java 與Ruby on Rails對接

  圖八

  以及在recipe.rb中:

  Java 與Ruby on Rails對接

  圖九

  相當簡單。但是,你要做更多的工作,你必須編譯。

  cookbook2\app\vIEws\recipe\_form.rHtml

  增加如下代碼:

     

      <p><labelfor="recipe_category_id">Category</label><br/>

      <%= select("recipe", "category_id", Category.find(:all).collect{|c| [c.name, c.id] }) %></p>:

  結果是:

  Java 與Ruby on Rails對接

  圖十

在這個環節,OpenXava中,你不得不在Category.Java中使用JPA規定關聯:

  

     @ManyToOne(optional=false) @DescriptionsList

  private Category category;

  and in Recipe.Java:

  @OneToMany(mappedBy="category")

  private Collection recipes;

  而且你不需要接觸任何類似Html代碼。應用程序將會顯示如下:

  Java 與Ruby on Rails對接

  圖十一

  你有一個為修改產生的鏈接或者從這裡創建新類別。

  不增加任何輔助編碼,如果使用者使用類別單元,他將獲得每一個類別中准則的收集,如下所示:

  Java 與Ruby on Rails對接

  圖十二

  在這裡,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的世界中找到提高生產力的方法。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved