2015-09-23 56 views
0

1)您好,我是新gwt。我想執行一個servlet到另一個servlet。例如我想從servlet1之一執行servlet2。我可以使用RPC調用來執行sevlet1,所以從servlet1我想執行servlet2,它有我想要執行的doPost方法。如何調用一個servlet到GWT中的另一個servlet使用Java

2)我想在GAE上使用任務隊列。所以可以通過閱讀https://cloud.google.com/appengine/docs/java/taskqueue/overview-push來了解任務隊列。在本文檔中,Enqueue是創建任務的servlet,Worker是執行Task Queue代碼的另一個Servlet。那麼如何在不使用html代碼的情況下調用enqueue servlet。

有幫助嗎?

在此先感謝

回答

0

(從服務器上的一個servlet)

要呼叫,而不使用HTML代碼調用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作爲一個控制器發揮作用,比如在Model-View-Controller系統中, ñ它的使用是適當的。

(從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); 
    } 
} 

如果您需要幫助將列表轉換爲字節[],請參閱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

+0

感謝您的寶貴意見,但In GWT我們不能使用RequestDispatcher –

+0

其實我想調用Enqueue sevlet而不使用html代碼,如https://cloud.google.com/appengine/docs/java/taskqueue/overview-push那麼我怎樣才能從用戶調用Enqueue servlet請求 –

+0

RequestDispatcher將在一個servlet中運行,並且應該在GWT中正常工作。它不在客戶端代碼中運行。要從客戶端代碼調用,只需使用RPC調用,然後在處理ServiceImpl類中的調用的方法中調度任務。否則,你可以從GWT客戶端代碼中調用一個servlet,但是如果你已經使用了RPC調用,那就更容易了。 – user1258245

0

Servlets只能在客戶端和服務器之間進行通信。您的服務器應該盡其所能來整理您的信息,然後將其傳遞到應用程序的業務層。

所以,真的,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); 
+0

感謝您的託姆爲您的寶貴意見。其實我想在我的應用程序中實現任務隊列,所以要創建任務隊列首先我們創建一個servlet及其實現代碼,我們在另一個servlet中寫入所以我怎麼能實現這一點以及如何調用第一個servlet使用RPC調用或其他任何 –

+0

您將任務隊列移出您的servlet。一個對象做一件事。 servlet必須與JEE服務器通信並啓動任務。管理任務隊列超出了單個對象的範圍。這就是爲什麼它需要轉移到外面。 您遇到的問題指向了設計缺陷。你不想通過調用servlet到servlet來解決它。 – Thom

+0

感謝Thom,但是如果我從Servlet移動任務隊列,那麼如何創建它以及如何執行它以及用戶如何啓動它,請您簡單介紹一下。並且如果可能的話還舉例 –

相關問題