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。
任何帮助?
提前致谢
答案 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客户端代码)
只需进行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)
要从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
}