从会话请求后,Hashmap值已更改

时间:2012-05-08 20:04:59

标签: session java-ee hashmap

我从事Java / HTML项目。我已将hashmap设置为会话属性。我从会话请求hashmap并将key / value放入其中 map.put("some string", "1") 。当第二次执行此操作时,我打印了hashmap内容,并且唯一的值(在hashmap上的最后一个操作之后为'1')变为'-1'。

在我看来,Hashmap是这个项目的最佳数据结构。有人可以帮忙吗?

public class Cart {
    private HashMap<String, asd> list;

    public Cart(){
        list = new HashMap<String, asd>();
    }

    public HashMap<String, asd> getMap(){
        return list;
    }

    /*
     * Parameter: code
     *      -1: increase quantity by 1
     *      0: delete product from the product list
     *      else: set the product quantity to the passed value
     */
    public void alterProduct(int code, String product){
        if(list.containsKey(product)) {
            if(code == -1) plusOne(product);
            if(code == 0) remove(product);
            else setValue(product, code);
        }else {
            asd asd = new asd();
            asd.a = 1;
            list.put(product, asd);
        }
    }

    private void plusOne(String product){
        asd asd = list.get(product);
        asd.a = asd.a + 1;
        list.put(product, asd);
    }

    private void remove(String product){
        list.remove(product);
    }

    private void setValue(String product, int code){
        asd asd = new asd();
        asd.a = code;
        list.put(product, asd);
    }
}

class asd{
    int a;

    public String toString(){
        return ""+a;
    }
}

我将Cart对象设置为会话属性的JSP代码:

<%
    Cart myCart = new Cart();
    session.setAttribute("cart",myCart);
%>

Servlet代码:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        Cart cart = (Cart) request.getSession().getAttribute("cart");
        cart.alterProduct(-1, (String) request.getSession().getAttribute("name"));
        doGet(request, response);
    }

我第二次为同一个alterProduct调用(String) request.getSession().getAttribute("name")后,同一个键的hashmap值为'-1'。

1 个答案:

答案 0 :(得分:1)

什么是产品的类型/价值?它是如何连接到“购物车”的?

我猜你搞乱了数据类型会发生什么。另一种选择是你在Cart.toString()方法中有错误。我建议你用“普通”数据类型更改代码并重新检查它。如果失败,请使用Cart类而不进行混乱转换并调试代码。

你有错误:

  public void alterProduct(int code, String product){
    if(list.containsKey(product)) {
      if(code == -1) plusOne(product);
      if(code == 0) remove(product);
      else setValue(product, code);
  }


  private void setValue(String product, int code){
    asd asd = new asd();
    asd.a = code;
    list.put(product, asd);
  }

考虑第二次致电art.alterProduct(-1, "something")时会发生什么。 list.containsKey(product)为真(您使用相同的产品“),代码为-1。所以

if(code == -1) plusOne(product);按预期执行。

但是你有一些需要的东西

if(code == 0) remove(product); else setValue(product, code);

code ==0被评估为false,因此 else指令被称为。您正在呼叫setValue(product, -1)

如上所示,setValue会将-1分配给您观察到的asd.a.