`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. LIGHT OJ 1199 - Partitioning Game

    传送门 1199 - Partitioning Game    PDF (English) problem=1199" style="color:rgb(79,107,114)&q ...

  2. cassandra java 兼容性问题及其解决方法

    1.安装 http://wiki.apache.org/cassandra/DebianPackaging 2.java兼容性问题 由于cassandra运行于sun jdk6上,而ubuntu默认是 ...

  3. 适合移动端与PC端的 CSS Reset - m_base.css

    文章来源:http://www.cnblogs.com/HCJJ/p/6399185.html 具体代码 @charset "utf-8"; html { -ms-text-siz ...

  4. 温故而知新 原来 cheerio 还可以操作XML

  5. mysql 8.0 java连接报错:Unknown system variable 'query_cache_size'

    java连接mysql 8.0.11报错 java.sql.SQLException: Unknown system variable 'query_cache_size' at com.mysql. ...

  6. postman发送post数据到node.js中

    使用get请求我们很容易的来利用postman来发送数据,但是今天的express在使用postman进行post请求的时候,竟然解析的body是空对象.在网上找了一下果然有解决方法,如下: 因为是P ...

  7. gitlab 迁移、升级打怪之路:8.8.5--> 8.10.8 --> 8.17.8 --> 9.5.9 --> 10.1.4 --> 10.2.5

    gitlab 迁移.升级打怪之路:8.8.5--> 8.10.8 --> 8.17.8 --> 9.5.9 --> 10.1.4 --> 10.2.5 gitlab 数据 ...

  8. 解决NavicatPremium导入CSV文件中文乱码的问题

    在做数据对接导入的时候对方提供的数据是CSV格式的文件 一开始用Excel打开时发现格式就不对,后来发现只要用Excel打开,就会破坏里面的格式 然后想先用NaviCat导入CSV再转成Excel格式 ...

  9. Django在Win7下安装与创建项目hello word示例

    Django在Win7下的安装及创建项目hello word的例子 有关python 的django 框架安装与开发的小例子.Django在Win7下的安装及创建项目hello word.1.安装:命 ...

  10. vue.js 首屏优化

    我们以 vue-cli 工具为例,使用 vue-router 搭建SPA应用,UI框架选用 element-ui , ajax方案选用 axios, 并引入 vuex ,使用 vuex-router- ...