文档章节

martini备忘录

ricktian1226
 ricktian1226
发布于 2014/06/21 16:12
字数 621
阅读 59
收藏 0

martini框架有两大核心功能:

1、注册处理函数功能

注册方法有三个:

Martini 对象设置Handler的方法:

  • Use 一次设置一个 handler

  • Handlers 一次设置全部 handler, 除了最后一个 Invoke 的 handler

  • Action 设置的最后一个被 Invoke的 Handler(内部成员单独命名为 action ). 通常是 Router.Handle.

Martini.ServeHTTP 方法主要执行了 m.createContext(res, req).run()

Context

Martini 对象在收到 http.Request 的时候动态创建 context, 并把所有的 handlers copy 一份给 context.

所有的 handlers 在 context.run 方法中被遍历 Invoke. 当遇到 error 或者有 Written 发生终止遍历.


2、路由功能

按照注册的请求类型已经请求url内容的匹配,调用对应的处理函数

Router

Router 有自己独立的 handlers.

每一个RESTful 方法都会构建一个 Route, 通过 RESTful 方法设置 Route handlers.

NotFound 设置 notFounds handlers.

Router.Handle 在 context.run 中被最后 Invoke.

Router.Handle 遍历匹配所有的 routes, 如果匹配到一个route, 通过 context.Invoke(route.Handle) 进行调用.

如果没有匹配到 route, 动态构建 routeContext 并把 notFounds 作为其 handlers 进行 routeContext.run.

Route

route.Handle 方法动态构建 routeContext 并把 route.handlers 作为其 handlers 进行 routeContext.run.

routeContext

routeContext.run 方法遍历并 Ivoke 所有的 routeContext.handlers, 当遇到 error 或者有 Written 发生终止遍历.

ResponseWriter.beforeFuncs

ResponseWriter 是在 Martini.createContext 的时候被动态 MapTo Context了.

ResponseWriter.Before 可以添加 beforeFuncs, beforeFuncs 会在任何 Write 操作前以倒序遍历调用一次.

当然 Before 在某个handler中才能被调用到.

Context.Next

前文参见 Martini 的工作方式 中曾经简单提到, Martini 内置Handler Logger和Recovery 是如何配合 Context.Next 进行工作的. 虽然Logger和Recovery的具体功能很简单.

这非常实用. 在使用 Handler 的时候切勿忘记.

使用

通过上述分析可知

  • 所有的 Martini.handlers 都会被调用, 发生 error 或 Written 终止.

  • 所有匹配到的 Route.handlers 都会被调用, 发生 error 或 Written 终止.

  • 所有 ResponseWriter.beforeFuncs 在 Write 时会先被倒序调用一次.

  • Martini 的 Action 方法提供了机会允许使用者自己控制 Router.Handle.

  • 在 Handler 中与 context.Next() 的配合.

可以用通过下列途径使用 Handler

  • Martini.Use 或者 Martini.Handlers 设置 handlers.

  • Router 的 RESTful(pattern string, h …Handler) 方法 设置 handlers.

  • Router.NotFound 设置 notFounds.

  • 在 Handler 中设置 beforeFuncs.

这些 Handlers, notFounds, beforeFuncs 形成了调用队列, Handlers 和 notFounds 有明确的终止队列条件.


参考 http://my.oschina.net/achun/blog/197546



本文转载自:

共有 人打赏支持
ricktian1226
粉丝 0
博文 7
码字总数 2728
作品 0
厦门
cordova-hcp server 报错

Running serverCould not create tunnel: Error: panic: runtime error: invalid memory address or nil pointer dereference github.com/inconshreveable/olive/recover.go:40runtime/asm_a......

mamie42
2016/10/17
121
0
Martini 极好的 Go WEB 框架

已知的其他框架看到的是传统OOP的影子, 到处充蚀 Class 风格的 OOP 方法. 而我们知道GoLang中是没有Class的. 笔者也曾努力用Go 的风格做WEB开发, 总感到力不从心. 写出的代码不能完全称之为框...

喻恒春
2014/01/07
0
16
Martini 中的 Handler

前文参见 Martini 的工作方式 Handler 在Martini中是这样定义的 事实上 Handler 就是一个函数. Handler 贯穿于多个对象中. Martini Martini 对象设置Handler的方 Use 一次设置一个 handler ...

喻恒春
2014/02/07
0
1
Martini 组件和实用工具--martini-contrib

martini-contrib 是一个贡献 Martini 的处理程序和实用工具,这个包包括了各种添加到 Martini 上面的组件和一个高级的GO web 框架。

叶秀兰
2014/01/14
478
0
Python/Ruby/Go/Node 之四国大战

Python Flask vs Ruby Sinatra vs Go Martini vs Node Express 本文授权转载自 zybuluo 博客。 题外话一:最近一段时间,Cloud Insight 接连发布了三种语言(Python, Node, Ruby)的SDK,Clo...

OneAPM蓝海讯通
2016/03/17
136
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

又一个centos文件顺序导致的问题

背景 新的centos似乎对于文件顺序做了特别的优化 和文件顺序出现的问题确实多了不少 centos7导致的spring循环依赖【实际上和这个问题不一样 不过由此衍生出的问题】 某应用放在新的系统开始报...

Mr_Qi
11分钟前
0
0
阿里云国际版香港CN2测评 月付9美元/30M带宽/1T流量

市面上很多家香港VPS服务商,一直都说阿里云国际版香港CN2线路好,延迟低,速度快,价格便宜流量还多,那么这个香港线路到底怎么样呢?本文从性能、延时、路由、速度方面来全方面测评一下阿里...

flyzy2005
54分钟前
0
0
撤销git commit --amend

it commit -amend之后想撤销 git reset HEAD@{1}

xiaomge
59分钟前
0
0
有意思的TimeUnit

java.util.concurrent.TimeUnit 这个类,相信童鞋们都不陌生。它是一个enum: public enum TimeUnit 好吧,我一直把它当做一个枚举类来用。偶然看到还有别的用法,大吃一斤,原来 TimeUnit 并...

polly
今天
10
0
生成pyc

Python生成pyc文件 pyc文件是py文件编译后生成的字节码文件(byte code)。pyc文件经过python解释器最终会生成机器码运行。所以pyc文件是可以跨平台部署的,类似Java的.class文件。一般py文件改...

Mr_Tea伯奕
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部