本系列教程已经上传至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的时候,我们会看到如下效果:
而且我们在控制台也打印出了相关的记录:
可以看到,我们再控制台打印出了相应的文本信息,这里是每次打印一条记录的,这里之所以会出现多次,是因为我执行了多次。
然后我们再用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,我们就介绍到这里啦。