在web.xml文件中映射WebSocketEndpoints
我正在尝试开发一个使用websocket端点并将其部署在Jetty服务器上的Java EE 7 Web应用程序。
该应用程序具有以下结构:
Game/ src/ main/ java/ game/ WebSocketEndpoint.java webapp/ index.html scripts/ variousjavascriptstuff.js WEB-INF/ beans.xml web.xml
在beans.xml文件中:
WebSocketEndpoint已正确注释,并且可以与Netbeans / Glassfish4一起使用,但是,应用程序必须部署在Jetty服务器上。
所以,我的问题 – 如何将websocket端点映射到web.xml文件中的URL /游戏? 我已经找到了一些映射servlet的例子,但我认为这不适用于服务器端点。
或者,有没有办法为Jetty编写web.xml文件,以便它自动发现ll带注释的类/方法(类似于上面的beans.xml)
假设你使用JSR-356技术注释了game.WebSocketEndpoint
……
例:
package game; import javax.websocket.server.ServerEndpoint @ServerEndpoint("/game") public class WebSocketEndpoint { }
然后你必须做以下事情……
- 使用Jetty 9.1+
- 启用’websocket’模块 (将
--module=websocket
添加到start.ini
或命令行)
这将使websocket服务器类+注释扫描websocket端点。
注意:JSR-356并不意味着通过部署描述符( web.xml
)进行映射。
但是,您可以使用以下方法之一以编程方式映射端点:
- 创建一个
javax.servlet.ServletContextListener
,通过javax.websocket.server.ServerContainer
手动添加端点(参见下面的方法) - 创建一个
javax.servlet.ServerContainerInitializer
,通过javax.websocket.server.ServerContainer
手动添加端点(参见下面的方法) - 创建一个返回要添加的端点的
javax.websocket.server.ServerAppliationConfig
。
注意:技术#2和#3都需要类扫描注释(慢启动)。 技术#1是快速启动。
如何手动添加端点
// Get a reference to the ServerContainer javax.websocket.server.ServerContainer ServerContainer = (javax.websocket.server.ServerContainer) servletContext.getAttribute("javax.websocket.server.ServerContainer"); // Add endpoint manually to server container serverContainer.addEndpoint(game.WebSocketEndpoint.class);