Skip to content

handler入门 ​

1. tio-boot 简介及 Handler 的定位 ​

tio-boot 是一个基于 t-io 的高性能 Java Web 框架,支持 HTTP 服务开发。

在 tio-boot 中,HTTP 请求分为 Controller 和 Handler 两种处理方式:

  • Controller:支持自动请求参数封装、路由扫描,用法与传统 MVC 框架类似。
  • Handler:不支持自动参数封装或扫描,需要手动注册路由,并在方法内手动从 HttpRequest 拿参数。 与性能要求较高、手动更精细的场景使用。

2. Handler 中从 URL 获取参数的方法 ​

配置router

java
TioBootServer server = TioBootServer.me();
HttpRequestRouter r = server.getRequestRouter();
r.add("/", videoPageHandler::index);
r.add("/{pageNo:\\d+}/{pageSize:\\d+}", videoPageHandler::index);
r.add("/preview/{id}", videoPageHandler::preview);

完整的handler示例

java
package nexus.io.manim.handler;

import nexus.io.jfinal.aop.Aop;
import nexus.io.manim.services.VideoPageService;
import nexus.io.tio.boot.http.TioRequestContext;
import nexus.io.tio.http.common.HttpRequest;
import nexus.io.tio.http.common.HttpResponse;
import nexus.io.tio.http.server.util.Resps;

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class VideoPageHandler{

  VideoPageService srv = Aop.get(VideoPageService.class);

  public HttpResponse index(HttpRequest request) {
    HttpResponse response = TioRequestContext.getResponse();

    Integer pageNo = null;
    Integer pageSize = null;
    try {
      pageNo = request.getInt("pageNo", 1);
      pageSize = request.getInt("pageSize", 10);
    } catch (Exception e) {
      return null;
    }

    VideoPageService indexService = Aop.get(VideoPageService.class);
    String html = indexService.index(pageNo, pageSize);
    Resps.html(response, html);
    return response;
  }

  public HttpResponse preview(HttpRequest request) {
    Long id = request.getLong("id");
    HttpResponse response = TioRequestContext.getResponse();
    String html = srv.getPreviewHtmlById(id);
    return Resps.html(response, html);
  }
}

这些路由配置都由 HttpRequestRouter 注册,并在请求匹配成功后调用相应的 Handler 方法。

参数来源及提取方式 ​

在 Handler 方法中可以通过传入的 HttpRequest 对象手动获取参数:


2.1 从路径参数中获取 ​

对于像:

/123/50

这样的路径,{pageNo} 和 {pageSize} 是通过路由模式注册的命名参数。可以这样读取:

java
Integer pageNo = request.getInt("pageNo", 1);
Integer pageSize = request.getInt("pageSize", 10);

request.getInt("pageNo", defaultValue) 会从请求对象中取到 pageNo 的值,若不存在则返回默认值。 同理:

java
Long id = request.getLong("id");

这一行从 URL 模式中带了 id 名字的参数里获取 Long 类型的值。

这些接口由 HttpRequest 实现提供,框架并不会自动装配成方法参数,而是以 key → value 的方式手动提取。([Tio Boot Docs][2])


2.2 从查询字符串中获取 ​

除了路径参数,HTTP 请求的 查询参数(例如 ?foo=bar&pageSize=20)也存在于 HttpRequest 中,可以用类似方法获取:

java
String foo = request.getParam("foo");

或者:

java
Integer size = request.getInt("pageSize", 10);

默认值参数便于在缺失时保证业务逻辑可用。


2.3 为什么需要这样手动取参数 ​

在 Handler 中框架 不支持自动请求参数封装,因此不可以像 Spring MVC 那样直接声明方法参数或用注解注入。 具体来说,框架不会自动将参数映射到方法入参,因此只能手动从 HttpRequest 读取


3. 小结 ​

tio-boot 框架允许用 Handler 注册路由并处理 HTTP 请求。 从 URL 提取参数的基本方法是:

  1. 使用路由时定义命名参数,如 {id}、{pageNo} 等;

  2. 在 Handler 中通过 HttpRequest 提取参数:

    • request.getInt("pageNo", default) 从路径或查询获取整型;
    • request.getLong("id") 获取 Long 类型;
    • request.getParam("foo") 获取字符串类型。

这种方式非常手动,但在性能或精细控制上更灵活。([Tio Boot Docs][2])

MIT Licensed