[b]==1.路由[/b]
简单来说,路由就是连接两点通路的查找机制,它不是指静态的两点间的通路,而是指获得通路的一种机制。
[b]==2.web路由[/b]
web路由是解析url请求并找到相应处理者的机制。
[b]==3.rails的路由机制[/b]
[u]实现:[/u]ActionController::Routing::Routes
[u]配置文件:[/u]config/routes.rb
[list]
[*]map.connect声明了外部url和内部代码的一个路由连接。
[*]map.connect支持正则表达式
[/list]
除了map.connect声明方法外,rails还提供了对相关路由以组形式创建的高级方式,这种方式跟REST相关,即Representationl State Transfer,表述状态转移。
这个声明声明了对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]
还可以指定命名空间:
映射了/sport/articles这个路由
[b]==4.routes.rb的配置机制[/b]
ruby的config有两种模式,一种是yaml方式,第二种就是代码模式,routes.rb属于后者。
Routes是Routing这个module中的一个类变量:
而RoutSet是路由具体实现者,它通过一个map内部类来封装了路由配置(config)部分,并且曝露给(yield)外部进行运行时配置:
RoutSet的draw方法是配置的入口点
RouteSet的draw方法:
[b]==5.与javaee框架的路由比较:[/b]
[b]===struts2:[/b]
struts2用package对action(rails叫controller)进行逻辑组合,通常一个功能模块由多个action来实现,对每个action进行具体配置,
[list]
[*]name是url中action的影射url
[*]class是对应的java action类
[*]result是render的目标,如ftl模板
[/list]
[b]===java faces:[/b]
与struts2类似的,struts2要声明action class,faces则要声明bean
并声明导航规则:
[b]总结:[/b]
1. coc和REST使得rails的路由配置更为简单,并且表达能力更为丰富
2. rails对result或者说to-view的处理直接放在controller中,完整性和可读性好
3. 可以在struts2配置文件中使用package继承的方式降低路由配置的复杂度
4. struts2配置文件可以配置拦截器栈(intercepter),应用到package中,实现是以接口、类为粒度,rails只需要在controller中声明before_filter :method,并实现相应过滤方法,粒度更细,实现也更简单。
简单来说,路由就是连接两点通路的查找机制,它不是指静态的两点间的通路,而是指获得通路的一种机制。
[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,并实现相应过滤方法,粒度更细,实现也更简单。