做购物车遇到的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表达式问题的主要内容,如果未能解决你的问题,请参考以下文章

JSP标签语法JSTL标签库EL表达式辨析

EL表达式的基本知识

8 ELJSTLMVC购物车验证码

EL表达式

EL表达式无法显示Model中的数据

jsp中的EL表达式