嵌套的 ContextHandler 的行为不符合预期

问题描述

对于更复杂的应用程序的简化示例,我正在尝试这样做:

ContextHandlerCollection
|
base1/     ContextHandler
├─ test1/  ServletContextHandler
│  ├─ /    Servlet "Test1.class"              -> "test1
├─ test2/  ServletContextHandler
│  ├─ /    Servlet "Test2.class"              -> "test2
base2/     ContextHandler -> Custom Handler   -> "hello"

使用以下代码

final ServletContextHandler test1 = new ServletContextHandler();
test1.setcontextpath("/test1");
test1.addServlet(Test1.class,"/"); // This servlet writes "test1"

final ServletContextHandler test2 = new ServletContextHandler();
test2.setcontextpath("/test2");
test2.addServlet(Test2.class,"/"); // This servlet writes "test2"

final ContextHandlerCollection base1Collection = new ContextHandlerCollection();
base1Collection.addHandler(test1);
base1Collection.addHandler(test2);

final ContextHandler base1 = new ContextHandler();
base1.setcontextpath("/base1");
base1.setHandler(base1Collection);

final ContextHandler base2 = new ContextHandler();
base2.setcontextpath("/base2");
base2.setHandler(new AbstractHandler() {

    @Override
    public void handle(final String target,final Request baseRequest,final HttpServletRequest request,final HttpServletResponse response) throws IOException,servletexception {
        response.getWriter().println("hello");
        baseRequest.setHandled(true);
    }

});

final ContextHandlerCollection list = new ContextHandlerCollection();
list.addHandler(base1);
list.addHandler(base2);

server.setHandler(list)

但我观察到以下行为:

/base2              -> "hello"
/base2/anything     -> "hello"
/base1              -> 404 (no servlet)
/base1/test1        -> 404 from Test1 servlet
/base1/test2        -> 404 (no servlet)
/base1/test1/test1  -> "test1"
/base1/test1/test2  -> "test1"
/base1/test1/test3  -> 404 from Test1 servlet

/base2,单曲 ContextHandler,按我想的那样工作。但是,为什么 /base1/test1 不为 Test1 servlet 提供服务,而 /base1/test1/test1 提供服务?它从哪里获得双 /test1 路径?更奇怪的是,/base1/test1/test2 如何也为 Test1 servlet 提供服务?

documentation 似乎没有描述嵌套的 ContextHandler

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)