使用Handler(嵌入Jetty学习二)
来源:互联网 发布:程序员很累吗 编辑:程序博客网 时间:2024/04/29 13:38
一个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
http://wiki.eclipse.org/Jetty/Howto/Write_Jetty_Handler
http://wiki.eclipse.org/Jetty/Reference/Jetty_Architecture
- 使用Handler(嵌入Jetty学习二)
- WebAppContext(嵌入Jetty学习三)
- Jetty学习笔记(二)-Jetty启动
- Jetty学习【三】 Handler
- jetty快速入门与嵌入使用 jetty
- jetty快速入门与嵌入使用 jetty
- jetty快速入门与嵌入使用 jetty
- jetty快速入门与嵌入使用 jetty
- jetty 1.6 嵌入使用webapps
- Jetty学习(一)嵌入应用之Helloworld
- 创建一个简单的Server(嵌入Jetty学习一)
- Jetty学习(二)--jetty部署简单web项目
- jetty使用教程(嵌入eclipse开发)
- jetty使用教程(嵌入eclipse开发)
- Android Handler的使用(二) 学习笔记
- Handler的学习(二)
- Handler的使用(二)
- Handler的使用(二)
- 端口占用问题处理
- 创建一个简单的Server(嵌入Jetty学习一)
- tomcat配置多域名访问非webapps下面多工程目录(类似IIS主机头)
- CentOS 6.x安装NetCat和bug解决问题
- C++ 中lua require 失败
- 使用Handler(嵌入Jetty学习二)
- 如何高效检查一个数组中是否包含某个值?
- openoffice 安装与报错解决
- 简单的Linux扫描仪应用:C语言实现
- 【数据库】函数依赖和规范化
- Android中RSA+BASE64加密解密
- 场景+定制成为互联网保险主流,谁能突出重围?
- 将字符串中的空格用 代替
- 编译linux3.11.8内核出现compiler-gcc5.h不存在