本系列教程已經(jīng)上傳至github中燥,感興趣的朋友們可以star一下忧设,附上傳送門: https://github.com/xinxing0913/jetty-embed-demo埠忘。
在上一篇我們通過一個(gè)handler來完成了所有的內(nèi)容救军,但是在實(shí)際應(yīng)用中這樣是不現(xiàn)實(shí)的煮仇,我們可能需要多個(gè)handler來共同參與處理嫉髓,那么我們這個(gè)時(shí)候就可以借助于HandlerList或者HandlerCollection來添加多個(gè)Handler了观腊。它們的區(qū)別在哪呢?
- HandlerList只要有一個(gè)Handler將請(qǐng)求標(biāo)記為已處理邑闲,或拋出異常,Handler的調(diào)用就到此結(jié)束梧油。
- HandlerCollection則是不管是否拋出異成凰剩或者把請(qǐng)求標(biāo)記為結(jié)束,都會(huì)執(zhí)行到最后一個(gè)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);
這里我們就來試一下吧褪子,我們首先來定義兩個(gè)Handler,一個(gè)是CustomHandler骗村,它的目的是設(shè)置頭信息嫌褪,設(shè)置字符集等通用操作,代碼內(nèi)容如下:
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;
/**
* 定制化處理器
* 它的內(nèi)容有:
* 1.添加一個(gè)Header頭胚股,用來表示作者信息
* 2.設(shè)置字符集為utf-8
* 3.輸出一段文本笼痛,用來說明被調(diào)用
*/
public class CustomHandler extends AbstractHandler {
public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
// 設(shè)置自定義Header頭,建議使用X開頭
response.addHeader("X-Author", "XinXing");
// 設(shè)置字符集
response.setContentType("text/html;charset=utf-8");
// 輸出一段文本信轿,這里為了簡(jiǎn)單晃痴,我們直接使用最原始的方式打印信息
System.out.println("調(diào)用CustomHandler的handle方法..");
}
}
一個(gè)是OutputHandler,它用來輸出具體的內(nèi)容信息财忽,如下所示:
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! 我是辛星 (*^__^*)");
// 這里要標(biāo)記為已處理
baseRequest.setHandled(true);
}
}
我們這里再加一個(gè)handler倘核,內(nèi)容如下:
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;
/**
* 一個(gè)只打印記錄的Handler
*/
public class AnotherHandler extends AbstractHandler{
@Override
public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
System.out.println("調(diào)用AnotherHandler的handle方法..");
}
}
這里我們首先用HandlerList來處理多個(gè)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 {
// 設(shè)置處理器列表
HandlerList list = new HandlerList();
list.addHandler(new CustomHandler());
list.addHandler(new OutputHandler());
list.addHandler(new AnotherHandler());
int port = 8080;
Server server = new Server(port);
// 不要忘記設(shè)置處理器奧
server.setHandler(list);
server.start();
server.join();
}
}
然后我們啟動(dòng)main方法即彪,當(dāng)我們請(qǐng)求localhost:8080的時(shí)候紧唱,我們會(huì)看到如下效果:
而且我們?cè)诳刂婆_(tái)也打印出了相關(guān)的記錄:
可以看到,我們?cè)倏刂婆_(tái)打印出了相應(yīng)的文本信息隶校,這里是每次打印一條記錄的漏益,這里之所以會(huì)出現(xiàn)多次,是因?yàn)槲覉?zhí)行了多次深胳。
然后我們?cè)儆肏andlerCollection來處理多個(gè)Handler吧绰疤,代碼內(nèi)容如下所示:
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{
// 設(shè)置處理器列表
HandlerCollection list = new HandlerCollection();
list.addHandler(new CustomHandler());
list.addHandler(new OutputHandler());
list.addHandler(new AnotherHandler());
int port = 8080;
Server server = new Server(port);
// 不要忘記設(shè)置處理器奧
server.setHandler(list);
server.start();
server.join();
}
}
然后我們?cè)賵?zhí)行的時(shí)候,我們的控制臺(tái)輸出是這樣的:
對(duì)于如何使用多個(gè)Handler舞终,我們就介紹到這里啦轻庆。