2015-10-16 54 views
1

终点,我知道我们可以映射因为Servlet API的3.0在运行一个servlet,可以实现如下:映射的WebSockets在运行时

@Override 
public void contextInitialized(ServletContextEvent sce) { 
    ServletContext sc = sce.getServletContext(); 

    String servletMapping = "/yourURL"; 
    ServletRegistration sr = sc.addServlet(servletMapping, "org.yourdomain.yourclass"); 
    sr.setInitParameter("key", "value"); 
    sr.addMapping(servletMapping); 
} 

是否有使用WebSockets(使用的javax这样做的类似的方式。 websockets.api)?

回答

0

相当于ServletContainerInitializer的Websocket是ServerApplicationConfig。它只需要一个服务文件,Websocket API将主动扫描WAR中的WAR和JAR,以实现ServerApplicationConfig接口的任何类并使用它们。您可以在getEndpointConfigs()使用ServerEndpointConfig.Builder以编程方式构建WebSocket端点并将其返回。

这是一个开创性的例子,假设YourEndpoint.class代表您希望以编程方式添加的WebSocket端点,并且您希望忽略任何扫描的类。

public class YourServerApplicationConfig implements ServerApplicationConfig { 

    @Override 
    public Set<ServerEndpointConfig> getEndpointConfigs(Set<Class<? extends Endpoint>> scannedClasses) { 
     Set<ServerEndpointConfig> configs = new HashSet<>(); 
     configs.add(ServerEndpointConfig.Builder.create(YourEndpoint.class, "/yourPath").build()); 
     return configs; 
    } 

    @Override 
    public Set<Class<?>> getAnnotatedEndpointClasses(Set<Class<?>> scannedClasses) { 
     return Collections.emptySet(); 
    } 

} 
+0

是的,我知道,但我真的很后在运行时更改端点的方式,对servlet我保持对它的引用servlet上下文,并可以在运行时随时添加的servlet。在启动时调用ServerApllicationConfig方法只是正确的? – Tiago

+0

在上下文初始化后不允许添加/删除servlet。它会抛出ISE。所以,这并没有什么不同。 – BalusC

+0

ouch ...我指望能够在初始化后更改映射。你说得对,它不起作用。谢谢。 – Tiago