精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Web開發(fā)誰更高效 Java對決Ruby on Rails

原創(chuàng)
開發(fā) 開發(fā)工具 前端
本文意圖展示Java比Ruby更加具有生產(chǎn)力。作者針對《Rolling with Ruby on Rails Revisited》一文中舉出的幾個開發(fā)實例,通過JPA注解下的POJO以及OpenXava模型驅(qū)動框架,進行同樣功能應用的開發(fā)。結果是,這種方法通過較少的代碼以及開發(fā)時間,完成了更加強大的應用。

【51CTO快譯】Ruby on rails是如此的優(yōu)雅,簡單,以及高效。我總是讀到及聽到諸如此類的評價。比如Bill Walton在他的《Rolling with Ruby on Rails Revisited》一文中就這樣寫到:

“現(xiàn)在我告訴你,通過Rails開發(fā)一個web應用能夠比傳統(tǒng)的Java框架快至少十倍,你會怎么想?”

哦,聽聽!快十倍!

事實上,聽到了這些評論之后,我決定學習Ruby on Rails。我需要了解生產(chǎn)力以及編程樂趣的真正關鍵所在。

而摸了摸RoR之后,我發(fā)現(xiàn)它是一個非常傳統(tǒng)的框架,使用著過時的技術:

◆Ruby是動態(tài)語言,這與Smalltalk一樣。我偏愛靜態(tài)語言。

◆Scaffolding使用被動的代碼生成,這與IDE wizards或AppFuse一樣。 我偏愛主動的代碼生成,甚至更好的是沒有代碼生成。

◆以關系數(shù)據(jù)庫為中心:代碼生成器與ActiveRecord引導開發(fā)者先構思表格,其次才是類。我偏愛更加純粹的OO,比如Hibernate,JPA,甚或是ODBMS。

◆MVC:我本來希望看到一個比老式MVC框架更有新意、更好的MVC。

Java的問題:Java開發(fā)者

Java世界中的生產(chǎn)力是個文化問題,而并非技術問題。那并非是Java的錯,而是因為我們。我們Java開發(fā)者需要設計非常美觀的架構,將GoF模式隨處應用,實現(xiàn)一切(代碼的)重復利用,將3 tiers放進我們所有的系統(tǒng)中,并為所有(產(chǎn)品)使用web服務。我們追求的不是簡潔,所以我們才沒有找到它。然而Java是個優(yōu)雅的語言,使用它可以進行更加簡單的軟件開發(fā)。

Java的生產(chǎn)力:另一個渠道

提高生產(chǎn)力的方法之一是使用模型驅(qū)動的法子。那就是,開發(fā)模型的部分,事實上也僅僅開發(fā)我們應用中那模型的部分;然后用一個框架來以此為基礎實現(xiàn)所有應用的開發(fā)。MDA,OpenXava,Trails,NakedObjects,RomaFramework以及JMatter都屬于此類。

目的

我們要做的應用主界面外觀如下:

基本上,該應用旨在實現(xiàn)以下三個功能:

◆顯示食譜列表

◆創(chuàng)建新食譜,以及編輯現(xiàn)有食譜

◆將食譜歸類(如“甜點”或“湯類”)

#p#

Ruby on Rails的***沖鋒

RoR中,***步是創(chuàng)建一個新項目。在命令行下輸入如下字段:

$ rails cookbook2 

然后,創(chuàng)建并設置數(shù)據(jù)庫。

之后則開始編寫最初的代碼。這里的話是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;

很明顯,你需要在數(shù)據(jù)庫中執(zhí)行以上代碼。

***就是,生成Ruby代碼。你需要做的只是在你OS的shell下執(zhí)行如下指令:

$ ruby script\generate scaffold recipe recipe
$ ruby script\generate scaffold category category
        
        

是的。你的RoR應用的最初版已經(jīng)可以運行了。

是的,花費很少的功夫,一個簡單的“create table”,外加執(zhí)行一個wizard。接下來就是看看結果了。

