做购物车遇到的el表达式问题
Posted it蛰伏者
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了做购物车遇到的el表达式问题相关的知识,希望对你有一定的参考价值。
在做购物车时,控制台报出了这样的问题:
java.lang.RuntimeException: 方法内部错误org.apache.jasper.JasperException: An exception occurred processing JSP page /item/jsps/cart/list.jsp at line 74
71: <th>小计</th>
72: <th>操作</th>
73: </tr>
74: <c:forEach items="${sessionScope.cart.cartItems}" var="cartitem">
75: <tr>
76: <td><div><img src="<c:url value=‘/item/${cartitem.book.image}‘/>"/></div></td>
77: <td>${cartitem.book.bname}</td>
购物车JSP部分的代码如下:
- <c:forEach items="${sessionScope.cart.cartItems}" var="cartitem">
- <tr>
- <td><div><img src="<c:url value=‘/item/${cartitem.book.image}‘/>"/></div></td>
- <td>${cartitem.book.bname}</td>
- <td>${cartitem.book.author}</td>
- <td>${cartitem.book.price}元</td>
- <td>${cartitem.count}</td>
- <td>79.8元</td>
- <td><a href="javascript:alert(‘删除购物项成功!‘);">删除</a></td>
- </tr>
- </c:forEach>
购物车类cart的bean代码为:
public class Cart {
Map<String,CartItem> cart = new LinkedHashMap<String,CartItem>();
//添加购物车
public void add(CartItem item){
//获取book
Book book = item.getBook();
int num = item.getCount();
//更新条目
if(cart.containsKey(book.getBid())){
//获取旧条目
CartItem oldItem = cart.get(book.getBid());
oldItem.setCount(oldItem.getCount()+num);
cart.put(book.getBid(), oldItem);
}else{
cart.put(book.getBid(), item);
}
}
public Collection<CartItem> getCartItems() {
return cart.values();
}
}
仔细查找后发现,原来是由于没有写getCartItems()方法,导致el表达式在读取Javabean的时候没有办法获取到数据。并且还要注意的是属性名应该是方法名去掉get以后的首字母小写即${sessionScope.cart.cartItems}与getCartItems()方法红色部分首字母小写后相同,添加该方法后正常。
-------------------------------------------------------------------------------------------------------------------------------
这里还有一个小注意,需要理解
在cartServlet中需要增删购物车中的条目时,需要首先从session中获取购物车对象,而不是new cart()对象,否则操作的并不是同一个对象
例如:cartbean为
- public class Cart {
- Map<String,CartItem> cart = new LinkedHashMap<String,CartItem>();
- //添加购物车
- public void add(CartItem item){
- //获取book
- Book book = item.getBook();
- int num = item.getCount();
- //更新条目
- if(cart.containsKey(book.getBid())){
- //获取旧条目
- CartItem oldItem = cart.get(book.getBid());
- oldItem.setCount(oldItem.getCount()+num);
- cart.put(book.getBid(), oldItem);
- }else{
- cart.put(book.getBid(), item);
- }
- }
- public Collection<CartItem> getCartItems() {
- return cart.values();
- }
- //总计
- public double getTotal(){
- double d = 0.0;
- Set<String> set = cart.keySet();
- for(String s:set){
- d+=cart.get(s).getTotal();
- }
- BigDecimal bd = new BigDecimal(d);
- return bd.doubleValue();
- }
- //删除表单项
- public void delete(String bid){
- cart.remove(bid);
- }
- //清空购物车
- public void clear(){
- cart.clear();
- }
- //获取表单项的个数
- public int getItemNum(){
- return cart.size();
- }
- }
- cartservlet的delete方法应该为:
-
//删除购物车
public String delete(HttpServletRequest request, HttpServletResponse response){
//获取表单项Id
String bid = request.getParameter("bid");
//获取存储在session中的cart,并操作其属性
//注意区分这里不是new Cart().delete(bid);这样的话相当于
//又创建了一个cart对象,而不是操作session里的cart对象
//这里自始至终都在操作session里的cart对象
Cart cart = (Cart)request.getSession().getAttribute("cart");
cart.delete(bid);
return "f:/item/jsps/cart/list.jsp";
}
以上是关于做购物车遇到的el表达式问题的主要内容,如果未能解决你的问题,请参考以下文章