辛星jetty嵌入式开发第二篇:使用多个handler

本系列教程已经上传至github,感兴趣的朋友们可以star一下,附上传送门: https://github.com/xinxing0913/jetty-embed-demo

在上一篇我们通过一个handler来完成了所有的内容,但是在实际应用中这样是不现实的,我们可能需要多个handler来共同参与处理,那么我们这个时候就可以借助于HandlerList或者HandlerCollection来添加多个Handler了。它们的区别在哪呢?

  • HandlerList只要有一个Handler将请求标记为已处理,或抛出异常,Handler的调用就到此结束。
  • HandlerCollection则是不管是否抛出异常或者把请求标记为结束,都会执行到最后一个Handler。

我们最常使用的套路通常是:

HandlerList  list = new HandlerList();
list.addHandler(xxx);
list.addHandler(xxx);
list.addHandler(xxx);

server.setHandler(list);

或者是

HandlerCollection  list = new HandlerCollection();
list.addHandler(xxx);
list.addHandler(xxx);
list.addHandler(xxx);

server.setHandler(list);

这里我们就来试一下吧,我们首先来定义两个Handler,一个是CustomHandler,它的目的是设置头信息,设置字符集等通用操作,代码内容如下:

package com.mengzhidu.jetty.demo.x002;

import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.handler.AbstractHandler;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * 定制化处理器
 * 它的内容有:
 * 1.添加一个Header头,用来表示作者信息
 * 2.设置字符集为utf-8
 * 3.输出一段文本,用来说明被调用
 */
public class CustomHandler extends AbstractHandler {
    public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException {

        // 设置自定义Header头,建议使用X开头
        response.addHeader("X-Author", "XinXing");
        // 设置字符集
        response.setContentType("text/html;charset=utf-8");
        // 输出一段文本,这里为了简单,我们直接使用最原始的方式打印信息
        System.out.println("调用CustomHandler的handle方法..");
    }
}

一个是OutputHandler,它用来输出具体的内容信息,如下所示:

package com.mengzhidu.jetty.demo.x002;

import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.handler.AbstractHandler;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * 完成最终输出的Handler
 */
public class OutputHandler extends AbstractHandler{
    public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException {

        // 输出文本信息
        response.getWriter().println("hello jetty! 我是辛星 (*^__^*)");
        // 这里要标记为已处理
        baseRequest.setHandled(true);
    }
}

我们这里再加一个handler,内容如下:

package com.mengzhidu.jetty.demo.x002;

import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.handler.AbstractHandler;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * 一个只打印记录的Handler
 */
public class AnotherHandler extends AbstractHandler{

    @Override
    public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException {
        System.out.println("调用AnotherHandler的handle方法..");
    }
}

这里我们首先用HandlerList来处理多个Handler吧,范例代码如下:

package com.mengzhidu.jetty.demo.x002;

import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.HandlerList;

/**
 * 使用HandlerList的范例
 */
public class App1 {
    public static void main(String[] args) throws Exception {
        // 设置处理器列表
        HandlerList list = new HandlerList();
        list.addHandler(new CustomHandler());
        list.addHandler(new OutputHandler());
        list.addHandler(new AnotherHandler());

        int port = 8080;
        Server server = new Server(port);
        // 不要忘记设置处理器奥
        server.setHandler(list);
        server.start();
        server.join();
    }
}

然后我们启动main方法,当我们请求localhost:8080的时候,我们会看到如下效果:


8.jpg

而且我们在控制台也打印出了相关的记录:


9.jpg

可以看到,我们再控制台打印出了相应的文本信息,这里是每次打印一条记录的,这里之所以会出现多次,是因为我执行了多次。

然后我们再用HandlerCollection来处理多个Handler吧,代码内容如下所示:

package com.mengzhidu.jetty.demo.x002;

import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.HandlerCollection;

/**
 * 使用HandlerConnection的范例
 */
public class App2 {
    public static void main(String[] args) throws Exception{
        // 设置处理器列表
        HandlerCollection list = new HandlerCollection();
        list.addHandler(new CustomHandler());
        list.addHandler(new OutputHandler());
        list.addHandler(new AnotherHandler());

        int port = 8080;
        Server server = new Server(port);
        // 不要忘记设置处理器奥
        server.setHandler(list);
        server.start();
        server.join();
    }
}

然后我们再执行的时候,我们的控制台输出是这样的:


控制台输出

对于如何使用多个Handler,我们就介绍到这里啦。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,670评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,928评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,926评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,238评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,112评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,138评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,545评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,232评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,496评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,596评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,369评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,226评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,600评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,906评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,185评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,516评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,721评论 2 335

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,065评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,497评论 18 139
  • 深夜离亭回梦, 执手劳劳忍送。 眼泛海棠红, 对两泪风与共。 心动, 心动, 庭外草秋霜重。
    青鱼吹浪阅读 242评论 2 7
  • 人生就像一场旅行,你知道它的起点,却不知道它的终点。这一路上有欢喜也有无奈,有平坦的大路也有蜿蜒曲折的小径,有你愿...
    8b7bb7595cfb阅读 110评论 0 0
  • 燕子剪裁的季节 最先失控的 是四月的天空 雨点点痛昨日的忧伤 转眼又是一年清明 野草倒伏在外公的坟头 风连续失眠 ...
    潇萱阅读 225评论 3 5