六、Web-模块

前一章我们学习了如何开发一个路由,下面我们来看看如何开发一个模块,设计上的目的是通过打包一个服务可以快速的部署到相应的 Web 服务上,同时为了提高对模块的代码保护(可混淆代码来进行保护),模块中的路由通过代码实现,而非通过配置来实现,模块的开发和通过代码开发一个 Web 服务非常类似。

通过路由配置来实现 Web 服务的步骤:

  • 1.做好路由规划(参考上一章《开发 Web 服务—-路由》).
  • 2.编写路由(参考上一章《开发 Web 服务—-路由》).
  • 3.编写模块代码,在模块中注册路由和过滤器.
  • 4.注册模块到 web.json.
  • 5.启动路由(java -jar ./bin/voovan-framework.jar).

1.找到模块的注册入口

模块的入口在 conf/web.json 文件中.下面我们截取一段模块的配置:

  1. .......
  2. "Modules": [
  3. {
  4. "Name": "性能监控模块", //模块名称
  5. "Path": "/VoovanMonitor", //模块路径
  6. "ClassName": "org.voovan.http.monitor.Monitor" //模块处理器
  7. }
  8. ]
  9. .......

Path这个参数是相对 web.json 文件中配置的 ContextPath 的相对路径,同时模块的静态资源文件(图片,样式,脚本等)也保存物理磁盘的这个相对路径下。

这个是 Voovan 项目的性能监控模块的配置,下面我们的举例等都会使用这个例子的代码.


2.模块类介绍

  • 类路径
  1. org.voovan.http.server.HttpModule
  • 模块安装(入口)函数
  1. public abstract void install();
  • 服务器安装模块时会调用该方法,也可以理解为模块的入口方法,在这个方法里实现路由的注册。
    • HTTP 方法响应函数
  1. public WebServer [Method](String routeRegexPath, HttpRouter router)
  • 为 HTTP 方法提供服务,其中 Method 为HTTP(GET、POST等)方法。

    • routeRegexPath: 服务路径正则匹配,不需要正则的^和$,系统会自动处理。
    • handler: HttpRouter对象的实例用来支持具体的HTTP事件。
  • 自定义 HTTP 方法响应函数
  1. public WebServer otherMethod(String method, String routeRegexPath, HttpRouter router)
  • 为 HTTP 方法提供服务,其中 Method 为HTTP(GET、POST等)方法。
  • method: 自定义的 HTTP 方法,可以不用符合 HTTP 规范,注意已经实现的HTTP方法响应不会再被这个方法响应。
  • routeRegexPath: 服务路径正则匹配,不需要正则的^和$,系统会自动处理。
  • handler: HttpRouter对象的实例用来支持具体的HTTP事件。
    • 过滤器访问函数
  1. public Chain<HttpFilterConfig> filterChain()
  • 获取过滤器链。
  • 返回值: 获取定义的过滤器链。

通过以上的说明我们会发现和通过代码直接实现一个 WebServer 的方法非常相似,当然我们也可以将一个模块视为一个 Web 服务.


3.性能监控模块的代码举例

  1. package org.voovan.http.monitor;
  2. import org.voovan.http.server.HttpModule;
  3. import org.voovan.http.server.context.HttpFilterConfig;
  4. public class Monitor extends HttpModule {
  5. @Override
  6. public void install() {
  7. get("/:Type/:Param1",new MonitorHandler());
  8. get("/:Type",new MonitorHandler());
  9. get("/:Type/:Param1/:Param2",new MonitorHandler());
  10. filterChain().addFirst(HttpFilterConfig.newInstance("MonitorFilter",HttpMonitorFilter.class,null));
  11. }
  12. }

Ok,我们来分析一个这个模块. 通过第二节对模块类方法的了解,我们可以看到实现一个模块我们需要继承HttpModule类,并实现install()方法,接着我们需要将我们规划的路由实现在这个 install 方法中. 代码中的get("…", new ….())的方法是HttpModule类内的方法,这个和通过代码直接实现 Web 服务是相同,同是我们也发现,我们可以通过filterChain().addFirst(…)来注册一个过滤器.