I work on Java/HTML project. I’ve set a hashmap as a session attribute. I request the hashmap from session and put key/value in it
map.put("some string", "1")
. When this action is performed the second time, I print the hashmap content and the only value, that was ‘1’ after the last operation on the hashmap, becomes ‘-1’.
Hashmap is the best data structure, in my opinion, for this project. Can anyone help?
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;
}
}
JSP code where I set Cart object as session attribute:
<%
Cart myCart = new Cart();
session.setAttribute("cart",myCart);
%>
Servlet code:
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);
}
After I call alterProduct the second time for the same (String) request.getSession().getAttribute("name") the hashmap value for the same key is ‘-1’.
What is type/value of product? How it is connected to the “cart”?
I guess what’s happen that you mess up data types. Another option is you have bug in the
Cart.toString()method. I suggest you change the code with “plain” data type and recheck it. If it fails, use your Cart class without messy conversion and debug the code.You have bug here:
Consider what happen when you call
art.alterProduct(-1, "something")second time.list.containsKey(product)is true (you use the same product”), code is -1. Soif(code == -1) plusOne(product);is executed as expected.But then you have something weired
if(code == 0) remove(product);else setValue(product, code);
code ==0is evaluated to false, so else instruction is called. You are callingsetValue(product, -1)As you can see above setValue will assign -1 to the asd.a that is observed by you.