
[关键词]Web应用 Rails 框架 Javascript jQuery
[中图分类号]TP[文献标识码]A[文章编号]1007-9416(2010)02-0039-02
1 前言
随着网络的日益普及,对电子商务和电子政务的需求日趋丰富,越来越多的企业和政府部门都希望将日常管理逐步信息化和网络化。在这种背景下,开发者迫切需要一种能够简化开发过程,降低开发难度,提高开发效率的框架。目前在Web开发平台中人们使用最多的是Sun公司推出的J2EE。J2EE的问题是随着需求的多样化,不断加入的各种组件和各种各样数量不断增加、体积不断膨胀的XML配置管理文件使得J2EE应用体系变得臃肿不堪,在开发和运行速度上越来越不能满足开发者的需求。
而Rails的出现解决了J2EE中各种各样的XML配置管理文件对开发人员的困扰。Rails是基于Ruby语言的Web应用开发框架,该框架的最大特点是“约定优先配置”,和目前其它的一些MVC框架比较,它不需要繁琐复杂以及数量众多的配置文件,它已经订立了一系列使用该框架时要遵守的约定,只要开发人员遵守这些约定,那么可以实现零配置的MVC框架的web应用,极大的降低了使用该框架的难度。
Web应用的开发离不开用户界面的设计和开发。在以往的用户界面开发中,主要使用Javascript脚本语言作为界面互动的开发工具,但Javascript脚本语言存在编写困难、难于理解以及调试困难的缺点,所以众多Javascript框架被开发出来以提供对Javascript的包装,使之功能增强、代码易于理解,这些Javascript框架包括prototype、Moo Tools、dojo、jQuery等。其中jQuery是较晚出现的Javascript框架,但是jQuery以其先进的技术、优秀的代码组织、强大的扩展能力,迅速得到了广大web应用开发人员的青睐。
2 开发工具简介
21 Rails介绍
Rails框架是一个MVC结构的框架,它将应用程序分成如下3个组件:
模型(Model) 处理数据和业务逻辑;
控制器(Controller) 处理用户接口和应用逻辑;
视图(View) 处理图形用户接口对象和表示逻辑。
Web应用程序的MVC模型组件关系如图1所示,具体的处理过程如下:
(1)客户端的浏览器向服务器上的控制器发送页面请求;
(2)控制器处理相应的请求,以对象的方式从模型中获得所需要的数据对象;
(3)控制器将获得的数据对象发送给特定的视图;
(4)视图向客户端发送页面以便浏览器显示。
Rails实现了模型、视图和控制器概念的完全分离,它将各部分的代码分别存储在不同目录下的不同文件中。
Rails会自动创建项目的目录结构,其中存放系统代码的app目录的目录结构如图2所示,从目录名称就可以看到不同模块的文件被放到了不同的目录中,这里Rails的“约定优先配置”的思想得到了体现。
22 jQuery介绍
jQuery是继prototype之后的又一个优秀的Javascript框架。它是由 John Resig 于 2006 年初创建的,它有助于简化 Javascript 以及Ajax 编程,方便用户在网页上简单的 *** 作文档、处理事件、实现特效并为Web页面添加Ajax交互。
它具有如下一些特点:
(2)代码简练、语义易懂、学习快速、文档丰富。
(2)jQuery是一个轻量级的脚本,其代码非常小巧。
(3)jQuery支持CSS1-CSS3,以及基本的xPath。
(4)jQuery是跨浏览器的,它支持的浏览器包括IE 60+, FF 15+, Safari 20+, Opera 90+。
(5)可以很容易的为jQuery扩展其他功能。
(6)能将JS代码和HTML代码完全分离,便于代码和维护和修改。
(7)插件丰富,除了jQuery本身带有的一些特效外,可以通过插件实现更多功能,如表单验证、tab导航、拖放效果、表格排序、DataGrid,树形菜单、图像特效以及ajax上传等。
3 开发实例
项目具体需求如下:为满足消防工作信息化管理的要求,当地消防主管部门需对辖区消防责任单位生成带有文号的消防检查表,然后将检查结果输入系统,系统将根据检查结果决定是否生成整改通知书,整改通知书的内容与检查结果有关。
首先,经过分析,系统内的各个成员的关系如图3所示。
第二步,根据模型的属性,创建数据库以及相关联的model。Rails中,数据库的创建不再是直接访问数据库,而是使用一直叫做Migration的技术,由rails系统根据Migrate文件内容自动维护数据表结构。例如对于Police类,和CheckPaper类可以使用如下命令生成数据库Migration:
ruby script/generate model police name:string password:string
ruby script/generate model check_paper year:integer number:integer police_id:integer
然后再使用命令:
rake db:migrate
即可自动根据Migration文件的内容创建数据表。
在models目录中会自动创建policerb文件,该文件是Police类的定义文件,Rails会自动将数据表中的字段映射称类中的属性,在程序中直接使用Police类对象就可以访问数据库中的内容,用户无需直接同数据表打交道。
从模型图中可以看出Police类和CheckPaper类是一对多的关系,为表达这种关系,并在程序代码中直接使用policecheck_papers语句来访问某位民警所管理的所以消防检查表,需要在创建CheckPaper类的Migration的命令中加入“police_id:integer”,然后在policerb类文件中加入代码:
has_many :check_papers
同时在check_paperrb类文件中加入代码:
belongs_to :police
第三步,创建控制器。创建一个Police控制器,用于对浏览器发送的请求进行响应。
ruby script/generate controller police index
此时会在controllers目录下创建police_controllerrb文件,该文件中有一个PoliceController类,类中有一个index方法,对应浏览器发送过来的index请求。当浏览器的地址栏中输入“> 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都是采用的这种方式
目标
这是所需要应用程序的主要界面
图一
基本上 应用程序推测需要做三件事情
· 列出所有准则的清单
· 创造新准则和编辑现有的准则
· 为某个类别指定合适的准则
Ruby on Rails第一次冲刺
使用RnR的第一步是创建一个新的项目 在命令行你需要输入
$ rails cookbook
现在你必须创建以及配置你的数据库
现在是时间输入你的第一行代码了 在这个例子中使用SQL代码
drop table if exists recipes;
drop table if exists categories;
create table categories (
id int not 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 text null
constraint fk_recipes_categories foreign 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结果
这是应用程序的结果
图二
图三
图四
少量的工作 少量的结果
JPA on OX的第一次冲刺
继续使用OpenXava 使用OpenXava的第一步是创建新的项目
$ ant CreateNewProject xml Dproject=CookBook
现在你必须创建以及配置你的数据库
现在是时间输入你的第一步代码了 在这个例子中使用Java代码
Recipe java:
package okbook model;
import java util ;
import javax persistence ;
import openxava annotations ;
@Entity
@View(members= title; description; date; instructions )
public class Recipe {
@Id @GeneratedValue @Hidden
private Integer id;
@Required @Column(length= )
private String title;
@Column(length= )
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 okbook model;
import java util ;
import javax persistence ;
import openxava annotations ;
@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) {
this id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this name = 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中从类别增加关联 你需要在category rb中书写如下代码
图八
以及在recipe rb中
图九
相当简单 但是 你要做更多的工作 你必须编译
cookbook \app\views\recipe\_form r
增加如下代码
<p><labelfor= recipe_category_id >Category</label><br/>
<%= select( recipe category_id Category find(:llect{|c| [c name c id] }) %></p>:
结果是
图十
在这个环节 OpenXava中 你不得不在Category java中使用JPA规定关联
@ManyToOne(optional=false) @DescriptionsList
private Category category;
and in Recipe java:
@OneToMany(mappedBy= category )
private Collection recipes;
而且你不需要接触任何类似HTML代码 应用程序将会显示如下
图十一
你有一个为修改产生的链接或者从这里创建新类别
不增加任何辅助编码 如果使用者使用类别单元 他将获得每一个类别中准则的收集 如下所示
图十二
在这里 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是模型驱动框架 你只需要书写模型 结果就是更少的代码 更好的程序
lishixinzhi/Article/program/Java/JSP/201311/19267netbeans启动rails应用还得设置服务器?
不好意思。没试过,但是我想应该差不多吧,我用的是redrails,在添加服务器的时候类型选择WEBrick就可以了啊。Glassfish。。。抱歉,我接触比较少,没用过。第一种方式是 直接运行 Rails server指令, 启动Rails服务器, 服务器会自动加载conifg/databaseyml 文件,并按照参数创建数据库,
还有一种方式是, 在不启动服务时,通过rake db:create RAILS_ENV='development' 指令来创建数据库第种式 直接运行 Rails server指令 启Rails服务器 服务器自加载conifg/databaseyml 文件并按照参数创建数据库种式 启服务通rake db:create RAILS_ENV='development' 指令创建数据
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)