Jetty紹介のhandler

8663 ワード

記事リファレンス
http://ipjmc.iteye.com/blog/1839999
http://blog.csdn.net/huangmin2050/article/details/7487922
 
    jettyサービスを埋め込むには、一般的に次のステップがあります.サーバの作成、Connectorsのロード、handlersのロード、サーブレットのロードなど、サービスstartを起動し、最後にサーバjoinに参加します.
    1つのJetty Serverは、ConnectorがクライアントのHTTPリクエストを受信し、リクエストの処理はHandlerによって完了するいくつかの部分から構成されていると見なすことができます.
jetty 介绍之handler
 
HandlerはJettyの中でとても重要なもので、Jettyの内部でいくつかのHandlerを実現して、いくつかの種類に分けることができます:
    1.調整Handler:requestを他のHandlerにルーティングするHandler(例:HandlerConnection,ContextHandlerConnection)
    2.Handlerのフィルタリング:requestにパラメータを設定し、他のHandler(HandlerWapper,ContextHandler,SessionHandlerなど)にリクエストを渡す
    3.Handlerの生成:応答の生成を担当するコンテンツ(例:ResourceHandler,ServeretHandler)
 
    jettyが1つのサービスのみを開始し、handlersやConnectorsなどがない場合、ブラウザアクセスは404に戻る.分かりやすいのは、サービスがあることですが、サービスはresponseを返さないので404を返します.
public static void main(String[] args) throws Exception
{
	Server server = new Server(8081);
   // server.setHandler(new HelloHandler());
 
	server.start();
	server.join();
}

 
    このサービスが開始されると、サービスに対する操作がないため、すべてのrequestに対して404が返される.
 
簡単なHelloHandlerの紹介とhandle法のパラメータの紹介を見てみましょう.
 
public class HelloHandler extends AbstractHandler
{
    public void handle(String target,Request baseRequest,HttpServletRequest request,HttpServletResponse response) 
        throws IOException, ServletException
    {
        response.setContentType("text/html;charset=utf-8");
        response.setStatus(HttpServletResponse.SC_OK);
        baseRequest.setHandled(true);
        response.getWriter().println("<h1>Hello World2</h1>");
    }
}

 
target-requestのターゲットはurlまたはアダプタです.
baseRequest-jetty可変requestオブジェクトは、カプセル化されなくてもよい.
request-可変のrequestオブジェクトで、カプセル化できます.
response-responseオブジェクト、カプセル化できます
 
    上記コードhandleはresponseの状態を設定し、ContentTypeやタグrequestが処理されるかどうかなどを設定します.複雑な処理は複数のHandlerを組み合わせて使用することができ,複雑な処理結果を達成する.Jettyのhandlerの一部はorg.eclipse.jetty.server.handlerで検索できます
 
    Handlerの強力な点はJetty ServerにいくつかのHandlerを設定できることであり、各Handlerは自分の機能を完成し、Handlerの処理過程は以下の通りである.
jetty 介绍之handler
 
    HandlerListとHandlerConnectionの内部にはいくつかのHandlerを設定することができ、 Handlerは次から次へと実行される.HandlerListの場合、Handlerの呼び出しは、1つのHandlerが要求を処理済みとマークしたり、例外を投げ出したりすれば、これで終了する.HandlerConnectionは終了せず、最後のHandlerまで呼び出されます.
 
複数handlerの処理:
public static void main(String[] args) throws Exception
{
	Server server = new Server(8081);
	server.setHandler(new HelloHandler());//   
	server.setHandler(new HelloHandler());//  setHandler        
	server.start();
	server.join();
}

 
serverはsetHandlerを2回呼び出したが,最後のsetHandlerのみ有効であるため,上のコードはだめである.
 
複数のhandlerに対する処理は、下のように正道です.
 
1、HandlerCollectionは各handlerを順番にそれぞれ実行し、結果をresponseにまとめて返します.次のようになります.
public static void main(String[] args) throws Exception
{
	Server server = new Server(8081);
	HandlerCollection hc =new HandlerCollection();
	hc.setHandlers(new Handler[]{new HelloHandler(),new HelloHandlerScond()});
	server.setHandler(hc);
	server.start();
	server.join();
}

 
2、HandlerListは順次handlerを実行し、エラーを投げ出してから次のhandlerを実行しなければ実行しない.次のようになります.
public static void main(String[] args) throws Exception
{
	Server server = new Server();
	SelectChannelConnector connector = new SelectChannelConnector();
	connector.setPort(8080);
	server.addConnector(connector);

	ResourceHandler resource_handler = new ResourceHandler();
	resource_handler.setDirectoriesListed(true);
	resource_handler.setWelcomeFiles(new String[]{ "index.html" });

	resource_handler.setResourceBase(".");

	HandlerList handlers = new HandlerList();
	handlers.setHandlers(new Handler[] { resource_handler, new DefaultHandler() });
	server.setHandler(handlers);

	server.start();
	server.join();
}

 
 
以下、具体的な例で説明します.HandlerListとHandlerConnectionの違いに注意してください.コードにはコメントがあります.
 
package hb.jetty;

import java.io.File;
import java.io.IOException;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.eclipse.jetty.server.NCSARequestLog;
import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.AbstractHandler;
import org.eclipse.jetty.server.handler.DefaultHandler;
import org.eclipse.jetty.server.handler.HandlerCollection;
import org.eclipse.jetty.server.handler.HandlerList;
import org.eclipse.jetty.server.handler.HandlerWrapper;
import org.eclipse.jetty.server.handler.RequestLogHandler;

public class ManyHandlers {
	public static void main(String[] args) throws Exception {
		Server server = new Server(8080);

		// create the handlers
		Handler param = new ParamHandler();
		HandlerWrapper wrapper = new HandlerWrapper() {
			@Override
			public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response)
					throws IOException, ServletException {
				request.setAttribute("welcome", "Wylazy");
				super.handle(target, baseRequest, request, response);
			}
		};
		
		Handler hello = new HelloHandler();
		wrapper.setHandler(hello);
		Handler dft = new DefaultHandler();

//HandlerList        Handler,    Handler         , setHandled(true);
		HandlerList list = new HandlerList();
		list.setHandlers(new Handler[] { param, wrapper, dft });
		server.setHandler(list);
		
		RequestLogHandler log = new RequestLogHandler();
		log.setRequestLog(new NCSARequestLog(File.createTempFile("demo", "log").getAbsolutePath()));
		
		//HandlerCollection        Handler,          
//		HandlerCollection handlers = new HandlerCollection();
//		handlers.setHandlers(new Handler[] { list, log });
//		server.setHandler(handlers);

		server.start();
		server.join();
	}

	public static class ParamHandler extends AbstractHandler {
		public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response)
				throws IOException, ServletException {
			Map params = request.getParameterMap();
			if (params.size() > 0) {
				response.setContentType("text/plain");
				response.getWriter().println(params);
				baseRequest.setHandled(true);
			}
//			baseRequest.setHandled(true);
		}
	}
	
	public static class HelloHandler extends AbstractHandler {  
	    public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response)  
	            throws IOException, ServletException {  
	        response.setContentType("text/html;charset=utf-8");  
	        response.setStatus(HttpServletResponse.SC_OK);  
	        baseRequest.setHandled(true);  
	        response.getWriter().println("<h1>Hello World1</h1>");  
	        response.getWriter().println("Request url: " + target);  
	    }  
	}  

}
 
 
 備考:直接コードを実行してhandlerを処理しても実行は続行されません.すべてのhandlerが実行されていることをテストするには、HandlerCollection処理を使用します.