Jetty 中的 ServletHandler 和 ServletContextHandler 有什么区别?

What's the difference between a ServletHandler and a ServletContextHandler in Jetty?

我正在尝试开始使用嵌入式 Jetty 服务器。我只是想根据请求路径将请求映射到不同的servlet。

创建 ServletHandler 并向其添加 servlet 与创建 ServletContextHandler 并向其添加 servlet 有什么区别?

例如:

//how is this different...
ServletHandler handler = new ServletHandler();
handler.addServletWithMapping(MyServlet.class, "/path");

//from this?
ServletContextHandler contextHandler = new ServletContextHandler();
contextHandler.addServlet(MyServlet.class, "/path");

例如,您可以使用 ServletContextHandler 创建 VirtualHosts,并且可以轻松地管理上下文。这意味着不同端口上的不同上下文处理程序。

Server server = new Server();
ServerConnector pContext = new ServerConnector(server);
pContext.setPort(8080);
pContext.setName("Public");
ServerConnector localConn = new ServerConnector(server);
localConn.setPort(9090);
localConn.setName("Local");

ServletContextHandler publicContext = new ServletContextHandler(ServletContextHandler.SESSIONS);
publicContext.setContextPath("/");
ServletHolder sh = new ServletHolder(new HttpServletDispatcher());  sh.setInitParameter("javax.ws.rs.Application", "ServiceListPublic");
publicContext.addServlet(sh, "/*");
publicContext.setVirtualHosts(new String[]{"@Public"});


ServletContextHandler localContext = new ServletContextHandler(ServletContextHandler.SESSIONS);
localContext .setContextPath("/");
ServletHolder shl = new ServletHolder(new HttpServletDispatcher()); shl.setInitParameter("javax.ws.rs.Application", "ServiceListLocal");
localContext.addServlet(shl, "/*");
localContext.setVirtualHosts(new String[]{"@Local"}); //see localConn.SetName


HandlerCollection collection = new HandlerCollection();
collection.addHandler(publicContext);
collection.addHandler(localContext);
server.setHandler(collection);
server.addConnector(pContext);
server.addConnector(localContext);

大多数 Servlet 需要 javax.servlet.ServletContext 对象才能正常运行。

使用 ServletContextHandler 将为 ServletContextHandler 中的所有 Servlet、过滤器、会话、安全性等创建和管理公共 ServletContext。这包括正确的初始化、加载顺序和销毁受 ServletContext 影响的组件。

另请注意,ServletHandler 被视为 ServletContextHandler 的内部 class,并不意味着像 Jetty 那样使用 "in the raw"。虽然这在技术上是可行的,但除了最天真和最简单的 Servlet 实现之外,不鼓励使用它。