简单比较rails与javaee框架的路由配置

[b]==1.路由[/b]
简单来说,路由就是连接两点通路的查找机制,它不是指静态的两点间的通路,而是指获得通路的一种机制。

[b]==2.web路由[/b]
web路由是解析url请求并找到相应处理者的机制。

[b]==3.rails的路由机制[/b]
[u]实现:[/u]ActionController::Routing::Routes
[u]配置文件:[/u]config/routes.rb
ActionController::Routing::Routes.draw do |map|
map.connect "/:controller/:action/:id"
end


[list]
[*]map.connect声明了外部url和内部代码的一个路由连接。
[*]map.connect支持正则表达式
[/list]

除了map.connect声明方法外,rails还提供了对相关路由以组形式创建的高级方式,这种方式跟REST相关,即Representationl State Transfer,表述状态转移。

map.resources :articles


这个声明声明了对articles资源的CRUD等操作路由
[list]
[*]请求创建:/articles/:id/new (get协议)
[*]创建:/articles (post协议)
[*]请求更改:/articles/:id;edit (get协议)
[*]提交更改:/articles/:id (put协议)
[*]删除:/articles/:id (delete协议)
[*]列表:/articles (get协议)
[/list]

也可以用conllection和member来声明新的操作方法

[quote]map.resources :articles, collection=>{:query=>:get}, :member=>{:comment=>:post}[/quote]

resources也可以是嵌套的

[quote]map.resources :articles do |article|
article.resources :comments
end[/quote]

还可以指定命名空间:
map.namespace :sport do |sport|
sport.resources :articles
end


映射了/sport/articles这个路由

[b]==4.routes.rb的配置机制[/b]
ruby的config有两种模式,一种是yaml方式,第二种就是代码模式,routes.rb属于后者。

ActionController::Routing::Routes.draw do |map|
map.xx
end


Routes是Routing这个module中的一个类变量:

module ActionController
module Routing
class << self
Routes=RoutSet.new
end
end
end



而RoutSet是路由具体实现者,它通过一个map内部类来封装了路由配置(config)部分,并且曝露给(yield)外部进行运行时配置:

module ActionController
module Routing
class RouteSet
class Mapper
def connect
end
def namespace
end
end
end
end
end


RoutSet的draw方法是配置的入口点
ActionController::Routing::Routes.draw do |map|
map.connect xxx
map. resources xxx
end


RouteSet的draw方法:
def draw
...
yield Mapper.new(self) #self is RoutSet
end


[b]==5.与javaee框架的路由比较:[/b]

[b]===struts2:[/b]


<package name="pkg" extends="fatherpkg" namespace="/administrator/xx">

<action name="action1" class="xxx.xx.xx">
<result name="success">/administrator/xx/yy.ftl</result>
</action>
...
</package>


struts2用package对action(rails叫controller)进行逻辑组合,通常一个功能模块由多个action来实现,对每个action进行具体配置,
<action name="action1" class="xxx.xxx.xx">
<result name="success"/>
</action>


[list]
[*]name是url中action的影射url
[*]class是对应的java action类
[*]result是render的目标,如ftl模板
[/list]

[b]===java faces:[/b]
与struts2类似的,struts2要声明action class,faces则要声明bean
 <managed-bean>
<managed-bean-name>oneBean</managed-bean-name>
<managed-bean-class>xx.xxx.xxBean</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>


并声明导航规则:
 <navigation-rule>
<from-view-id>/pages/administrator/xx.jsp</from-view-id>
<navigation-case>
<from-outcome>outCome1</from-outcome>
<to-view-id>/pages/administrator/yy.jsp</to-view-id>
<redirect/>
</navigation-case>
</navigation-rule>


[b]总结:[/b]
1. coc和REST使得rails的路由配置更为简单,并且表达能力更为丰富
2. rails对result或者说to-view的处理直接放在controller中,完整性和可读性好
3. 可以在struts2配置文件中使用package继承的方式降低路由配置的复杂度
4. struts2配置文件可以配置拦截器栈(intercepter),应用到package中,实现是以接口、类为粒度,rails只需要在controller中声明before_filter :method,并实现相应过滤方法,粒度更细,实现也更简单。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值