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

时间:2015-06-09 13:47:03

标签: java servlets jetty embedded-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");

2 个答案:

答案 0 :(得分:7)

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

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

另请注意,ServletHandler被视为ServletContextHandler的内部类,并不打算在原始"中使用"像Jetty那样。虽然它在技术上是可行的,但对于Servlet的最天真和最简单的实现,我们不鼓励它。

答案 1 :(得分:2)

例如,您可以使用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);