使用Handler(嵌入Jetty学习二)

一个Jetty Server可以看成由一下几部分组成,其中Connector负责接收客户端的HTTP请求,请求的处理是由Handler来完成的。在上一个例子中HelloHandler的作用就是处理用户请求,并输出结果。

          Image:JettyUML1.png

    Handler在Jetty中是一个非常重要的东西,Jetty内部实现了一些Handler,可以分为一下几类:

    1.协调Handler:负责将request路由到其他Handler的Handler(如:HandlerConnection, ContextHandlerConnection)

    2.过滤Handler:负责向request中设置一些参数,然后再把请求转交给其他Handler(如:HandlerWapper, ContextHandler, SessionHandler)

    3.生成Handler:负责生成响应的内容(如:ResourceHandler, ServletHandler)

 

    Handler的接口是这样的:

Java代码   收藏代码
  1. public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response)  
  2.     throws IOException, ServletException  

    在自定义Handler的时候,必须要实现这个方法,可以直接输出响应,也可以对Request做一些包装再把它交给下一个Handler。

 

    Handler的强大的地方是可以为Jetty Server设置若干Handler,每个Handler完成自己的功能,Handler的处理过程如下:

   HandlerList和HandlerConnection内部都可以设置若干Handler, Handler按顺序一个接一个的执行。对于HandlerList而言,只要有一个Handler将请求标记为已处理,或抛出异常,Handler的调用就到此结束。而HandlerConnection则不会结束,一直调用到最后一个Handler。

 

    下面以一个具体的例子来说明,需要注意HandlerList和HandlerConnection的区别,代码里有注释:

Java代码   收藏代码
  1. public class ManyHandlers {  
  2.     public static void main(String[] args) throws Exception {  
  3.         Server server = new Server(8080);  
  4.   
  5.         // create the handlers  
  6.         Handler param = new ParamHandler();  
  7.         HandlerWrapper wrapper = new HandlerWrapper() {  
  8.             @Override  
  9.             public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response)  
  10.                     throws IOException, ServletException {  
  11.                 request.setAttribute("welcome""Wylazy");  
  12.                 super.handle(target, baseRequest, request, response);  
  13.             }  
  14.         };  
  15.           
  16.         Handler hello = new HelloHandler();  
  17.         wrapper.setHandler(hello);  
  18.         Handler dft = new DefaultHandler();  
  19.   
  20.         //HandlerList会依次调用每一个Handler,直到某个Handler将请求标记为已处理,即setHandled(true);  
  21.         HandlerList list = new HandlerList();  
  22.         list.setHandlers(new Handler[] { param, wrapper, dft });  
  23.           
  24.         RequestLogHandler log = new RequestLogHandler();  
  25.         log.setRequestLog(new NCSARequestLog(File.createTempFile("demo""log").getAbsolutePath()));  
  26.           
  27.         //HandlerCollection会依次调用每一个Handler,即使请求已经被处理了  
  28.         HandlerCollection handlers = new HandlerCollection();  
  29.         handlers.setHandlers(new Handler[] { list, log });  
  30.   
  31.         server.setHandler(handlers);  
  32.   
  33.         server.start();  
  34.         server.join();  
  35.     }  
  36.   
  37.     public static class ParamHandler extends AbstractHandler {  
  38.         public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response)  
  39.                 throws IOException, ServletException {  
  40.             Map params = request.getParameterMap();  
  41.             if (params.size() > 0) {  
  42.                 response.setContentType("text/plain");  
  43.                 response.getWriter().println(new JSONObject(params));  
  44.                 ((Request) request).setHandled(true);  
  45.             }  
  46.         }  
  47.     }  
  48. }  

 

 

参考:

http://zldeng1984.iteye.com/blog/1368376

http://wiki.eclipse.org/Jetty/Howto/Write_Jetty_Handler

http://wiki.eclipse.org/Jetty/Reference/Jetty_Architecture

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值