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)。
我正在使用 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)。