如何在jetty中添加父Context

时间:2014-11-05 12:52:22

标签: jetty contextpath

我写了一个contexthandler来映射http://hostname:9001/gm/test,如下所示:

public static void main(String[] args) throws Exception {
    Server server = new Server(new QueuedThreadPool(8, 6));
    ServerConnector connector = new ServerConnector(server);
    connector.setPort(9001);
    server.setConnectors(new Connector[] { connector });

    HandlerCollection handler = new HandlerCollection();
    ContextHandler contextHandler = new ContextHandler("/gm");

    ContextHandlerCollection contexts = new ContextHandlerCollection();
    contexts.setHandlers(new Handler[] { new TestHandler("/test") });
    contextHandler.setHandler(contexts);

    handler.setHandlers(new Handler[] { contextHandler, new DefaultHandler() });
    server.setHandler(handler);
    server.start();
    server.dumpStdErr();
    server.join();
}

但它不起作用。如果我在up代码中删除var contextHandler。请求http://localhost:9001/test它有效。调用了Testhandle.doHandle()。如果我想在ContextHandlerCollection中向所有contextHandlers添加父上下文路径,该怎么做?

1 个答案:

答案 0 :(得分:0)

嵌套的ContextHandlerCollection不是它自己的上下文,也不是父上下文的加法。

Handler只知道自己及以下,而不是它上面的内容。

您的代码基本上说明了以下内容

Server
  + HandlerCollection
      + ContextHandler "/gm"
      |   + ContextHandlerCollection
      |       + TestHandler "/test"
      + DefaultHandler  

如果传入请求在http://localhost:9001/gm/test上,则该请求的处理将命中ContextHandler "/gm"并允许处理该子树(因为它与传入请求匹配)。然后它命中TestHandler "/test"(我假设它自己的上下文路径或目标逻辑),然后再不匹配/gm/test != /test,因为TestHandler对ContextHandler一无所知在它之上。

您的代码可能如下所示......

public static void main(String[] args) throws Exception {
    Server server = new Server(new QueuedThreadPool(8, 6));
    ServerConnector connector = new ServerConnector(server);
    connector.setPort(9001);
    server.setConnectors(new Connector[] { connector });

    HandlerCollection handlers = new HandlerCollection();
    server.setHandler(handlers);

    ContextHandlerCollection contexts = new ContextHandlerCollection();

    String baseContext = "/gm";
    // map on "/gm/test"
    contexts.addHandlers(new TestHandler(baseContext + "/test"));
    // map on "/gm/foo"
    contexts.addHandlers(new FooHandler(baseContext + "/foo"));

    baseContext = "/odd";
    // map on "/odd/bar"
    contexts.addHandlers(new BarHandler(baseContext + "/bar"));

    handlers.setHandlers(new Handler[] { contexts, new DefaultHandler() });

    server.start();
    server.dumpStdErr();
    server.join();
}
相关问题