2

我想知道它是否符合java servlet規範2.5以在請求之間引用/保存返回值request.getParameterMap()在請求週期之後引用請求參數映射是否便攜?

最終規範僅在203頁指出:

返回:一個不可變java.util.Map含有參數名稱作爲關鍵字 和參數值作爲映射值。參數圖中的鍵是 類型的字符串。參數映射中的值是String數組類型。

但它不是我清楚:

  • 如果地圖僅僅是不可變的應用程序,而不是應用程序服務器

  • ,如果它允許應用程序服務器可能會重新 - 使用另一個請求的實例(例如,如果參數及其值與前一個請求中的值相同)

編輯: 這樣做的原因: 我想保存每個請求的請求映射,並在出現錯誤的情況下打印出來用於診斷目的。

+0

這是一個設計的氣味。請詳細說明功能要求:)有可能比這更好的解決方案。 – BalusC 2010-07-28 16:00:53

+0

@BalusC:我想保存每個請求的請求地圖,和在發生錯誤的情況下,我想打印出用於診斷目的的每個參數映射(以及其他內容)。 – MRalwasser 2010-07-28 22:25:33

回答

2

如果地圖僅僅是不可變的應用程序,而不是應用程序服務器

它在API中是不可變的,是的。這也是有道理的,改變請求參數圖有什麼意義?反過來,servletcontainer實現當然可以擁有「幕後」的可變映射。但是你不應該擔心實現的具體細節。

,如果它允許應用程序服務器可能會重新使用實例的另一個請求(例如,如果參數和它們的值是一樣的,在以前的請求)

沒有,服務器不這樣做。它只是創建一個新的。參數綁定到特定的請求。

如果你想在會話期間收集每個請求的參數,那麼你需要自己做這個。最好的地方是Filter

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException { 
    HttpServletRequest hsr = (HttpServletRequest) request; 
    List<Map<String, String[]>> allParameters = (List<Map<String, String[]>>) hsr.getSession().getAttribute("allParameters"); 
    if (allParameters == null) { 
     allParameters = new ArrayList<Map<String,String[]>>(); 
     hsr.getSession().setAttribute("allParameters", allParameters); 
    } 
    allParameters.add(hsr.getParameterMap()); 
    chain.doFilter(request, response); 
} 
0

我想你可以安全地保存下一個請求。我一直這樣做。

不確定其他實現。它爲Tomcat中的每個請求創建一個新的HashMap,

parameters = new HashMap(); 
    parameters = copyMap(getRequest().getParameterMap()); 
    mergeParameters(); 
    parsedParams = true; 
+0

你的代碼的前兩行很奇怪。首先你初始化一個變量,然後你立即重新分配一些東西?這不可能是你的意思... – 2010-07-28 13:47:33

+0

代碼來自Tomcat。如果在copyMap()中使用了參數,但它沒有使用它可能會很有用。 – 2010-07-28 14:30:16

1

對於所有意圖和目的,您不能修改地圖的內容。但是,如果您想保留以供將來參考,則始終可以創建自己的新映射,複製所有鍵/值對,並將其保留在Session f.e.中。 (這將導致funkiness如果用戶有2個窗口同時開放,但這個故事是另一個時間...)

+0

這就是我現在要做的安全。但是,當然,效率比直接使用實例要低。這就是我爲什麼問這個問題的意圖。 – MRalwasser 2010-08-01 10:54:49