`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. SharePoint 2013 Farm 安装指南——Least Privilege

    写过很多关于SharePoint 2013 安装,这是第四篇.可能你会觉得为什么如此简单的安装至于花那么多精力去折腾吗.我的答案是肯定的.知识的积累不是一蹴而就的,而是循序渐进的去学习,每一个阶段都有 ...

  2. ADS错误the session file 'C:\user\username\default-1-2-0-0.ses' could not be loaded解决办法

    问题描述:用ADS1.2 + H-JTAG或者是H-Jlink,每次调试的时候都会出现“the session file could not be loaded”这个错误,寻求解决办法?问题解答:用户 ...

  3. 深入理解Linux内核-内存管理

    内核如果给自己分配动态内存 动态内存:RAM的某些部分被永久打分配给内核,用来存放内核代码以及静态内核数据结构:剩余的部分被称为动态内存 连续物理内存区管理: 页框管理:1.页大小的选择,通常情况下主 ...

  4. [Windows Azure] How to Create and Deploy a Cloud Service?

    The Windows Azure Management Portal provides two ways for you to create and deploy a cloud service: ...

  5. Ctex中WinEdt经常弹出注册小窗口 解决办法

    使用WinEdt 7避免跳出“注册对话框” 在options菜单下点options…,在advanced configuration  =>  Event Handlers  下点Exit, 在 ...

  6. 每日英语:The Risks of Big Data for Companies

    Big data. It's the latest IT buzzword, and it isn't hard to see why. The ability to parse more infor ...

  7. tensorflow笔记3:CRF函数:tf.contrib.crf.crf_log_likelihood()

    在分析训练代码的时候,遇到了,tf.contrib.crf.crf_log_likelihood,这个函数,于是想简单理解下: 函数的目的:使用crf 来计算损失,里面用到的优化方法是:最大似然估计 ...

  8. Frick'ing Terrain Mesh!

    CDLOD地形的实现方法步骤: 1.实现完全二叉树结构的创建2.实现完全四叉树的视锥裁剪与LOD选择(包括节点的部分选择功能)3.使用forward rendering, 实现已选择四叉树节点的普通渲 ...

  9. 关于emoji表情

    /** /* 表情编码 /* @param emoji:表情符号 **/ encodeEmoji: function (content) { var imgHtml = ""; v ...

  10. System.in的用法

    方法1 BufferedReader br = new BufferedReader(new InputStreamReader(System.in));Scanner scanner=new Sca ...