一个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
相关推荐
测试Thread中使用Handler修改
整理了Handler的各种使用方法
Handler与AsyncTask使用示例,Handler AsyncTask 示例 looper
这里简单介绍了Fragment和Activity使用Handler方式进行交互。
作为嵌入式服务器使用代码实例: Java代码 //代码:以嵌入模式启动Jetty import org.mortbay.http.HttpContext; import org.mortbay.http.HttpServer; import org.mortbay.http.SocketListener; import org.mortbay...
本文实例讲述了Android编程实现使用handler在子线程中更新UI。分享给大家供大家参考,具体如下: MainActivity代码: package com.example.ui; import android.os.Handler; import android.os.Message; import ...
android demo,使用Handler的postDelay,Runnable run实现延时3秒的splash。
Android中handler的使用,处理多线程的使用
Handler在android里负责发送和处理消息。它的主要用途有(或者是干什么的): 1)执行计划任务,按计划(定时)发送消息或执行某个Runnanble(使用POST方法); 2)线程间通信,把从其他线程中发送来的消息放入消息...
handler的使用演示,主线程给子线程发消息,子线程给主线程发消息
相同点: 1. Tomcat和Jetty都是一种...Jetty的架构是基于Handler来实现的,主要的扩展功能都可以用Handler来实现,扩展简单。 Tomcat的架构是基于容器设计的,进行扩展是需要了解Tomcat的整体设计结构,不易扩展。
这是Handler的介绍和使用方法Demo,介绍请参考:http://write.blog.csdn.net/postlist
使用Handler.post()对线程进行管理,实现同步。这里使用post()将多个线程提交到Handler的MessageQueue里面,这样线程就会顺序执行,这样任务所操作的对象在同一时间里就不会有多个线程同时操作了,也就实现了同步...
此项目为MyBatis使用TypeHandler的示例 注意,测试需要在MySql中建表 附:建表语句及数据,导入Mysql运行即可 在Mysql命令窗口输入 set names 'utf8'; source 1.sql 将以下文件保存为1.sql DROP TABLE IF EXISTS `...
Handler在子线程中的使用以及注意事项
感谢慕课网,浅谈handler
使用Handler实现的图片播放小功能,代码简单易懂,适合初学者
demo01: 通过handler.post()的方法可以更新ui demo02: 一秒钟切换一张图片 demo03: 霓虹灯动态效果的显示 demo04: 倒计时,停止倒计时 demo05: 通过handler.sendMessage和handleMessage发送处理消息 demo06: message...
handler简单使用
Handler的基本使用,通过Handler更新UI中TextView的显示