Rails的結果

開發(fā)成果如下:

New category entry page

New category added!

New recepy entry page

少干活,少結果。

#p#

JPA on OX的***沖鋒

現(xiàn)在輪到OpenXava了。OpenXava下的***步是創(chuàng)建一個新項目:

$ ant CreateNewProject.xml -Dproject=CookBook 

然后,創(chuàng)建并設置數(shù)據(jù)庫。

之后則是最初的代碼編寫,這里自然是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;
}

}

***一步則是生成數(shù)據(jù)庫圖表,只要執(zhí)行如下ant target即可:

$ ant updateSchema

是的。你的OpenXava應用的最初版已經(jīng)可以運行了。

是的,花費很少的功夫,一個簡單的POJOs,外加執(zhí)行“updateSchema”。接下來就是看看結果了。

OpenXava的結果

開發(fā)成果如下:

 List Mode

[[2711]]

看,在這里用戶可以創(chuàng)建,更新,刪除,從列表生成PDF,將列表導出至excel,按單獨列排序,對過長列表進行分頁,以及數(shù)據(jù)的過濾。而且,無需任何代碼,只需執(zhí)行一個ant target,你便可以將應用部署在JSR-168的portal中,而且OpenXava的portlet在感官上與這個portal是一致的。

這里,***生成,便得到足以投入生產(chǎn)的應用。

少干活,得到細致的結果。

從哲學的角度來看,RoR與OX的差別就在于,在RoR中先寫表格,OpenXava中先寫類。

#p#

控制器

Rails已經(jīng)生成了用于最基本的CRUD的控制器邏輯如下:

RnR controller

另一方面,OX并沒有為CRUD生成任何代碼。OpenXava只有一個泛型的用于CRUD和Printing的代碼,這段代碼自動指定到所有的實體上。你可以自己編寫泛型CRUD邏輯,或者為某個實體編寫特定的邏輯,但是一個用于每個實體的控制器代碼是沒有的。這種情況下,需要維護的代碼量減少了,而你可以通過修改一處的代碼來實現(xiàn)所有CRUD模塊邏輯的改動。

也就是說,對于控制器,Rails使用生成代碼,而OX使用泛型代碼。

添加關系

要添加食譜與類別之間的關系,在Ruby下需要在category.rb中寫入以下代碼:

Rnr relationship category to recipe

同時在recipe.rb中寫下下段代碼:

Rnr relationship recipe to category

是的,相當簡單。不過還有活兒要做。你需要編輯cookbook2\app\views\recipe\_form.rhtml,加入如下代碼:

﹤p﹥﹤label
for="recipe_category_id"﹥Category﹤/label﹥﹤br/﹥
﹤%= select("recipe", "category_id", Category.find(:all).collect
{|c| [c.name, c.id] }) %﹥﹤/p﹥

結果如下:

Rnr recipe with category

在OpenXava中,則需要用JPA在Category.java中定義如下關系:

@ManyToOne(optional=false) @DescriptionsList
private Category category;

下面是Recipe.java的:

@OneToMany(mappedBy="category")
private Collection﹤Recipe﹥ recipes;

HTML就不用改了。應用看起來是這個效果:

[[2712]]

從這里有鏈接通往修改及創(chuàng)建新類別的功能。

無需添加任何代碼,用戶在訪問類別模塊時便可以得到每個類別下的食譜列表,效果如下:

OpenXava Category with recipes

直至這里,RoR的應用還沒有這個功能,為實現(xiàn)同樣的功能,還需要一些額外的Ruby和HTML代碼。

RoR和OX之間主要的區(qū)別在于,OX下無需編寫HTML代碼。事實上是,UI相關的代碼你一句都不用寫。

計算初始值

Ruby on Rails教程中的下一步,是生成一個屬性的初始值。RoR中,這是通過編輯控制器代碼來實現(xiàn)的。具體如下:

