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 实现之外,不鼓励使用它。
我正在尝试开始使用嵌入式 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 实现之外,不鼓励使用它。