java - 如何编写 web.xml 以使用 maven 和 jetty 启动服务器端

标签 java xml maven jakarta-ee web.xml

我应该在 web.xml 中放入什么来启动服务器端。我启动了 jetty,但只有 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");  
    }
}

最佳答案

如果您关心的只是启动服务器端端点,那么您只需添加一个 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,则必须向 JettyServlet (在您的情况下应该是 ServerSide)注册一个 Websocket 处理程序(它是应该是子类型 ``) 并将后者 (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");  
      }
    }
    

关于java - 如何编写 web.xml 以使用 maven 和 jetty 启动服务器端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26694109/

相关文章:

android - 不同类型的解析

xml - xpath 中的否定 - 随之而来的是欢闹

java - 带有 lombok 问题的 Openshift

python - PySpark 2.x : Programmatically adding Maven JAR Coordinates to Spark

java - Android中命令包含中文或空格时如何发送HTTP命令?

java - Android SDK 中的 Junit 测试

java - 使用 AspectJ spring-aop 改变返回值的类型

java - 使用 Spring RestTemplate 对对象进行 POST 参数

xml - 是否可以从 Mac OS 使用 XSD 工具?

java - 如何使用 maven 发布插件发布 Hotfix