2011-10-15 155 views
6

我需要從另一個servlet調用servlet POST方法,並在Servlet參數中傳遞blob。這是否可行,如果可以的話,該怎麼辦。 PS:我不能使用Apache HttpClient從另一個Servlet調用Servlet

+0

那麼Apache HttpClient是開源的...複製和粘貼? –

+0

我無法使用,因爲我使用Google App Engine,它對可以使用的某些類施加限制 – fernandohur

回答

8

你需要自己創建和發送HTTP請求。您不能使用forward/redirect/include,因爲您想要將方法從GET更改爲POST,並且您希望發送multipart/form-data請求。由於HttpClient(和其他第三方庫?)顯然不是一種選擇,所以最好的選擇是使用標準的Java SE API提供的java.net.URLConnection。長話短說:Using java.net.URLConnection to fire and handle HTTP requests在底部你可以找到一個multipart/form-data的例子。

請注意,這個問題並不是特定於servlet的。換句話說,您必須能夠在普通的vanilla Java應用程序中使用main()方法執行此代碼。這樣可以更輕鬆地進行測試和微調。一旦你得到它的工作,只需讓servlet執行相同的一段代碼即可。


無關的問題,我的印象中,有一個重要的設計失敗的地方,當然,如果兩者的servlet在同一個web應用上下文中運行。您想要發送POST請求的另一個servlet顯然過於緊密,應該重構。

1

你的意思是從你的應用程序調用另一個Web服務?如果是這樣,那麼像HttpClient就是你想要的東西。如果你的意思是你想以編程方式在你的應用程序中調用另一個servlet,那麼你正在尋找forward to itinclude it

+0

我正在尋找在我的應用程序內調用另一個servlet,但它必須是víaPOST方法。我通常會做的是response.redirect(...),但是調用GET方法...我怎樣才能調用POST? – fernandohur

+0

我所說的:轉發或包括,取決於你想要做什麼。請參閱JEE教程中的[「調用其他Web資源」](http://download.oracle.com/javaee/6/tutorial/doc/bnagi.html)以獲取更多詳細信息。 –

7

您可以在您的應用程序中將調度程序發送到另一個servlet,並將其轉發或包含它,如@Ryan所示。在你的第一個servlet中,代碼應該是這樣的:

ServletContext context = this.getServletContext(); 
RequestDispatcher dispatcher = context.getRequestDispatcher("/otherurltoservlet"); 

// change your request and response accordingly 

dispatcher.forward(request, response); 
+0

我需要的是在我的應用程序的另一個servlet上調用POST方法。那會叫「otherurltoservlet」的POST方法嗎? – fernandohur

+0

我相信,如果第一個servlet是通過post調用的,第二個servlet會在調度器的前向鏈中通過post調用。 – rmarimon

+0

看看這裏有關GET的問題http://stackoverflow.com/questions/4374548/does-jspforward-or-requestdispatcher-forward-use-get-or-post – rmarimon