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
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示例
package com.litongjava.manim.handler;
import com.litongjava.jfinal.aop.Aop;
import com.litongjava.manim.services.VideoPageService;
import com.litongjava.tio.boot.http.TioRequestContext;
import com.litongjava.tio.http.common.HttpRequest;
import com.litongjava.tio.http.common.HttpResponse;
import com.litongjava.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} 是通过路由模式注册的命名参数。你可以这样读取:
Integer pageNo = request.getInt("pageNo", 1);
Integer pageSize = request.getInt("pageSize", 10);
request.getInt("pageNo", defaultValue) 会从请求对象中取到 pageNo 的值,若不存在则返回默认值。 同理:
Long id = request.getLong("id");
这一行从 URL 模式中带了 id 名字的参数里获取 Long 类型的值。
这些接口由 HttpRequest 实现提供,框架并不会自动装配成方法参数,而是以 key → value 的方式手动提取。([Tio Boot Docs][2])
2.2 从查询字符串中获取
除了路径参数,HTTP 请求的 查询参数(例如 ?foo=bar&pageSize=20)也存在于 HttpRequest 中,可以用类似方法获取:
String foo = request.getParam("foo");
或者:
Integer size = request.getInt("pageSize", 10);
默认值参数便于在缺失时保证业务逻辑可用。
2.3 为什么需要这样手动取参数
在 Handler 中框架 不支持自动请求参数封装,因此你不可以像 Spring MVC 那样直接声明方法参数或用注解注入。 具体来说,框架不会自动将参数映射到方法入参,因此只能手动从 HttpRequest 读取
3. 小结
tio-boot 框架允许你用 Handler 注册路由并处理 HTTP 请求。 从 URL 提取参数的基本方法是:
使用路由时定义命名参数,如
{id}、{pageNo}等;在 Handler 中通过
HttpRequest提取参数:request.getInt("pageNo", default)从路径或查询获取整型;request.getLong("id")获取 Long 类型;request.getParam("foo")获取字符串类型。
这种方式非常手动,但在性能或精细控制上更灵活。([Tio Boot Docs][2])
