【问题标题】:How to call one servlet to another servlet in GWT Using Java如何在 GWT 中使用 Java 调用一个 servlet 到另一个 servlet
【发布时间】:2015-09-23 13:59:06
【问题描述】:

1) 嗨,我是新的 gwt。我想将一个 servlet 执行到另一个 servlet。例如,我想从 servlet1 执行 servlet2。我可以使用 RPC 调用执行 sevlet1,所以我想从 servlet1 执行 servlet2,它有我想执行的 doPost 方法。

2) 我想在 GAE 上使用任务队列。所以可以通过阅读https://cloud.google.com/appengine/docs/java/taskqueue/overview-push来理解任务队列。在本文档中,Enqueue 是创建任务的 servlet,worker 是另一个执行任务队列代码的 servlet。那么如何在不使用 html 代码的情况下调用 enqueue servlet。

有什么帮助吗?

提前致谢

【问题讨论】:

    标签: java servlets gwt task-queue


    【解决方案1】:

    (来自服务器上的 servlet)

    要在不使用 html 代码的情况下调用 call enqueue servlet,请使用 RequestDispatcher转发 请求。

    String enqueueURL = "/enqueue";
    
    RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(destination);
    dispatcher.forward(request, response);
    

    要将列表发送到另一个 servlet,请使用 request.setAttribute

    request.setAttribute("myList", list);
    

    要在不同的 servlet 中获取它,请使用 request.getAttribute

    List value = (List)request.getAttribute("myList")
    

    从设计的角度来看,如果您的 servlet 用作控制器,例如在模型-视图-控制器系统中,那么它的使用是合适的。

    (来自 GWT 客户端代码)

    • 方法 A]

    只需进行一次 RPC 调用,然后在处理它的方法中放入您的队列代码:

    public class MyServiceImpl extends RemoteServiceServlet implements
        MyService {
    
      public void myMethod(String key) {
      Queue queue = QueueFactory.getDefaultQueue();
      byte[] buf;
      TaskOptions taskOptions= TaskOptions.Builder.withUrl("/tasks/worker").method(Method.POST);
      taskOptions.payload(buf);
      queue.add(taskOptions);
      }
    }
    

    如果您在将 List 转换为 byte[] 时需要帮助,请参阅 this or something like it (i.e. coverting a Java Object to an byte[] array ..don't forget to include a cast to get it back into a List)

    • 方法 B]

    要从 GWT 中的客户端代码调用 servlet,只需使用 RequestBuilder

    import com.google.gwt.http.client.*;
    ...
    
    String url = "http://www.myurl.com/enqueue";
    RequestBuilder builder = new RequestBuilder(RequestBuilder.POST, URL.encode(url));
    
    try {
      Request request = builder.sendRequest(null, new RequestCallback() {
        public void onError(Request request, Throwable exception) {
           // Couldn't connect to server (could be timeout, SOP violation, etc.)
        }
    
        public void onResponseReceived(Request request, Response response) {
          if (200 == response.getStatusCode()) {
              // Process the response in response.getText()
          } else {
            // Handle the error.  Can get the status text from response.getStatusText()
          }
        }
      });
    } catch (RequestException e) {
      // Couldn't connect to server
    }
    

    GWT Docs on RequestBuilder

    【讨论】:

    • 感谢您的宝贵意见,但在 GWT 中我们不能使用 RequestDispatcher
    • 实际上我想调用 Enqueue sevlet 而不使用给定示例 cloud.google.com/appengine/docs/java/taskqueue/overview-push 的 html 代码,那么我如何从用户请求中调用 Enqueue servlet
    • RequestDispatcher 将在 servlet 中运行,并且应该可以与 GWT 一起正常工作。它不在客户端代码中运行。要从客户端代码调用,只需使用 RPC 调用,然后在 ServiceImpl 类中处理调用的方法中安排任务。否则,您可以从 GWT 客户端代码调用 servlet,但如果您已经在使用 RPC 调用,则更容易。
    • 非常感谢,我想根据 MyserviceImpl 中的方法 A RPC 调用获得更多信息).save.entities(list).now 和 param 只接受我想在列表中发送的字符串我该如何发送??
    • 我想将arraylist 发送给worker 我该如何发送?通过使用 param 它只接受字符串值。任何想法请帮助我
    【解决方案2】:

    Servlet 只是客户端和服务器之间的通信。您的服务器应该尽其所能来整理您的信息,然后将其传递给您的应用程序的业务层。

    所以,真的,让 servlet1 调用 servlet2 是错误的方法。

    两个 servlet 都会返回业务层中相同方法的结果。这使您的代码更容易测试和维护。

    例如,如果您想将来自两个不同 servlet 的相同请求排入队列,您可以创建一个类似 QueueManager 的

    公共类队列管理器{

    public static void startWorker(String key){
    
        Queue queue = QueueFactory.getDefaultQueue();
        queue.add(TaskOptions.Builder.withUrl("/worker").param("key", key));
    
    }
    

    }

    然后从你的servlet调用它

    QueueManager.startWorker(aKey);
    

    【讨论】:

    • 感谢 Thom 的宝贵意见。实际上,我想在我的应用程序中实现任务队列,因此首先创建任务队列我们创建一个 servlet 及其实现代码,我们在另一个 servlet 中编写,所以我如何实现这一点以及如何通过 RPC 调用或其他任何方式调用第一个 servlet
    • 您将任务队列移到 servlet 之外。一个对象做一件事。 servlet 必须与 JEE 服务器通信并启动任务。管理任务队列超出了单个对象的范围。这就是为什么它需要移到外面。您遇到的问题表明存在设计缺陷。你不想通过调用servlet到servlet来解决它。
    • 感谢 Thom,但如果我从 servlet 移动任务队列,那么如何创建它以及如何执行它以及用户如何启动它,请您简要解释一下。并尽可能举个例子
    • 没有看到你的代码,我无法开始回答这个问题。您可能需要使用单例。
    • 刚才我实现了本文档cloud.google.com/appengine/docs/java/taskqueue/overview-push 中给出的任务队列,只是我不想使用 html 代码。所以不使用 html 代码如何执行 Enqueue 类
    猜你喜欢
    • 1970-01-01
    • 2011-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-13
    • 1970-01-01
    • 2020-08-19
    相关资源
    最近更新 更多