文档章节

Martini 中的 Handler

喻恒春
 喻恒春
发布于 2014/02/07 13:14
字数 711
阅读 2074
收藏 7

前文参见 Martini 的工作方式

Handler

在Martini中是这样定义的

<!-- lang: cpp -->
// Handler can be any callable function. Martini attempts to inject services into the handler's argument list.
// Martini will panic if an argument could not be fullfilled via dependency injection.
type Handler interface{}

事实上 Handler 就是一个函数. Handler 贯穿于多个对象中.

Martini

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 发生终止遍历.

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 有明确的终止队列条件.

Martini 社区组件

开发者建立了 martini-contrib 组织. 这样的管理方式更开放. 事实上这样符合 Martini Injector 的风格, 组件之间的依赖可以通过 Injector 的 Map/Invoke 机制完成.

© 著作权归作者所有

喻恒春

喻恒春

粉丝 110
博文 31
码字总数 22644
作品 5
郑州
程序员
私信 提问
加载中

评论(1)

ricktian1226
ricktian1226
好文,不过还没有完全理解。 挖挖代码去。0
多谢春哥~~
Martini 极好的 Go WEB 框架

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

喻恒春
2014/01/07
0
16
JesusSlim/pinject

pinject Inject in PHP ! PHP依赖注入实现. usage English [Chinese] Install pinject in packagist:https://packagist.org/packages/jesusslim/pinject Install: composer require jesussl......

JesusSlim
2016/08/16
0
0
cordova-hcp server 报错

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

mamie42
2016/10/17
209
0
golang: Martini之inject源码分析

依赖注入(Dependency Injection)和控制反转(Inversion of Control)是同一个概念。在传统的程序设计过程中,调用者是自己来决定使用哪些被调用者实现的。但是在依赖注入模式中,创建被调用者的...

陈亦
2014/01/22
0
21
Martini 组件和实用工具--martini-contrib

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

叶秀兰
2014/01/14
478
0

没有更多内容

加载失败,请刷新页面

加载更多

小白讲网络安全系列

注入攻击防护 XSS注入 SQL注入 命令注入 文件上传 文件解压缩 CSRF防护 对称加密 非对称加密 数字证书 数字签名 完整性校验 消息验证码 单向散列Hash函数 口令单向加密算法 审计日志 认证鉴权...

一刀
26分钟前
0
0
MYSQL 嵌套事务(SAVEPOINT) 与Spring 事务传播

摘要 savepoint 关键字可以实现嵌套事务。结合savepoint关键字,更方便理解spring的事务传播。 事务嵌套 初始化表脚本 drop table t;create table t(a int, primary key(a)); 开启事务 my...

liangxiao
28分钟前
2
0
Chrome OS 更新新版本可让Linux访问USB连接的Android设备

谷歌再次为Chrome OS带来了重大版本更新,使版本号达到了75。本次更新的一大亮点就是允许在Chrome OS上运行的Linux能够识别通过USB方式连接的Android设备,能够让用户使用Linux进行调试等等。...

linuxCool
昨天
13
0
聊聊feign的HystrixInvocationHandler

序 本文主要研究一下feign的HystrixInvocationHandler HystrixInvocationHandler feign-hystrix-10.2.3-sources.jar!/feign/hystrix/HystrixInvocationHandler.java final class HystrixInvo......

go4it
昨天
15
0
WPS 开启宏功能

前言 最近安装了个人版的WPS2019,使用Excel的宏功能时候发现不能使用了,网上下载了几个安装包都是比较旧的,不能使用。 找了个VB7.1的安装包,安装完了,重启WPS宏功能就可以使用了。 安装...

sharelocked
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部