`Routing`路由控制着请求应该由哪些控制器接受。

它在项目的`conf/routes`文件中定义。

格式为:

(METHOD) (URL Pattern) (Controller.Action)
(请求方法) (URL 匹配模式) (Controller.Action)

示例:

# conf/routes
# This file defines all application routes (Higher priority routes first)
GET /login App.Login # 一个简单的路径
GET /hotels/ Hotels.Index # 匹配 /hotels 与 /hotels/ (尾部斜杠选填)
GET /hotels/:id Hotels.Show # 提取一个URI参数
WS /hotels/:id/feed Hotels.Feed # 匹配相应的WebSockets协议
POST /hotels/:id/:action Hotels.:action # 自动匹配相应的action
GET /public/*filepath Static.Serve("public") # 将 /app/public 下的资源路径映射为 /public/...
* /:controller/:action :controller.:action # 捕获所有,自动映射

##简单的URL路径

GET /login App.Login

最简单的路由为精确匹配,它将`/login`转到`App.Login`这个action

##尾部反斜杠

GET /hotels/ Hotels.Index

这里`/hotels/`与`/hotels`路径都会被转到`Hotels.Index`Action,对于尾部的反斜杠,不管有没有都会同等对待。

##URL参数

GET /hotels/:id Hotels.Show

斜杠后`:`标识的字段会被匹配并提取。这里`:id`也就是反斜杠之后的路径将会被匹配提取并传入至Action的方法。

例如`/hotels/123`中,123将会被提取为id。

被提取的参数会被保存至`Controller.Params`,如下方法可以在`Action`中获取参数:

func (c Hotels) Show(id int) revel.Result {
...
}

func (c Hotels) Show() revel.Result {
var id string = c.Params.Get("id")
...
}

func (c Hotels) Show() revel.Result {
var id int
c.Params.Bind(&id, "id")
...
}

##*号通配符

GET /public/*filepath Static.Serve("public")

*号必须位于匹配路径的最末端,它将提取所有符合的字符串。例如,这里将`/public/`之后的所有字符串匹配提取。

##Websockets

WS /hotels/:id/feed Hotels.Feed

`WS`用来定义websockets协议下的路由。它指向的action必须具有如下签名:

func (c Hotels) Feed(ws *websocket.Conn, id int) revel.Result {
...
}

即第一参数必须是`*websocket.Conn`类型。

##静态资源

GET /public/*filepath Static.Serve("public")
GET /favicon.ico Static.Serve("public", "img/favicon.png")

路由中,通过`Static`模块提供制定文件夹的静态文件服务。它只会匹配一个`Static`控制器。它的Action接受两个参数:

**prefix (string)** 指向资源文件的绝对/相对路径

**filepath (string)** 指定文件的相对路径(相对于`prefix`)

## 固定参数

可以像静态资源服务一样将参数使用固定的名称:

GET /products/:id ShowList("PRODUCT")
GET /menus/:id ShowList("MENU")

`Action`名称后加上传入变量的名称,可以将匹配到的参数按顺序转为命名的参数,方便在`Action`中处理。

## 自动路由

POST /hotels/:id/:action Hotels.:action
* /:controller/:action :controller.:action

自动匹配相应的控制器与动作,这里不区分大小写。

上面示例中,第一条路由的调用规则如下:

/hotels/1/show => Hotels.Show
/hotels/2/details => Hotels.Details

第二条调用规则,自动路由方式:

/app/login => App.Login
/users/list => Users.List

在大小写不同时,也会进行相应路由:

/APP/LOGIN => App.Login
/Users/List => Users.List

##反向路由

在使用revel构建项目时,它会根据routes文件生成`app/routes/routes.go`源码。

可以如下格式来在代码中只是用反向路由:

routes.Controller.Action(param1, param2)

下面实例中演示了如何调用反向路由

import (
"github.com/robfig/revel"
"project/app/routes"
)

type App struct { *revel.Controller }

// 显示一个表单
func (c App) ViewForm(username string) revel.Result {
return c.Render(username)
}

// 处理一个提交的表单
func (c App) ProcessForm(username, input string) revel.Result {
...
if c.Validation.HasErrors() {
c.Validation.Keep()
c.Flash.Error("Form invalid. Try again.")
return c.Redirect(routes.App.ViewForm(username)) //

Go Revel - Routing(路由)的更多相关文章

  1. .NET/ASP.NET Routing路由(深入解析路由系统架构原理)

    阅读目录: 1.开篇介绍 2.ASP.NET Routing 路由对象模型的位置 3.ASP.NET Routing 路由对象模型的入口 4.ASP.NET Routing 路由对象模型的内部结构 4 ...

  2. .NET/ASP.NET Routing路由(深入解析路由系统架构原理)http://wangqingpei557.blog.51cto.com/1009349/1312422

    阅读目录: 1.开篇介绍 2.ASP.NET Routing 路由对象模型的位置 3.ASP.NET Routing 路由对象模型的入口 4.ASP.NET Routing 路由对象模型的内部结构 4 ...

  3. NET/ASP.NET Routing路由(深入解析路由系统架构原理)(转载)

    NET/ASP.NET Routing路由(深入解析路由系统架构原理) 阅读目录: 1.开篇介绍 2.ASP.NET Routing 路由对象模型的位置 3.ASP.NET Routing 路由对象模 ...

  4. Microsoft.AspNetCore.Routing路由

    Microsoft.AspNetCore.Routing路由 这篇随笔讲讲路由功能,主要内容在项目Microsoft.AspNetCore.Routing中,可以在GitHub上找到,Routing项 ...

  5. Routing路由

    Routing路由 新版Routing功能介绍 在ASP.NET 5和MVC6中,Routing功能被全部重写了,虽然用法有些类似,但和之前的Routing原理完全不太一样了,该Routing框架不仅 ...

  6. Routing(路由) & Multiple Views(多个视图) step 7

    Routing(路由) & Multiple Views(多个视图) step 7 1.切换分支到step7,并启动项目 git checkout step-7 npm start 2.需求: ...

  7. 一、ASP.NET Routing路由(深入解析路由系统架构原理)

    阅读目录: 1.开篇介绍 2.ASP.NET Routing 路由对象模型的位置 3.ASP.NET Routing 路由对象模型的入口 4.ASP.NET Routing 路由对象模型的内部结构 4 ...

  8. ASP.NET Core MVC 源码学习:Routing 路由

    前言 最近打算抽时间看一下 ASP.NET Core MVC 的源码,特此把自己学习到的内容记录下来,也算是做个笔记吧. 路由作为 MVC 的基本部分,所以在学习 MVC 的其他源码之前还是先学习一下 ...

  9. Erlang cowboy routing 路由

    Erlang cowboy routing 路由 本文译自: http://ninenines.eu/docs/en/cowboy/1.0/guide/routing/ Routing 默认情况下,C ...

随机推荐

  1. CentOS扩展库配置

    背景:经常用到第三方的库,通过yum命令查询不到.例如:yum search ilbcWarning: No matches found for: ilbc 不要感叹,CentOS没你想象的支持力度那 ...

  2. get the code of function in matlab

    >> edit <function>>> edit perform

  3. Hudson基本工作原理

    从SVN下载代码到hudson服务器本地  ->  将SVN下载的源代码,利用maven[maven依赖pom.xml]或者ant[ant依赖build.xml]打包(war包),pom.xml ...

  4. Android开发中无处不在的设计模式——动态代理模式

    继续更新设计模式系列.写这个模式的主要原因是近期看到了动态代理的代码. 先来回想一下前5个模式: - Android开发中无处不在的设计模式--单例模式 - Android开发中无处不在的设计模式-- ...

  5. Java之JDBC①

    JDBC工具准备:Mysql(数据库). MyEclipse(开发工具).Navicat(数据库管理工具) JDBC编程步骤·加载驱动程序:class.forName(driverClass);   ...

  6. FFmpeg(9)-解码器解码代码演示(FFmpeg调用MediaCodec实现硬解码、多线程解码、及音视频解码性能测试)

    一.AVFrame 用来存放解码后的数据. [相关函数] AVFrame *frame = av_frame_alloc();                       // 空间分配,分配一个空间 ...

  7. LoadingController

    --local MainSceneConfig = require "res.scripts.configs.MainSceneConfig" -- 暂时添加一个临时配置文件 -- ...

  8. Speech and Language Processing, NLP 处理

    https://www.amazon.com/Speech-Language-Processing-Daniel-Jurafsky/dp/0131873210 http://web.stanford. ...

  9. Nexus 搭建maven 私有仓库

    nexus如果没有私服,我们所需的所有构件都需要通过maven的中央仓库和第三方的Maven仓库下载到本地,而一个团队中的所有人都重复的从maven仓库下载构件无疑加大了仓库的负载和浪费了外网带宽,如 ...

  10. 【驱动】input子系统全面分析

    初识linux输入子系统 linux输入子系统(linux input subsystem)从上到下由三层实现,分别为:输入子系统事件处理层(EventHandler).输入子系统核心层(InputC ...