2012-07-25 38 views
4

我想發送HashMap對象到請求它的小程序。一個servlet有那個HashMap對象。有什麼辦法可以做到這一點?將數據從servlet發送到小程序:我如何實現這一點?

Applet ------requests HashMap object---->Servlet listens to this request 
               | 
               | 
            Servlet searches that HashMap Object 
               | 
               | 
               \/
<--Finally Send this to applet------------ Servlet gets the HashMap object                 

我已經到Servlet的連接,我的servlet也有的HashMap對象,但我不知道如何將它發送到小程序,我不知道它是否可以發送!

+0

HashMap是否包含一些特定的對象,或者像HashMap ? – user592704 2012-08-13 22:25:40

回答

1

我打算利用一些外部庫來回答你的問題:Google GsonApache IO Utils

所以,你已經擁有了HashMap的在servlet並希望將其發送到小程序:

Map<String, String> myMap = new HashMap<String, String>();// or whatever 
Gson gson = new GsonBuilder().create(); 
String jsonString = gson.toJson(myMap); 
IOUtils.write(jsonString, resp.getOutputStream());// where 'resp' is your HttpServletResponse 
IOUtils.closeQuietly(resp.getOutputStream()); 

並接受它在你的小程序:

String jsonString = IOUtils.toString(conn.getInputStream()); // where 'conn' is an HttpURLConnection 
IOUtils.closeQuietly(connection.getInputStream()); 
Gson gson = new GsonBuilder().create(); 
// The TypeToken is needed when Generics are involved 
Type typeOfHashMap = new TypeToken<Map<String, String>>() {}.getType(); 
Map<String, String> myMap = gson.fromJson(jsonString, typeOfHashMap); 

就是這樣。這只是一個簡單的例子,但我希望你能從中得到一些東西。

當然,您可以手動完成而不是使用外部庫,但這種方法要容易得多。

+0

我還沒有理解如何實現這個代碼。也解釋了什麼是'resp.getOutputStream()'。它返回什麼? 'connection.getInputStream()'是一樣的。我現在所做的是[this](http://i48.tinypic.com/2chx6v7.jpg)。紅色標記是對applet函數的調用,我在其中放入了第二個片段。 – 2012-08-15 04:38:17

+0

由於你的Applet已經調用了Servlet,你有一個輸入和輸出流可用於在兩者之間進行通信。 你需要做的是使用上述流發送和接收數據。請記住:您通過Applet中的**輸入**流接收到您寫入Servlet中**輸出**流的內容。 我不認爲你需要(或可以)從Servlet中調用Applet。在連接到servlet之後,您必須在我的答案的第二部分包含在您的Applet代碼中;並在你的servlet中刪除'new PollForm()。func()'。 – arturo 2012-08-15 17:06:10

+0

感謝您的解釋。有效。 – 2012-08-20 10:34:13

3

如何序列化併發送它作爲響應?考慮將其轉換爲JSON或XML。

+1

絕對不推薦使用Java序列化。它將您的服務緊密結合到一個平臺上,並打破了可移植性。而是使用通用的傳輸格式,以便它可以輕鬆地重用於其他目的。 – BalusC 2012-07-25 11:28:34

+0

我認爲json或xml是某種帶有元數據的序列化數據。 – mrd081 2012-07-25 17:26:48

+0

是的,但你明確提到它作爲替代(「或」)將其轉換爲JSON/XML。 – BalusC 2012-07-25 17:29:54

0

您可以簡單地序列化對象並將其直接寫入HttpServletResponse,寫入字節流。

在Applet端,您必須使用流讀取字節流和反序列化。 請注意,Applet發送POST請求,否則,如果使用GET請求,則可能有1024byte限制。

希望這對你有所幫助。

2

如果servlet與Applet的下載位置相同,您可以打開與servlet的URL連接。 的您可以閱讀

URL site = new URL("your site") 
URLConnection urlCon = site.openConnection(); 
BufferedReader in = new BufferedReader(new InputStreamReader(
           urlCon.getInputStream())); 
    String inputLine; 
    while ((inputLine = in.readLine()) != null) 
     System.out.println(inputLine); 
    in.close(); 

同時在servlet你寫你的數據備份使用HttpServletResponse的客戶端。

如果您需要更「精緻」的東西,您可以在您的小程序中使用axis作爲webservice堆棧,或者包含像Jersey這樣的輕量級REST庫。但是這些解決方案迫使您使用其他服務器組件而不是Servlet。

這篇文章將幫助您:

它們都使用json-lib來解析/序列化來自JSON格式的對象。

希望得到這個幫助。

+0

我必須將數據從servlet發送到applet。不是從applet到servlet – 2012-08-14 17:46:13

+0

@Suhail,URLConnection是雙向的。 – martijno 2012-08-14 20:31:50

相關問題