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

时间:2015-09-23 13:59:07

标签: java servlets gwt task-queue

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。

任何帮助?

提前致谢

2 个答案:

答案 0 :(得分:0)

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

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

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

例如,如果要从两个不同的servlet中排队相同的请求,可以创建一个像

这样的QueueManager

公共类QueueManager {

public static void startWorker(String key){

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

}

}

然后通过

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

答案 1 :(得分:0)

(来自服务器上的servlet)

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

String enqueueURL = "/enqueue";

RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(destination);
dispatcher.forward(request, response);

要将List发送到另一个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