一个Jetty Server可以看成由一下几部分组成,其中Connector负责接收客户端的HTTP请求,请求的处理是由Handler来完成的。在上一个例子中HelloHandler的作用就是处理用户请求,并输出结果。
Handler在Jetty中是一个非常重要的东西,Jetty内部实现了一些Handler,可以分为一下几类:
1.协调Handler:负责将request路由到其他Handler的Handler(如:HandlerConnection, ContextHandlerConnection)
2.过滤Handler:负责向request中设置一些参数,然后再把请求转交给其他Handler(如:HandlerWapper, ContextHandler, SessionHandler)
3.生成Handler:负责生成响应的内容(如:ResourceHandler, ServletHandler)
Handler的接口是这样的:
- public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response)
- throws IOException, ServletException
在自定义Handler的时候,必须要实现这个方法,可以直接输出响应,也可以对Request做一些包装再把它交给下一个Handler。
Handler的强大的地方是可以为Jetty Server设置若干Handler,每个Handler完成自己的功能,Handler的处理过程如下:
HandlerList和HandlerConnection内部都可以设置若干Handler, Handler按顺序一个接一个的执行。对于HandlerList而言,只要有一个Handler将请求标记为已处理,或抛出异常,Handler的调用就到此结束。而HandlerConnection则不会结束,一直调用到最后一个Handler。
下面以一个具体的例子来说明,需要注意HandlerList和HandlerConnection的区别,代码里有注释:
- public class ManyHandlers {
- public static void main(String[] args) throws Exception {
- Server server = new Server(8080);
- // create the handlers
- Handler param = new ParamHandler();
- HandlerWrapper wrapper = new HandlerWrapper() {
- @Override
- public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response)
- throws IOException, ServletException {
- request.setAttribute("welcome", "Wylazy");
- super.handle(target, baseRequest, request, response);
- }
- };
- Handler hello = new HelloHandler();
- wrapper.setHandler(hello);
- Handler dft = new DefaultHandler();
- //HandlerList会依次调用每一个Handler,直到某个Handler将请求标记为已处理,即setHandled(true);
- HandlerList list = new HandlerList();
- list.setHandlers(new Handler[] { param, wrapper, dft });
- RequestLogHandler log = new RequestLogHandler();
- log.setRequestLog(new NCSARequestLog(File.createTempFile("demo", "log").getAbsolutePath()));
- //HandlerCollection会依次调用每一个Handler,即使请求已经被处理了
- HandlerCollection handlers = new HandlerCollection();
- handlers.setHandlers(new Handler[] { list, log });
- server.setHandler(handlers);
- server.start();
- server.join();
- }
- public static class ParamHandler extends AbstractHandler {
- public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response)
- throws IOException, ServletException {
- Map params = request.getParameterMap();
- if (params.size() > 0) {
- response.setContentType("text/plain");
- response.getWriter().println(new JSONObject(params));
- ((Request) request).setHandled(true);
- }
- }
- }
- }
参考:
http://zldeng1984.iteye.com/blog/1368376