日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
Web開(kāi)發(fā)誰(shuí)更高效Java對(duì)決RubyonRails

Ruby on rails是如此的優(yōu)雅,簡(jiǎn)單,以及高效。我總是讀到及聽(tīng)到諸如此類的評(píng)價(jià)。比如Bill Walton在他的《Rolling with Ruby on Rails Revisited》一文中就這樣寫(xiě)到:

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

哦,聽(tīng)聽(tīng)!快十倍!

事實(shí)上,聽(tīng)到了這些評(píng)論之后,我決定學(xué)習(xí)Ruby on Rails。我需要了解生產(chǎn)力以及編程樂(lè)趣的真正關(guān)鍵所在。

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

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

◆Scaffolding使用被動(dòng)的代碼生成,這與IDE wizards或AppFuse一樣。 我偏愛(ài)主動(dòng)的代碼生成,甚至更好的是沒(méi)有代碼生成。

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

◆MVC:我本來(lái)希望看到一個(gè)比老式MVC框架更有新意、更好的MVC。

Java的問(wèn)題:Java開(kāi)發(fā)者

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

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

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

目的

我們要做的應(yīng)用主界面外觀如下:

基本上,該應(yīng)用旨在實(shí)現(xiàn)以下三個(gè)功能:

◆顯示食譜列表

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

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

#p#

Ruby on Rails的***沖鋒

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

$ rails cookbook2 

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

之后則開(kāi)始編寫(xiě)最初的代碼。這里的話是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ù)庫(kù)中執(zhí)行以上代碼。

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

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

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

是的,花費(fèi)很少的功夫,一個(gè)簡(jiǎn)單的“create table”,外加執(zhí)行一個(gè)wizard。接下來(lái)就是看看結(jié)果了。

Rails的結(jié)果

開(kāi)發(fā)成果如下:

少干活,少結(jié)果。

#p#

JPA on OX的***沖鋒

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

$ ant CreateNewProject.xml -Dproject=CookBook 

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

之后則是最初的代碼編寫(xiě),這里自然是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ù)庫(kù)圖表,只要執(zhí)行如下ant target即可:

$ ant updateSchema

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

是的,花費(fèi)很少的功夫,一個(gè)簡(jiǎn)單的POJOs,外加執(zhí)行“updateSchema”。接下來(lái)就是看看結(jié)果了。

OpenXava的結(jié)果

開(kāi)發(fā)成果如下:

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

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

少干活,得到細(xì)致的結(jié)果。

從哲學(xué)的角度來(lái)看,RoR與OX的差別就在于,在RoR中先寫(xiě)表格,OpenXava中先寫(xiě)類。

#p#

控制器

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

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

也就是說(shuō),對(duì)于控制器,Rails使用生成代碼,而OX使用泛型代碼。

添加關(guān)系

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

同時(shí)在recipe.rb中寫(xiě)下下段代碼:

是的,相當(dāng)簡(jiǎn)單。不過(guò)還有活兒要做。你需要編輯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﹥

結(jié)果如下:

在OpenXava中,則需要用JPA在Category.java中定義如下關(guān)系:

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

下面是Recipe.java的:

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

HTML就不用改了。應(yīng)用看起來(lái)是這個(gè)效果:

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

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

直至這里,RoR的應(yīng)用還沒(méi)有這個(gè)功能,為實(shí)現(xiàn)同樣的功能,還需要一些額外的Ruby和HTML代碼。

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

計(jì)算初始值

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

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

@recipe.date = Time.now

相對(duì)應(yīng)的在OX中則是在模型中添加@DefaultValueCalculator注解:

@DefaultValueCalculator(CurrentDateCalculator.class)
private Date date;

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

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

另外,純屬好奇:RoR那篇文章中說(shuō)“修改了模型文件,所以我需要重啟web服務(wù)器?!笔褂肊clipse WTP時(shí),我只需按下Ctrl-B,然后點(diǎn)擊瀏覽器中的刷新,便可以看到我在OpenXava應(yīng)用中修改模型的效果了。

結(jié)論

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

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

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

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


網(wǎng)站欄目:Web開(kāi)發(fā)誰(shuí)更高效Java對(duì)決RubyonRails
標(biāo)題鏈接:http://www.5511xx.com/article/dhiehci.html