修改new以及update方法,添加下面這行代碼:

@recipe.date = Time.now

相對應的在OX中則是在模型中添加@DefaultValueCalculator注解:

@DefaultValueCalculator(CurrentDateCalculator.class)
private Date date;

這樣,通過更加有說明性的方法實現(xiàn)了相同的效果。

也就是說,RoR中將代碼放入控制器中,OX下則把用于計算初始值,驗證以及商業(yè)邏輯的代碼放置在模型之中。OX提倡把商業(yè)邏輯從控制器中轉(zhuǎn)移至模型。

另外,純屬好奇:RoR那篇文章中說“修改了模型文件,所以我需要重啟web服務器。”使用Eclipse WTP時,我只需按下Ctrl-B,然后點擊瀏覽器中的刷新,便可以看到我在OpenXava應用中修改模型的效果了。

結論

Ruby on Rails和OpenXava之間的主要區(qū)別在于RoR是一個MVC框架,你需要編寫模型,視圖及控制器。OX是一個模型驅(qū)動框架,你只需編寫模型。結果就是,用更少的代碼實現(xiàn)更好的應用。

另一個很大的不同就是RoR使用被動的代碼生成;也就是說,它為你生成了代碼,但是之后想要擴展或修改的話則需要手動編輯。OpenXava不使用代碼生成,你有的代碼都是自己寫的。

在Java的宇宙間,你可以找到生產(chǎn)力。

原文:Java Kicks Ruby on Rails in the Butt by Javier Paniza

【編輯推薦】

  1. 淺談Java中的編碼理論
  2. TOP50用Ruby on Rails開發(fā)的網(wǎng)站
  3. 腳本語言排行榜 PHP、Ruby和Python領先
責任編輯:yangsai 來源: 51CTO.com
相關推薦

2010-08-13 08:59:58

Rails

2016-01-04 11:04:17

Web開發(fā)Ruby

2017-10-09 08:45:13

編程語言Amazon AtheSharePoint

2022-07-25 17:44:59

編程計算機

2009-08-27 10:21:22

Ruby on Rai

2017-11-29 14:48:01

Node.JSRails語言

2009-12-14 15:37:35

Ruby on Rai

2009-07-20 09:12:54

Ruby on Rai

2010-07-27 09:06:11

Ruby on Rai

2009-08-06 09:13:36

Ruby on Rai

2009-04-23 09:39:31

Ruby on Rai開發(fā)網(wǎng)站

2011-08-05 08:57:14

Ruby

2009-12-18 11:14:26

Ruby On Rai

2010-07-13 09:31:08

RubyRuby on Rai

2015-10-14 17:27:18

性能

2009-12-14 15:30:43

安裝Ruby on R

2009-12-17 14:29:50

Ruby on Rai

2009-08-06 18:06:33

WebMethod框架

2009-12-16 16:37:59

Ruby on Rai

2015-10-10 11:00:05

RubyRails性能
點贊
收藏

51CTO技術棧公眾號

