2012-12-01 64 views
4

這是我在大學的java webapps類。 用戶可以將成員添加屬性作爲一對(名稱和值)添加到會話中。所以我使用HashMap。 用戶可以在同一個會話中多次添加這樣的對。因此,我希望將整個散列表存儲在會話中,並且每次按下提交按鈕時都應將該對添加到映射中。但是,通過此代碼,只顯示最後添加的對。我不知道爲什麼會發生這種情況在java webapp中存儲HashMap會話

Map<String, String> lijst; 

protected void processRequest(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 
    HttpSession session = request.getSession(); 
    if (session.isNew()) { 
     lijst = new HashMap<String, String>(); 
     session.setAttribute("lijst", lijst); 
    } else { 
     lijst = (HashMap<String, String>) session.getAttribute("lijst"); 
    } 

    String naam = request.getParameter("naam"); 
    String waarde = request.getParameter("waarde"); 


    lijst.put(naam, waarde); 
    printResultaat(request, response); 

} 

private void printResultaat(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    response.setContentType("text/html;charset=UTF-8"); 
    PrintWriter out = response.getWriter(); 
    try { 
     out.println("<html>"); 
     out.println("<head>"); 
     out.println("<title>Sessie demo</title>"); 
     out.println("</head>"); 
     out.println("<body>"); 
     out.println("<h1>Sessie demo</h1>"); 
     out.println("<a href=\"voegtoe.html\">Toevoegen</a>"); 
     HttpSession session = request.getSession(); 
     out.println("<h3>Sessie gegevens</h3>"); 
     out.println("<p>Sessie aangemaakt op: " + new Date(session.getCreationTime()) + "</p>"); 
     out.println("<p>Sessie timeout: " + ((session.getMaxInactiveInterval())/60) + "</p>"); 
     HashMap<String, String> lijstAttr = (HashMap<String, String>) session.getAttribute("lijst"); 
     Iterator it = lijstAttr.entrySet().iterator(); 
     out.println("<h3>Sessie attributen (naam - waarde)</h3>"); 
     while (it.hasNext()) { 
      Map.Entry pairs = (Map.Entry) it.next(); 
      out.println(pairs.getKey() + " " + pairs.getValue()); 
      it.remove(); 
     } 
     out.println("</body>"); 
     out.println("</html>"); 
    } finally { 
     out.close(); 
    } 
} 
+0

試圖通過使用調試器單步執行代碼,看看發生了什麼,你不要指望。 –

+0

當然,我當然是在調試過程中,並且首先自己尋找解決方案。 HashMap的大小始終爲1,因此它不保留以前的條目。現在已經修復了。 – Charlie

回答

4

看起來你顯然每次打印時都清理掉hashmap。

while (it.hasNext()) { 
     Map.Entry pairs = (Map.Entry) it.next(); 
     out.println(pairs.getKey() + " " + pairs.getValue()); 
     it.remove(); // <----------- 
    } 

只需卸下符合it.remove()

+0

謝謝!它現在有效。我從其他地方複製了迭代器部分並忘記了它.remove() – Charlie