当前位置: 首页 > 知识库问答 >
问题:

如何在一个servlet中拥有多个endpoint并在web.xml中声明它们[duplicate]

韶亮
2023-03-14
http://localhost:8080/HelloServlet/hello
and
http://localhost:8080/HelloServlet/Test
@WebServlet(name = "HelloServlet", urlPatterns = {"/sayHello", "/hello", "/helloWorld"})
public class HelloWorld extends HttpServlet{

    private String responseContentType = null;
    
    public HelloWorld() {
        super();
    }
    
    public void init() throws ServletException {
        responseContentType = "text/html;charset=UTF-8";
    }
    
    public void doGet(HttpServletRequest request, HttpServletResponse response)
                   throws IOException, ServletException {
          // Set the response message's MIME type
          response.setContentType(responseContentType);
          // Allocate a output writer to write the response message into the network socket
          PrintWriter out = response.getWriter();
     
          // Write the response message, in an HTML page
          try {
             out.println("<!DOCTYPE html>");
             out.println("<html><head>");
             out.println("<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>");
             out.println("<title>Hello, World</title></head>");
             out.println("<body>");
             out.println("<h1>Hello, world!</h1>");  // says Hello
             // Echo client's request information
             out.println("<p>Request URI: " + request.getRequestURI() + "</p>");
             out.println("<p>Protocol: " + request.getProtocol() + "</p>");
             out.println("<p>PathInfo: " + request.getPathInfo() + "</p>");
             out.println("<p>Remote Address: " + request.getRemoteAddr() + "</p>");
             // Generate a random number upon each request
             out.println("<p>A Random Number: <strong>" + Math.random() + "</strong></p>");
             out.println("</body>");
             out.println("</html>");
          } finally {
             out.close();  // Always close the output writer
          }
       }
}
@WebServlet(name = "HelloServlet", urlPatterns = {"/test"})
public class Test extends HttpServlet{
    
private String responseContentType = null;
    
    public Test() {
        super();
    }
    
    public void init() throws ServletException {
        responseContentType = "text/html;charset=UTF-8";
    }
    
    
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException {
   // Set the response message's MIME type
   response.setContentType(responseContentType);
   // Allocate a output writer to write the response message into the network socket
   PrintWriter out = response.getWriter();

   // Write the response message, in an HTML page
   try {
      out.println("<!DOCTYPE html>");
      out.println("<html><head>");
      out.println("<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>");
      out.println("<title>Hello, World</title></head>");
      out.println("<body>");
      out.println("<h1>TEST</h1>");  // says Hello
      // Echo client's request information

      // Generate a random number upon each request
      out.println("<p>A Random Number: <strong>" + Math.random() + "</strong></p>");
      out.println("</body>");
      out.println("</html>");
   } finally {
      out.close();  // Always close the output writer
   }
}
}

web.xml:

    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
  <display-name>HelloServlet</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  
  <servlet>
      <servlet-name>HelloServlet</servlet-name>
      <servlet-class>com.examples.HelloWorld</servlet-class>
      <servlet-class>com.examples.Test</servlet-class>
   </servlet>
   
 <servlet-mapping>
      <servlet-name>HelloServlet</servlet-name>
      <url-pattern>/sayHello</url-pattern>
      <url-pattern>/hello</url-pattern>
      <url-pattern>/helloWorld</url-pattern>
   </servlet-mapping>
   
 <servlet-mapping>
      <servlet-name>HelloServlet</servlet-name>
      <url-pattern>/test</url-pattern>
   </servlet-mapping>

</webapp>

共有1个答案

邢永安
2023-03-14

如果您真的想在同一个类中创建两个不同的endpoint,无论出于什么奇怪的原因,我可以想到以下两个解决方案:

  1. 尝试使用@WebServlet注释实现一个内部类。我不知道它是否被选中并安装,但值得一试
  2. 有两个类,但是让第二个类(具有第二个地址)调用第一个类。当我有多个页面需要的任务时,这是我经常做的(静态)。

我自己曾经写过一个库,它将注释解析为地址,我想“啊,我比那些愚蠢的JEE东西更好...我也会允许单个方法被引用”。这一点也不难实施。但是:我后悔这样做,因为使用的软件变得非常笨拙和奇怪,一个文件可能是多个endpoint的根...因此,当我重新设计这个库时,我删除了这个函数,现在只允许类级别的endpoint注释。坚持这一点的项目更干净,更容易维护。

 类似资料:
  • 我正在尝试在web.xml中映射多个servlet。在我的index.html中,我有一个操作“desktype.do”的表单,当我运行程序时,它成功了。我是这样开始的: …效果很好。它成功地编译,并且在按下我在index.html中设置的按钮后,它就会按照需要运行。在添加了额外的servlet映射之后: 我收到错误“模块尚未部署。详细信息请参阅服务器日志。构建失败(总时间;0秒)”我不确定该怎么

  • 在一个web.xml中有多个jersey servlet是可能的吗?我尝试以这种方式执行RESTfull版本控制:

  • 问题内容: 我想在Spring web.xml中定义两个servlet-一个用于应用程序html / jsp页面,另一个用于将由外部应用程序调用的Web服务。这是web.xml: 如果我让我的servlet单独在文件中使用DispatcherServlet,它可以正常工作。如果我的用户Web服务的配置文件(user-service- servlet.xml)具有context- param,则可以

  • 我想合并/添加一个新泽西项目B(已经运行良好)到一个新泽西项目a,这将充当一个过滤器/安全层。因此,作为一个基本步骤,我在项目a的构建路径上向项目B添加了依赖项,并在构建路径中向部署程序集添加了相同的依赖项。我从这篇文章中了解到,我可以通过将servlet放在同一个中,并使用以不同的方式映射它们来实现这一点。当我试图访问项目B的资源时,我没有任何运气。 因此,当我尝试访问时,它工作得很好。但是当我

  • 问题内容: 我要实现的目标是创建一个包含多个功能的模块。 module.js: 我的问题是,这是一个对象类型,而这是一个URL字符串,但是当我遇到该问题时,它总是抱怨该类型是错误的。 在这种情况下,如何声明多个module.exports? 问题答案: 您可以执行以下操作: 要不就: 然后在调用脚本中:

  • 问题内容: 我们可以在Android中拥有服务的多个实例吗?我想要一种可以在特定时间使手机静音的服务,并且我想重新使用该服务以使手机在特定时间处于振动模式。因此,基本上,如果我可以使该服务多次运行,则无需创建其他服务即可将手机设置为振动模式。另外,如果我们可以运行多个实例,请说明如何停止它。任何代码提示都会有很大帮助。 问题答案: 我们可以在Android中拥有服务的多个实例吗? 不能。您可以具有