如何使用 Java 在 GWT 中将一个 servlet 调用到另一个 servlet

How to call one servlet to another servlet in GWT Using Java

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。

有什么帮助吗?

提前致谢

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

所以,实际上,让 servlet1 调用 servlet2 是错误的方法。

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

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

的 QueueManager

public class 队列管理器 {

public static void startWorker(String key){

    Queue queue = QueueFactory.getDefaultQueue();
    queue.add(TaskOptions.Builder.withUrl("/worker").param("key", key));

}

}

然后通过

从您的 servlet 中调用它
QueueManager.startWorker(aKey);

(来自服务器上的一个 servlet)

要在不使用 html 代码的情况下调用 call enqueue servlet,您可以使用 RequestDispatcherforward 请求。

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 客户端代码)

  • 方法一]

只需进行一个 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);
  }
}

如果您需要帮助将列表转换为字节[],请参阅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)

  • 方法二]

要从 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