程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程解疑 >> session-關於List放對象的問題

session-關於List放對象的問題

編輯:編程解疑
關於List放對象的問題

大俠們,我把一個類設置好屬性並放到了List中,並且放進了session,但是在JSP取出時,長度是對的,卻都是最後一個對象,請問這是為什麼??求解。謝謝~後台輸出也是顯示全部都是最後一個結果

 public class MenuIndexHotServlet extends HttpServlet  {
    private Menu menu = new Menu();

    public void service(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        DBConnect db=new DBConnect();
        Connection con=db.getCon();
        HttpSession session = request.getSession();
        Statement stat = null;
        ResultSet rs = null;
        String sql = "select top 10 m_name,m_price,m_pic from menus order by m_sale desc";
        List<Menu> list = new ArrayList();
        try {
            stat = con.createStatement();
            rs=stat.executeQuery(sql);
            while(rs.next()){
                System.out.println(rs.getString("m_pic"));
                System.out.println(rs.getString("m_name"));
                System.out.println(rs.getString("m_price"));
                menu.setName(rs.getString("m_name"));
                menu.setPrice(Float.parseFloat(rs.getString("m_price")));
                menu.setPic(rs.getString("m_pic"));
                list.add(menu);
            }
            con.close();
            session.setAttribute("menuindex",list);
            list = (List)session.getAttribute("menuindex");
            int i;
            for(i=0;i<list.size();i++){
               menu = (Menu)list.get(i);
               System.out.println(menu.getPic());
               System.out.println(menu.getName());
               System.out.println(menu.getPrice());
            }
            //request.getRequestDispatcher("../index_menu.jsp").forward(request,response);
            response.sendRedirect("../index_menu.jsp");
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

後台輸出的結果:

120                           
炸饅頭                                            
30.0
110                           
香芋卷                                            
20.0
120                           
土豆切片                                          
30.0
110                           
青椒肉絲                                          
20.0
120                           
黑椒雞排                                          
30.0
110                           
秘制雞排                                          
20.0
---------分隔符(下面是放進session後,取出的結果)----------
110                           
秘制雞排                                          
20.0
110                           
秘制雞排                                          
20.0
110                           
秘制雞排                                          
20.0
110                           
秘制雞排                                          
20.0
110                           
秘制雞排                                          
20.0
110                           
秘制雞排                                          
20.0

最佳回答:


 menu.setName(rs.getString("m_name"));
 menu.setPrice(Float.parseFloat(rs.getString("m_price")));
 menu.setPic(rs.getString("m_pic"));
 list.add(menu);

上邊這一段寫的有問題,你沒有新new menu對象,而是把值直接覆蓋到同一個對象裡,然後裝天道list中。因為list add的都是同一個對象的引用,所以都是同樣的值了
實際上的過程是,add第一次是炸雞排,循環遍歷查詢結果,第二次是香芋卷,因為第一次add的也是這個對象的引用,而當前這次將menu覆蓋成了香芋卷,所以自然全是香芋卷了。下邊是源碼。

圖片說明
注意看elementData,用的是=號,也就是當前被add的這個內存中的值,是指向實參的對象地址,所以你不new新的menu,你list裡add的都是同一個menu對象的地址,即都是同一個對象(而該對象被你一次又一次的覆蓋成新的值)。
這樣解釋可以理解嗎?

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved