在 Tomcat 中,责任链模式被广泛地应用在请求处理流程中。Tomcat 中的请求处理流程可以被抽象为一个由多个处理器(Handler)组成的责任链,每个处理器都负责处理请求的某个方面。请求会按照一定的顺序经过这些处理器,直到最后一个处理器完成请求处理,或者其中某个处理器抛出异常,导致请求处理终止。
下面是 Tomcat 中一个简单的责任链模式的示例,该示例演示了如何处理 HTTP 请求中的查询参数。具体地,该责任链中包含两个处理器,分别用于解析查询参数和生成响应内容。
public interface RequestHandler {
void handle(HttpRequest request, HttpResponse response, RequestHandler next);
}
public class QueryParamHandler implements RequestHandler {
@Override
public void handle(HttpRequest request, HttpResponse response, RequestHandler next) {
// 解析查询参数并设置到 HttpRequest 对象中
String queryString = request.getQueryString();
if (queryString != null) {
String[] pairs = queryString.split("&");
for (String pair : pairs) {
String[] parts = pair.split("=");
String key = parts[0];
String value = parts.length > 1 ? parts[1] : null;
request.addQueryParam(key, value);
}
}
// 调用下一个处理器
next.handle(request, response, next);
}
}
public class ResponseHandler implements RequestHandler {
@Override
public void handle(HttpRequest request, HttpResponse response, RequestHandler next) {
// 生成响应内容
String body = "Hello, " + request.getQueryParam("name");
// 设置响应头和响应体
response.setContentType("text/plain");
response.setContentLength(body.length());
response.getWriter().write(body);
// 停止处理请求
response.flushBuffer();
}
}
public class RequestProcessor {
private RequestHandler handlerChain;
public RequestProcessor() {
// 创建责任链
this.handlerChain = new QueryParamHandler();
this.handlerChain = new ResponseHandler();
}
public void process(HttpRequest request, HttpResponse response) {
// 调用责任链处理器处理请求
this.handlerChain.handle(request, response, this.handlerChain);
}
}
在上述示例代码中,RequestHandler 接口定义了处理器的公共接口,QueryParmHandler 和 ResponseHandler 分别是两个具体的处理器实现。RequestProcessor 类是请求处理器,它创建了一个由 QueryParamHandler 和 ResponseHandler 组成的责任链。process() 方法是入口方法,它调用责任链中的第一个处理器来处理请求。
在 QueryParamHandler 和 ResponseHandler 中,handle() 方法负责处理请求并调用责任链中的下一个处理器。在 QueryParamHandler 的 handle() 方法中,首先解析查询参数并设置到 HttpRequest 对象中,然后调用下一个处理器,即 ResponseHandler。在 ResponseHandler 的 handle() 方法中,生成响应内容并设置到 HttpResponse 对象中,最后停止处理请求。