六、Web-模块
前一章我们学习了如何开发一个路由,下面我们来看看如何开发一个模块,设计上的目的是通过打包一个服务可以快速的部署到相应的 Web 服务上,同时为了提高对模块的代码保护(可混淆代码来进行保护),模块中的路由通过代码实现,而非通过配置来实现,模块的开发和通过代码开发一个 Web 服务非常类似。
通过路由配置来实现 Web 服务的步骤:
- 1.做好路由规划(参考上一章《开发 Web 服务—-路由》).
- 2.编写路由(参考上一章《开发 Web 服务—-路由》).
- 3.编写模块代码,在模块中注册路由和过滤器.
- 4.注册模块到 web.json.
- 5.启动路由(
java -jar ./bin/voovan-framework.jar
).
1.找到模块的注册入口
模块的入口在 conf/web.json
文件中.下面我们截取一段模块的配置:
.......
"Modules": [
{
"Name": "性能监控模块", //模块名称
"Path": "/VoovanMonitor", //模块路径
"ClassName": "org.voovan.http.monitor.Monitor" //模块处理器
}
]
.......
Path这个参数是相对 web.json 文件中配置的 ContextPath 的相对路径,同时模块的静态资源文件(图片,样式,脚本等)也保存物理磁盘的这个相对路径下。
这个是 Voovan 项目的性能监控模块的配置,下面我们的举例等都会使用这个例子的代码.
2.模块类介绍
- 类路径
org.voovan.http.server.HttpModule
- 模块安装(入口)函数
public abstract void install();
- 服务器安装模块时会调用该方法,也可以理解为模块的入口方法,在这个方法里实现路由的注册。
- HTTP 方法响应函数
public WebServer [Method](String routeRegexPath, HttpRouter router)
为 HTTP 方法提供服务,其中 Method 为HTTP(GET、POST等)方法。
routeRegexPath
: 服务路径正则匹配,不需要正则的^和$,系统会自动处理。handler
: HttpRouter对象的实例用来支持具体的HTTP事件。
- 自定义 HTTP 方法响应函数
public WebServer otherMethod(String method, String routeRegexPath, HttpRouter router)
- 为 HTTP 方法提供服务,其中 Method 为HTTP(GET、POST等)方法。
method
: 自定义的 HTTP 方法,可以不用符合 HTTP 规范,注意已经实现的HTTP方法响应不会再被这个方法响应。routeRegexPath
: 服务路径正则匹配,不需要正则的^和$,系统会自动处理。handler
: HttpRouter对象的实例用来支持具体的HTTP事件。- 过滤器访问函数
public Chain<HttpFilterConfig> filterChain()
- 获取过滤器链。
返回值
: 获取定义的过滤器链。
通过以上的说明我们会发现和通过代码直接实现一个 WebServer 的方法非常相似,当然我们也可以将一个模块视为一个 Web 服务.
3.性能监控模块的代码举例
package org.voovan.http.monitor;
import org.voovan.http.server.HttpModule;
import org.voovan.http.server.context.HttpFilterConfig;
public class Monitor extends HttpModule {
@Override
public void install() {
get("/:Type/:Param1",new MonitorHandler());
get("/:Type",new MonitorHandler());
get("/:Type/:Param1/:Param2",new MonitorHandler());
filterChain().addFirst(HttpFilterConfig.newInstance("MonitorFilter",HttpMonitorFilter.class,null));
}
}
Ok,我们来分析一个这个模块. 通过第二节对模块类方法的了解,我们可以看到实现一个模块我们需要继承HttpModule类,并实现install()方法,接着我们需要将我们规划的路由实现在这个 install
方法中. 代码中的get("…", new ….())
的方法是HttpModule类内的方法,这个和通过代码直接实现 Web 服务是相同,同是我们也发现,我们可以通过filterChain().addFirst(…)
来注册一个过滤器.