【问题标题】:How can I send http request to another servlet如何将 http 请求发送到另一个 servlet
【发布时间】:2023-04-05 09:52:01
【问题描述】:

在我的项目文件夹中,ContextPath/WEB-INF/Classes/*.class 下有 2 个 java 文件,名称分别为 App1.class 和 App2.class

如果我想运行App1.class,只需在浏览器中触发URL即可。

  http://localhost:8080/Mapping/App1

同理,如果要触发App2.class,请使用以下链接

 http://localhost:8080/Mapping/App2

我想从App1触发App2,意思是如果你在浏览器中用相应的URL触发App1,就会触发App2。

我也不想回复。

我该怎么做。

谁能帮帮我。

谢谢。

【问题讨论】:

  • 是App1 和App2 servlet 吗?

标签: java java-ee-6


【解决方案1】:

我想从App1触发App2,意思是如果你在浏览器中用相应的URL触发App1,就会触发App2。

考虑到App1 和App2 在您的Mapping web-app 中配置为servlet;您可以使用RequestDispatcher 到forward() 的请求到App2。这将发生在服务器端,即浏览器会收到来自App1 的响应。

if (isForwardReqd()) {
    RequestDispatcher rd = request.getRequestDispatcher("App2");
    rd.forward(request, response);
}

请注意,App1 在执行forward() 之前不得做出响应,否则您将收到IllegalStateException。

参考:
http://docs.oracle.com/javaee/7/api/javax/servlet/RequestDispatcher.html

定义一个对象,它接收来自客户端的请求并将它们发送到服务器上的任何资源(例如 servlet、HTML 文件或 JSP 文件)。

【讨论】:

  • 我还有一个疑问,如果我从App2再触发一个像App3这样的应用程序,我可以这样做吗。最终流量是App1-->App2--> App3.
  • @user2642355 是的,您可以链接任意数量的 servlet。只需确保唯一的最后一个 servlet 写入响应。如果中间的 servlet 想要在响应中添加一些东西;将其作为请求属性传递。
  • 如果我有App3 在另一个包名中为External。下面的说法是对的。 ` RequestDispatcher rd = request.getRequestDispatcher("External/App3");`
  • isForwardReqd() 是什么。
  • 不,External.App3 应该映射为您的web.xml 中的 servlet。如果您将其映射到/App3,那么这就是您用来获取调度程序的路径。 isForwardReqd() 只是一种检查是否需要转发的虚拟方法。这不是必需的。
【解决方案2】:

您可以使用 Java 发送 Get 请求;

URL url = new URL("http://localhost:8080/Mapping/App2");
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setRequestMethod("GET");
conn.connect();

或者,您可能应该配置 App2,以便它的操作由单独的类或两个 servlet 都可以访问的方法处理。

【讨论】:

    【解决方案3】:

    可能的方法

    HTTP GET 带有(可选)查询参数的请求

    String query = String.format("param1=%s&param2=%s", 
                 URLEncoder.encode("param1Value", "UTF-8"), 
                 URLEncoder.encode("param1Value", "UTF-8"));
    
        URL url = new URL(servletURL + "?" + query);
        HttpURLConnection conn = (HttpURLConnection)url.openConnection();
        conn.setRequestMethod("GET");
        Map<String, List<String>> header = conn.getHeaderFields();
        int responseCode = conn.getResponseCode();
        System.out.println("Headers : "+header);
        System.out.println("Response Code "+responseCode);
    

    RequestDispatcher - 将请求从一个资源分派到另一个资源。如果它们在同一个项目和服务器中可用。

    • 这个接口允许你做一个服务器端转发/包含, 执行请求的 Servlet 的 service(...)/doGet(...) 方法。

      RequestDispatcher rd = req.getRequestDispatcher("/servlet2");
      rd.forward(req, resp); // rd.include(req, resp);
      

      相同的服务器,不同的项目

      RequestDispatcher rd = req.getServletContext().getContext("/Project2").getRequestDispatcher("/ips");
          rd.forward(req,  resp);
      

    .sendRedirect()

    • 从客户端重定向请求[在客户端的浏览器中更改 URL]。
    • 当服务器遇到 sendRedirect 方法时,它会向客户端发送一个带有 3XX 状态码的临时重定向响应,然后请求新的 URL。
    • www.sun.com 重定向到 www.oracle.com/sun/index.html

      response.sendRedirect(servletURL); // Different Server.
      

    Invoking Other Servlet 使用不同的方式

    【讨论】:

      猜你喜欢
      • 2012-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-17
      • 1970-01-01
      相关资源
      最近更新 更多