辛星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的时候,我们会看到如下效果:


辛星jetty嵌入式开发第二篇:使用多个handler_第1张图片
8.jpg

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


辛星jetty嵌入式开发第二篇:使用多个handler_第2张图片
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();
    }
}

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


辛星jetty嵌入式开发第二篇:使用多个handler_第3张图片
控制台输出

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

你可能感兴趣的:(辛星jetty嵌入式开发第二篇:使用多个handler)