2012-11-29 205 views
1

我有一個關於使用Java Servlets中可用的ServletInputStreamServletOutputStream的問題。首先,我將給出一些非常需要的上下文:輸入/輸出流Java Servlets

我正在處理的任務在Google應用引擎中實現任務隊列。我已經能夠將任務添加到應用引擎以及要調用的適當工作人員。但是,我正在努力想辦法將可序列化對象的ArrayList<>傳遞給工作人員的doPost()方法。普遍使用的方法顯然是分別使用HTTP請求和響應對象的輸入和輸出流來處理servlet之間的通信。我已經廣泛搜索,但一直未能找到一個清晰的例子,說明如何準備這樣一個用於傳輸的arraylist作爲輸出流,將它添加到第一個servlet的響應中,然後從第二個servlet中的請求中獲取它並最後將其轉換回用於doPost()方法的代碼中的陣列列表。所以這基本上是我的問題。由於我對Java的經驗不足,所以我很難自己把它全部弄清楚,而且大部分時間都在努力將自己的頭圍繞在它周圍。

爲了澄清多一點,我會後工人的問題doPost()方法:

protected void doPost(HttpServletRequest req, HttpServletResponse resp) 
     throws ServletException, IOException 
{ 
    try 
    { 
     ArrayList<Quote> qs = /*Here the list needs to be read in.*/ null; 

     EntityManager manager = EMF.get().createEntityManager(); 
     CarRentalModel.get().confirmQuotes(qs, manager); 
    } 
    catch (ReservationException e) 
    { 
    }  
} 

任何幫助將不勝感激。

謝謝你在前進,

凱文

+4

對於HTTP,您似乎比servlet更新穎。客戶端到底是什麼?聽起來好像它不僅僅是一個HTML頁面,而且你正在嘗試開發一個Web服務。你有沒有考慮過更多可重用的XML或JSON作爲輸入格式?藉助Java序列化,您僅限於基於Java的客戶端。 – BalusC

+0

看起來很棒,我的確對HTTP很新,而且它確實是一個非常簡單的Web服務。然而,我必須堅持既定的方法,我只能根據作業的參數來實現它。不過,我會純粹出於教育理由考慮你的建議。 –

回答

3

值得遵循BalusC的建議。如果你正在尋找一個簡單而快速的解決方案,你可以用Java的序列化來完成:

在你的doPost()方法中,你可以創建一個ObjectInputStream,它從底層servlet輸入流中讀取數據並反序列化的)數據。

ServletInputStream sis = req.getInputStream(); 
ObjectInputStream ois = new ObjectInputStream(sis); 

ArrayList<Quote> qs = (ArrayList<Quote>) ois.readObject(); 

您將對象寫入另一端,類似於ObjectOutputStream及其writeObject()方法。如果這不起作用,請在完成寫操作後嘗試對.flush()或.close()進行輸出流,以觸發發送任何剩餘的緩衝數據。

+0

啊,是的,這比谷歌正在噴出的東西更有意義。非常感謝你的幫助。 –