我写了一个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添加父上下文路径,该怎么做?
答案 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();
}