WebSocketHandler 和 WebSocketServlet 的区别

Difference between WebSocketHandler and WebSocketServlet

我正在使用 Jetty 9 设置 WebSocket 处理程序。 我看过使用 WebSocketHandler 或 WebSocketServlet 的示例。

这是我正在做的事情:

public class WebSocketServer{
  public WebSocketServer(){ 
    WebSocketHandler wsHandler = new WebSocketHandler() {
      @Override
      public void configure(WebSocketServletFactory factory) {
        factory.register(MyWebSocketHandler.class);
      }
    };
  }
}

@WebSocket
public class MyWebSocketHandler{...}

这是他们正在做的事情: (摘自 http://www.eclipse.org/jetty/documentation/current/jetty-websocket-server-api.html

@WebServlet(name = "MyEcho WebSocket Servlet", urlPatterns = { "/echo" })
public class MyEchoServlet extends WebSocketServlet {

  @Override
  public void configure(WebSocketServletFactory factory) {
    factory.register(MyEchoSocket.class);
  }
}

实际的区别是什么?最好的方法是什么?

谢谢。

这 2 个选择反映了人们在为 Jetty 编写应用程序时使用的 2 个基本技术。

WebSocketHandler 是组织 Web 应用程序的更基本 Handlers 技术的一部分。这些处理程序非常基本,代表了 Jetty 中请求处理的基本构建块。从本质上讲,服务器只有 1 个处理程序要处理(又名 Server.setHandler(Handler))。

有许多内置处理程序提供了组织处理程序的机制。作为这种多样性的一个例子(冰山一角),你可以通过使用 HandlerList, wrap Handlers in HandleWrapper to have optional behavior based on request details, specify Context's for then using ContextHandler inside of a ContextHandlerCollection 等来拥有超过 1 个处理程序。(在 Whosebug 的答案中有太多的组合)

WebSocketServlet 是组织 Web 应用程序的更高级别的方式,完全在 Servlet 规范和标准内配置。完成他们所有的注释、过滤器、监听器、行为等标准。

人们通常会挑选一种技术或另一种技术。两者都同样有能力,同样表现出色。两者都不是更好的选择。

选择一种技术而不是另一种技术并在整个 Web 应用程序中坚持使用该技术通常是明智的,因为混合这 2 种行为是棘手的,并且充满了意外行为的地雷。

注意:从架构上讲,Servlet层本身就是一个Jetty Handler,要么通过ServletContextHandler or the WebAppContext(它只是一个专门的ServletContextHandler)。