2010-06-14 53 views
7

我有兩個Web應用程序說App1和App2。我想從App1中的servlet調用App2中的servlet。我正在使用URLConnection。我能夠將參數傳遞給App2中的servlet,並且我還能夠以字符串的形式接收來自servlet的響應。但我想從App2中的servlet發送java對象,並在App1的servlet中接收它們。如何實現這一目標?遠程servlets之間的通信

回答

10

取決於。


如果這些web應用運行在物理上處於同一servletcontainer相同的Web服務器,然後設置好它作爲一個請求屬性,將請求轉發到其他方面:

request.setAttribute("name", object); 
ServletContext app2 = getServletContext().getContext("app2"); 
app2.getRequestDispacher("servletUrl").forward(request, response); 

其他方面將是能夠獲得如下對象:

Object object = request.getAttribute("name"); 

這隻需要一個服務器設置,上下文可以互相訪問。如何做到這一點取決於servletcontainer。例如,在Tomcat中,您只需將webapp的<Context>元素的crossContext屬性設置爲true

<Context crossContext="true"> 

然後它將可用於其他上下文。對於其他服務器,請查閱其文檔。


如果這些web應用運行在物理上不同的Web服務器,那麼有幾種選擇:

  1. 轉換爲字符串併發送作爲參數。在檢索時,從字符串轉換回來。 JSON是一個很好的格式。 Google Gson提供了在完整的Java對象和JSON之間進行轉換的可能性,反之亦然。如果您使用GET並且請求URI變得相當長(超過2KB),那麼請考慮使用POST而不是GET,否則URI可能會被服務器截斷。優點:更好的可重用服務。缺點:很難發送二進制數據。

    另請參閱:Converting JSON to Java

  2. 使用URLConnectionApache HttpComponents Client按照RFC2388multipart/form-data HTTP POST請求,並處理它使用Apache Commons FileUpload另一側。優點:標準規格,可以發送二進制數據。缺點:更多的代碼。

    另請參閱:How to use URLConnection

  3. Serialize的Java對象,使用ObjectOutputStream寫原材料到URLConnection#getOutputStream(),並檢索它從HttpServletRequest#getInputStream()原料,並使用ObjectInputStream反序列化它。優點:容易。缺點:不可重複使用,緊密耦合。

    另請參閱:Object StreamsLesson: Serialization

1

使用Serialization

,而不是發送HTML,你會發送對象流。

請注意,爲了增加額外的安全性,您不希望某些外部來源將中毒對象注入到您的呼叫中。