国产精品一级片在线观看| 天天操天天射天天舔| 久久综合电影| 欧美不卡123| 欧美日韩黄色一级片| 亚乱亚乱亚洲乱妇| 成人午夜看片网址| 亚洲综合免费观看高清完整版在线| 婷婷六月综合网| 日本黑人久久| 草逼视频免费看| 亚洲欧美日韩视频二区| 久久久av一区| 在线免费观看麻豆| 亚洲精品高潮| 欧美日韩一区二区三区高清| 日韩精品视频在线观看视频 | 国产精品一区二区三区乱码| 欧美一区二区大胆人体摄影专业网站| 99久久99久久精品国产| 久久av资源| 欧美一区二区网站| 欧美日韩大尺度| 91超碰免费在线| 国产精品区一区二区三区| 国内一区二区三区在线视频| 国产特级黄色片| 日韩av一区二| 欧美一级片一区| 国产一级片免费观看| 日韩欧美视频专区| 亚洲欧美在线免费观看| 国产黑丝在线观看| 日韩免费高清视频网站| 欧美裸体一区二区三区| av网址在线观看免费| 高清精品在线| 亚洲第一福利视频在线| 精品无码av无码免费专区| 天堂av免费在线观看| 亚洲国产一区二区三区a毛片| 日韩中文字幕在线看| 无码h肉动漫在线观看| 免费观看成人www动漫视频| 精品日本一线二线三线不卡| 日韩欧美色视频| 国产美女亚洲精品7777| 欧美老人xxxx18| 中文字幕中文在线| 久久久精品一区二区毛片免费看| 国产91一区| 亚洲在线免费播放| 久久久久久久免费视频| 黄色国产网站在线播放| 亚洲天堂2016| 丰满女人性猛交| av电影高清在线观看| 成人欧美一区二区三区白人| 一区二区三区久久网| 婷婷激情在线| 亚洲人成精品久久久久| 国产一二三四区在线观看| 中文字幕中文字幕在线中高清免费版 | 一区二区三区精密机械公司| 国产一级不卡视频| 丁香花在线电影小说观看| 亚洲国产日韩在线一区模特| 一二三四视频社区在线| 女海盗2成人h版中文字幕| 欧美日韩在线视频观看| 日韩一级片播放| 香蕉久久一区| 日韩欧美一区二区在线视频| 扒开伸进免费视频| 台湾佬综合网| 怡红院精品视频| 二区三区四区视频| 欧美日韩专区| 欧亚精品中文字幕| 亚洲一区二区天堂| 国产精品白丝av| 久久综合婷婷综合| 日韩免费网站| 天天综合天天做天天综合| 久热免费在线观看| 国产美女精品视频免费播放软件| 亚洲国产高潮在线观看| 久久久久久久久久久久久久久| 全球成人免费直播| 欧美国产日韩视频| jizz国产在线观看| 国产在线精品免费av| 国产乱码一区| 少妇久久久久久久| 久久成人18免费观看| 成人综合色站| 国产精品偷伦视频免费观看国产| 日韩人妻精品中文字幕| 久久66热re国产| 国产欧美日韩亚洲| av福利精品| 亚洲一区在线观看视频| 天天影视综合色| 日韩欧美激情电影| 在线看国产精品| 日韩伦理在线视频| 精品一区二区在线免费观看| 精品在线观看一区二区| 免费av在线播放| 欧美性猛交xxxx久久久| 特级西西444www| 亚洲精品亚洲人成在线观看| 久久综合五月天| 在线天堂中文字幕| 国产高清精品久久久久| 亚洲国产一区二区精品视频| 国产激情在线播放| 日韩精品一区二区三区四区| 91无套直看片红桃在线观看| 中日韩男男gay无套| 91gao视频| 婷婷在线视频观看| 在线观看亚洲一区| 欧美深性狂猛ⅹxxx深喉| 在线观看国产精品入口| 国产精品免费网站| 日本护士...精品国| 亚洲第一福利视频在线| 亚洲欧美日韩中文字幕在线观看| 成人在线一区| 日本亚洲欧美成人| 亚州精品国产精品乱码不99按摩| 亚洲欧美另类综合偷拍| 亚洲一级免费观看| 小说区图片区色综合区| 久久久久国产精品免费| www.天堂在线| 亚洲欧美激情在线| 中文字幕一区二区在线观看视频 | 玖玖精品在线| 亚洲香蕉成视频在线观看| 久久午夜免费视频| av免费在线一区| 不卡一卡二卡三乱码免费网站| 色婷婷777777仙踪林| 亚洲热av色在线播放| 日韩中文字幕在线视频播放| 久久精品五月天| 国产午夜精品久久久久久久| 欧美日韩一区二区在线免费观看| 香蕉视频一区| 国产成人+综合亚洲+天堂| 东热在线免费视频| 欧美亚日韩国产aⅴ精品中极品| 谁有免费的黄色网址| 日韩黄色在线观看| 水蜜桃一区二区三区| 成人av色网站| 久久精品电影网站| 国产精品久久久久久69| 一区二区日韩电影| 中文字幕a在线观看| 亚洲免费综合| 日韩精品久久久| 3d动漫一区二区三区在线观看| www日韩中文字幕在线看| 国产片在线播放| 亚洲一卡二卡三卡四卡无卡久久| 欧美肉大捧一进一出免费视频| 国产精品乱看| 亚洲国产欧洲综合997久久 | 亚洲毛片亚洲毛片亚洲毛片| 久久机这里只有精品| 麻豆映画在线观看| 加勒比久久高清| 国产精品久久久久77777| 日本天堂在线观看| 亚洲精品一线二线三线| 久草视频一区二区| 中文字幕欧美一| 无码人妻丰满熟妇区毛片蜜桃精品| 亚洲精品字幕| 亚洲精品在线视频观看| 香蕉大人久久国产成人av| 97av在线影院| 视频一区二区三区不卡| 亚洲成人激情图| 国产无遮挡又黄又爽又色视频| 综合久久给合久久狠狠狠97色| 国产高清成人久久| 麻豆精品在线播放| 99在线免费视频观看| 精品理论电影在线| 成人午夜电影在线播放| 在线观看av网页| 精品二区视频| 香蕉久久夜色| 韩国女主播一区二区三区| 亚洲色图国产精品| 国产一区二区女内射| 精品久久久精品| www.99re7| 国产桃色电影在线播放| 亚洲电影在线一区二区三区| 国产精品一区二区欧美黑人喷潮水| 成人片免费看| 色综合久久88色综合天天看泰| 国产在线观看免费网站| 精品国产免费久久| 一级黄色录像大片| 色先锋aa成人| 国产无遮挡又黄又爽| 中文字幕一区二区三区在线播放| 艳妇乳肉亭妇荡乳av| 国精产品一区一区三区mba桃花| 成人在线免费观看av| 激情国产一区| 国产91在线亚洲| 欧美韩日高清| 欧美下载看逼逼| 欧美黄色影院| 99免费在线观看视频| 香蕉成人在线| 91精品国产自产在线| 天天综合网站| 欧美一区视频在线| 国产色播av在线| 色综合视频网站| gogo在线观看| 久久精品国产欧美激情| 91精品国产91久久久久游泳池| 亚洲精品自拍视频| 图片区 小说区 区 亚洲五月| 精品国产伦一区二区三区免费 | 97超碰在线免费| 欧美乱妇高清无乱码| 2024最新电影免费在线观看| 日韩在线观看高清| 18免费在线视频| 国产一区二区三区丝袜 | ccyy激情综合| 91免费版网站在线观看| 日韩精品一区二区三区中文| 亚洲中国色老太| 久久在线观看| 91中文在线视频| 欧美视频三区| 成人国产1314www色视频| 香蕉大人久久国产成人av| 亚洲www视频| 国产aaaaa毛片| 小小影院久久| 日本丰满大乳奶| 国产专区一区| 日韩伦理在线免费观看| 国产视频一区二| 亚洲a级在线播放观看| 国产一区二区三区免费在线 | 国产精品久线观看视频| www.com.av| 尤物视频一区二区| 国产一级二级三级| 五月婷婷另类国产| 中文字幕精品无码一区二区| 欧美日韩在线播放三区四区| 97caocao| 精品国产欧美一区二区| 亚州av在线播放| 最近2019中文字幕mv免费看| av激情在线| 久久人人爽人人| 芒果视频成人app| 国产欧美一区二区三区视频 | 亚洲电影免费观看高清完整版在线观看 | 农村寡妇一区二区三区| 清纯唯美亚洲综合一区| 国产1区2区3区中文字幕| 99精品免费| 在线观看的毛片| 国产aⅴ综合色| 国产又粗又猛又爽视频| 亚洲欧洲日韩女同| 日本天堂网在线观看| 在线精品视频小说1| 国产夫妻在线观看| 亚洲毛片在线看| 在线电影福利片| 日本成人在线视频网址| 国产精品亚洲综合在线观看| 鲁丝一区鲁丝二区鲁丝三区| 99久精品视频在线观看视频| 亚洲不卡中文字幕无码| 久久99久久精品欧美| 一本色道综合久久欧美日韩精品| 国产精品乱人伦| 福利一区二区三区四区| 欧美日韩成人综合天天影院 | 欧美精品久久久久久久自慰| 蜜桃久久久久久| a级一a一级在线观看| 中文字幕一区二区三区不卡| www成人在线| 91精品国产免费| 国产精品二线| 国内精品久久久久影院优| 色999久久久精品人人澡69| 精品日本一区二区三区| 欧美一区二区| 日韩av在线看| www.av网站| 国产一区二区三区丝袜| 538视频在线| 成人国产精品色哟哟| 杨幂一区二区三区免费看视频| 天天做天天躁天天躁| 麻豆一区二区99久久久久| 国产美女免费无遮挡| 亚洲电影第三页| 亚洲成a人片77777精品| 色偷偷av亚洲男人的天堂| 欧洲亚洲两性| 久久99精品久久久久久久久久| 欧美精品18| 99精品视频免费版的特色功能| 亚洲国产精品99久久久久久久久 | 欧美在线观看视频一区二区| 午夜性色福利影院| 久久久久亚洲精品| 午夜精品在线| 日韩欧美视频免费在线观看| 精品一区二区三区视频| 纪美影视在线观看电视版使用方法| 欧美日韩在线视频首页| 蜜臀av中文字幕| 欧美激情小视频| 日本亚洲视频| 日韩中文字幕亚洲精品欧美| 国精产品一区一区三区mba视频| www亚洲色图| 欧美亚洲国产一区二区三区va | 日本成人动漫在线观看| 色综合久久精品亚洲国产| 伊人精品综合| 福利视频免费在线观看| 国产69精品久久777的优势| 久草免费在线观看视频| 欧美成人a∨高清免费观看| 色帝国亚洲欧美在线| 都市激情久久久久久久久久久| 欧美激情91| 99re这里只有| 姬川优奈aav一区二区| 免费黄网站在线观看| 国产成人91久久精品| 日韩精品永久网址| 99九九精品视频| 一区二区三区日韩在线观看| 国产香蕉在线观看| 91精品国产九九九久久久亚洲| 蜜桃tv一区二区三区| www.色偷偷.com| 国产精品国产自产拍高清av| 国产又粗又猛又黄又爽无遮挡| 久久在线免费视频| 99国产精品免费网站| 你懂的av在线| 日本一区免费视频| 国产精品爽爽久久久久久| 欧美另类老女人| 欧美交a欧美精品喷水| 亚欧在线免费观看| 亚洲特级片在线| 日韩一级片免费观看| 国产精品jizz在线观看麻豆| 久久久影院免费| 亚洲一级Av无码毛片久久精品| 自拍视频在线看| 国产一区二区三区四区五区加勒比 | **国产精品| 国产在线视频综合| 91在线小视频| 中文字幕在线观看精品| 欧美国产在线视频| 日韩精品福利一区二区三区| 五月婷婷六月丁香激情| 亚洲国产乱码最新视频| 免费毛片在线| 99久久伊人精品影院| 丝袜美腿亚洲色图| 欧美三级免费看| 亚洲视频在线视频| 日韩一区网站| 美女喷白浆视频| 午夜天堂影视香蕉久久| 亚洲精品传媒| 九色一区二区| 国产伦精品一区二区三区视频青涩 | 葵司免费一区二区三区四区五区| 黄色片子在线观看| 亚洲欧美另类中文字幕|