2013-02-01 32 views
0

對不起,用這個破了你的一天,但我已經花了很多年在網上尋找答案,我完全被卡住了!如何將servlet的響應轉換爲字符串?

在一個web應用程序中,我使用RequestDispatcher從servlet_A向servlet_B發送請求。 在servlet_B中,我運行了一些代碼,它生成一個簡單的String值,該值作爲對servlet_A的響應返回。

代碼中的servlet答:

ServletContext context = getServletContext(); 
RequestDispatcher dispatcher = context.getRequestDispatcher("/servlet_B"); 
dispatcher.forward(request, response); 

/* 
How do I catch the response from servlet_B and convert it to a String? 
*/ 

代碼中的servlet B:

/* 
Some other code which creates a String 
*/ 

String result = "someValue"; 

// Send the response to servlet_A. 
response.setContentType("text/plain"); 
response.setContentLength(result.length()); 
PrintWriter out = response.getWriter(); 
out.println(result); 

在servlet_A,我需要從servlet_B的響應轉換成一個簡單字符串值,並且這是位我被困住了。如何將servlet_B的響應作爲servlet_A中的簡單字符串進行處理?

我想我需要使用PrintWriter來解析響應,並且我已經在Web上搜索了一個這樣的例子,但是我可以找到的所有例子都顯示瞭如何使用PrintWriter發送響應或輸出數據到屏幕上。

如果有人能幫助我,我將非常感激。

在servlet的BI
+1

真的有必要有一個Servlet B?難道你不能使用一個簡單的類來接收HttpServletRequest和HttpServletRequest作爲參數,做這個工作然後返回Servlet A嗎? –

+0

嗨Diogo,並感謝您的貢獻。恐怕是這樣。當servlet_B收到來自servlet_A的請求時,請求被重定向到用於用戶輸入的jsp,所以我堅持使用servlet。 –

+0

我的意思是:根據我的理解,你的servlet B存在只是因爲你必須對請求和響應對象做一些處理然後返回到servlet A,對吧?如果是這樣,您可以將servlet B更改爲可以爲您完成這項工作的類,並且只在您需要時纔會實例化它。 –

回答

0

認爲你可以再次使用調度要回servlet一個

ServletContext context = getServletContext(); 
RequestDispatcher dispatcher = context.getRequestDispatcher(「/servlet_A」); 
request.setAttribute("result",result);//the String you want to pass 
dispatcher.forward(request, response); 
+0

有趣!我沒有想到...這種方法可能會有一些問題 - 在最終實現中,servlet_B將作爲單獨的WAR文件的一部分導入到Web應用程序中,並且不知道servlet_A的地址,這會使得請求轉發有點問題。有趣的想法,但是這種方法可能會導致更多的問題,我認爲我仍然堅持必須以正常的方式處理來自servlet_B的響應。但是,嘿,感謝您的興趣... –

+0

你是如何訪問servlet,我的意思是什麼步驟的servlet調用??? –

0

我想你需要的是從以前的servlet攜帶一個字符串到下一個, 那麼所有你要做的是在你的請求對象中添加一個屬性。 所以WHN你將請求傳遞給下一個的servlet請求對象中攜帶設定在第一Servlet的一個屬性

因此該值作爲控制傳遞到下一個的servlet 可以寫

String sendThisValue = "some Important value to be sent"; 
request.setAttribute("sendThisValue",sendThisValue); 
RequestDispatcher dispatcher = context.getRequestDispatcher(「/servlet_B」); 
dispatcher.forward(request, response); 

然後你可以通過請求對象訪問你在前一個servlet中設置的值

String gotTheValue = request.getAttribute("sendThisValue"); 
+0

嗨Hussain。如果我正確理解你,你建議我如何添加數據在servlet_A發送到servlet_B之前發送請求,感謝您的幫助,但恐怕不是問題。問題是如何處理servlet_A中的響應let_B。 –

1

從技術上講,你會錯誤地解決問題。你轉發的另一個servlet顯然是緊密耦合的,它的代碼需要被重構爲一個獨立的類,它將立即返回所需的數據作爲字符串,以便另一個servlet可以將它寫入響應,並且當前的servlet可以直接使用獨立類,而不是首先調用其他的servlet。

忽略臭臭的設計,你可以通過用一個HttpServletResponseWrapper實現代替當前響應來解決它,該實現寫入內部字符串緩衝區而不是實際的響應主體。這裏是一個適合你的特殊功能要求(注意應該是實際的執行可能比這複雜得多,你需要採取getOutputStream()getCharacterEncoding()考慮爲好)的具體開球例如:

final StringWriter buffer = new StringWriter(); 
request.getRequestDispatcher("/servlet_B").include(request, new HttpServletResponseWrapper(response) { 
    private PrintWriter writer = new PrintWriter(buffer); 
    @Override 
    public PrintWriter getWriter() throws IOException { 
     return writer; 
    } 
}); 

String writtenByServletB = buffer.toString(); 
// ...