辛星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,我们就介绍到这里啦。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

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