如何解决嵌套的 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 举报,一经查实,本站将立刻删除。