【问题标题】:How compose web.xml to lauch server side with maven and jetty如何编写 web.xml 以使用 maven 和 jetty 启动服务器端
【发布时间】:2014-11-01 22:54:26
【问题描述】:

我应该在 web.xml 中添加什么来启动服务器端。我启动了码头,但只有 ui 工作服务器端没有运行

我有下一个文件夹树:

src
  |-main
      |-java
      |    |-com
      |        |-example
      |                |-test
      |                     |-ServerSide.java
      |-webapp
             |-index.html
             |-WEB-INF
                     |-web.xml

服务器端类

package com.example.test;

import java.io.IOException;
import java.util.Date;

import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;


@ServerEndpoint("/testbattle")
public class ServerSide {
    @OnOpen
    public void onOpen(Session session) throws IOException {
        System.out.println("Welcome" + new Date());
        session.getBasicRemote().sendText("Hello websockets");  
    }
}

【问题讨论】:

  • 我认为web.sml 只是一个拼写错误,文件的名称确实是web.xml,对吧?不管怎样,如果ServerSide 是一个servlet,你应该把servletservlet-mapping 元素放在你的web.xml 中。或者您可以在您的 servlet 类上使用 @WebServlet 注释,在这种情况下您不需要在 web.xml 中指定任何内容。
  • 是的,你是对的,这是一个错字。但是当我将servlet 放入 web.xml 时,它需要实现 servlet。它会导致我在这里描述的另一个问题stackoverflow.com/questions/26690910/…
  • 这是合乎逻辑的。如果您在 web.xml 中注册 servlet,它实际上必须是一个 servlet。你能分享一下你的 ServerSide 类的代码吗?
  • 我只是无法理解不需要实现 servlet 和 maven web 项目的动态 web 项目之间的区别
  • 好吧,我的印象是 ServerSide 是一个普通的 HTTP Servlet,而不是 Websocket 端点。在这种情况下,您不需要实现 Servlet 接口。

标签: java xml maven jakarta-ee web.xml


【解决方案1】:

如果您关心的只是启动服务器端端点,那么您可以添加一个 main 方法,这将是您的应用程序入口,但请注意,这不会让 jetty maven 插件运行您的应用程序,因为 jetty是一个基于 servlet 的 Web 容器。

package com.example.websocket;

import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.DefaultServlet;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.eclipse.jetty.websocket.jsr356.server.deploy.WebSocketServerContainerInitializer;

public class ServerStarter {
  public static void main( String[] args ) throws Exception {
  Server server = new Server(8080);

  final ServletHolder servletHolder = new ServletHolder(new DefaultServlet());
  final ServletContextHandler context = new ServletContextHandler();

  context.setContextPath("/");
  context.addServlet(servletHolder, "/*");

  server.setHandler(context);
  WebSocketServerContainerInitializer.configureContext(context); 

  server.start();
  server.join(); 
  }
}

如果您打算在普通 Web 应用程序中使用 websocket,则必须将 websocket 处理程序(在您的情况下应该是 ServerSide)注册到 JettyServlet(应该是子类型 ``)并注册后者 (JettyServlet) 进入 web.xml 文件而不是 ServerSide 类:

  • web.xml

    <web-app>
      <display-name>WebSocketApp</display-name>
      <servlet>
        <servlet-name>wsservlet</servlet-name>
        <servlet-class>com.example.test.MyJettyServlet</servlet-class>
      </servlet>
      <servlet-mapping>
        <servlet-name>wsservlet</servlet-name>
        <url-pattern>/</url-pattern>
      </servlet-mapping>
    </web-app>
    
  • MyJettyServlet

    package com.example.test;
    
    public class MyJettyServlet extends WebSocketServlet {
      @Override
      public void configure(WebSocketServletFactory factory) {
        factory.register(ServerSide.class);
      }
    }
    
  • 服务器端

    @WebSocket
    public class ServerSide {
      @OnOpen
      public void onOpen(Session session) throws IOException {
        System.out.println("Welcome" + new Date());
        session.getBasicRemote().sendText("Hello websockets");  
      }
    }
    

【讨论】:

  • 所以当我使用 eclipse 创建动态 web 项目并使用 servlets 容器时,这些东西是自动创建的,不是吗?
  • 这样,Web 容器将管理您的 servlet,但您可以告诉您 servlet 像后端 Web 套接字端点一样工作,即按照说明创建您自己的 servlet。
猜你喜欢
  • 1970-01-01
  • 2013-03-19
  • 2013-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-10
  • 2012-10-16
  • 1970-01-01
相关资源
最近更新 更多