大俠們,我把一個類設置好屬性並放到了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對象的地址,即都是同一個對象(而該對象被你一次又一次的覆蓋成新的值)。
這樣解釋可以理解嗎?