做购物车遇到的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";
    }
时间: 2024-08-05 09:36:53

做购物车遇到的el表达式问题的相关文章

javaWEB与EL表达式

EL表达式 1. EL是JSP内置的表达式语言!  * jsp2.0开始,不让再使用java脚本,而是使用el表达式和动态标签来替代java脚本!  * EL替代的是<%= ... %>,也就是说,EL只能做输出! 2. EL表达式来读取四大域  * ${xxx},全域查找名为xxx的属性,如果不存在,输出空字符串,而不是null.  * ${pageScope.xxx}.${requestScope.xxx}.${sessionScope.xxx}.${applicationScope.xx

JSP中使用EL表达式

EL表达式 :EL 全名为Expression Language,就是为了替代<%= %>脚本表达式. EL主要作用: 获取数据: EL表达式主要用于替换JSP页面中的脚本表达式,以从各种类型的web域中检索java对象.获取数据.(某个web域 中的对象,访问javabean的属性.访问list集合.访问map集合.访问数组) 执行运算: 利用EL表达式可以在JSP页面中执行一些基本的关系运算.逻辑运算和算术运算,以在JSP页面中完成一些简单的逻辑运算.${user==null} 获取web

JSP三大指令,九大内置对象,JSP动作标签,EL表达式与函数库

JSP三大指令 ---------------------------------------------- 一个jsp页面中,可以有0~N个指令的定义! 1. page --> 最复杂:格式:<%@page language="java" info="xxx"...%> * pageEncoding和contentType: > pageEncoding:它指定当前jsp页面的编码,只要不说谎,就不会有乱码!在服务器要把jsp编译成.jav

JSP学习 三大指令、九个内置对象、JavaBean、EL表达式

1.page-->最复杂:<%@page language="java" info="xxx"...%> * pageEncoding和contentType: >pageEncoding:它指定当前jsp页面的编码,在服务器要把jsp编译成.java时需要使用pageEncoding. >contentType:它标识添加一个响应头 Content-Type 等同于response.setContentType("text/

jsp JavaBean el表达式

JSP三大指令 一个jsp页面中,可以有0~N个指令的定义! 1. page --> 最复杂:<%@page language="java" info="xxx"...%> * pageEncoding和contentType: > pageEncoding:它指定当前jsp页面的编码,只要不说谎,就不会有乱码!在服务器要把jsp编译成.java时需要使用pageEncoding! > contentType:它表示添加一个响应头:Co

EL表达式参考手册

一.EL简介 1.语法结构     ${expression}2.[]与.运算符     EL 提供.和[]两种运算符来存取数据.    当要存取的属性名称中包含一些特殊字符,如.或?等并非字母或数字的符号,就一定要使用 [].例如:        ${user.My-Name}应当改为${user["My-Name"] }    如果要动态取值时,就可以用[]来做,而.无法做到动态取值.例如:        ${sessionScope.user[data]}中data 是一个变量3

EL表达式基础知识

1.EL表达式 [1] 简介 > JSP表达式 <%= %> 用于向页面中输出一个对象.                   > 到JSP2.0时,在我们的页面中不允许出现 JSP表达式和 脚本片段.                  > 使用EL表达式来代替JSP表达式 ,使用标签来代替脚本片段.                  > EL表达式用来向页面输出内容 [2] 基本语法 > ${表达式} > EL表达式可以从域中获取属性. - 使用 ${属性名

EL表达式的基本知识

1.EL表达式 [1] 简介 > JSP表达式 <%= %> 用于向页面中输出一个对象. > 到JSP2.0时,在我们的页面中不允许出现 JSP表达式和 脚本片段. > EL表达式用来向页面输出内容 [2] 基本语法 > ${表达式} > EL表达式可以 - 使用 ${属性名} - 如果只填写一个属性名,EL表达式会自动做全域查找. - 所谓的全域查找,就是按照page request session application四个域范围内分别查找,找到就返回属性,如

session和el表达式

2015/1/21 ## 回顾昨天案例 ## # 模拟购物车: >> 基本步骤: |-- 显示所有的书籍: |-- 制作书记列表/模仿数据库: |-- 参见昨天示例: |-- 制作查看详情链接: |-- 参见昨天示例: |-- 显示购物车中的所有商品: |-- request.getSession(); --- 得到session对象: |-- 假定购物车的名字 "cart"; |-- 用集合制作购物车: |-- 可以用泛型限定购买的商品类型: |-- 遍历; |-- 先判