01 JavaWeb开发,使用SSH:用el表达式获取Action传来的值时出现java.lang.NumberFormatException: For input string: "pid"

对本例子的错误进行分析

1.报错截图
在这里插入图片描述
在这里插入图片描述
2.分析
根据java.lang.NumberFormatException报错方式,可推测使用el表达式对遍历中元素pro无法转换对应的类型,因此可以通过Struts2标签(Debug)查看值栈中pageBean的数据类型情况,如下图所示:
在这里插入图片描述
从上图可以看出list中封装的对象类型是Object的,不是具体的某个实体类对象,在这里,我的初衷就是将多个商品(Product)对象装在list中,而此时的list元素对象即不是Product。
那么,根本原因就是在Dao层出现了问题,在查找商品的方法中,采用Spring提供Hibernate模板对象getHibernateTemplate(),使用hql查询方式。
hql语句为"select pid,pname,pimage,shop_price from Product where pflag=:pflag and cid=:cid";
可知,这种hql查询方式:筛选字段,是不能被Hibernate直接封装为具体的实体类对象的,结果就是Object数组。
3.解决方法
在此给出3种解决方式,我们依次使用hql方式、QBC、SQL:
投影查询
1)对以上的hql语句改进为"select new Product(pid,pname,pimage,shop_price) from com.shop.entity.Product where pflag=:pflag and cid=:cid"
2)在实体类Product中添加对应的构造方法new Product(pid,pname,pimage,shop_price),记住别忘了无参的构造方法,防止出错。
QBC查询
1)由于public List findProductListByCid(String cid, int index,int currentCount);方法参数传来的是cid(String类型,是另外一个Category实体类的属性,对应另一张表的主键),而Product实体类属性,以及映射配置文件没有cid这个属性,但有属性category(Category类型)
2)在本方法创建Category对象category,将cid封装到category中,然后使用Session得到Criteria对象,将category添加到Criteria对象的查询条件上即可,代码如下所示:

Criteria createCriteria = session.createCriteria(Product.class);
createCriteria.add(Restrictions.eq("pflag", 0));
Category category=new Category();
category.setCid(cid);
createCriteria.add(Restrictions.eq("category", category));
createCriteria.setFirstResult(index);
createCriteria.setMaxResults(currentCount);
List<Product> products = createCriteria.list();

注:此参数条件的处理方式不建议这样采用,我们可以使用一个Map封装方法中这些参数。
SQL查询
略。。。。。。
注:本次按这种方式没有解决该问题,发生以下报错(截图):
在这里插入图片描述
4.效果
在这里插入图片描述
有兴趣的可以继续往下看

本例子:分页显示商品

在Dao层中

/**
 * 根据cid和分页参数查找商品 ming 2018/12/16
 */
@Override
public List<Product> findProductListByCid(String cid, int index,
		int currentCount) {
	return getHibernateTemplate().execute(new HibernateCallback<List<Product>>() {
		@Override
		public List<Product> doInHibernate(Session session) throws HibernateException {
			String hql="select pid,pname,pimage,shop_price from Product where pflag=:pflag and cid=:cid";
			Query createQuery = session.createQuery(hql);
			createQuery.setParameter("pflag", 0);
			createQuery.setParameter("cid", cid);
			createQuery.setFirstResult(index);
			createQuery.setMaxResults(currentCount);
			List<Product> products = createQuery.list();
			return products;
		}
	});
}
/**
* 查找商品总数目 ming 2018/12/16
 */
@Override
public int getTotalCountByCid(String cid) {
	Long totalCount=getHibernateTemplate().execute(new HibernateCallback<Long>() {
		@Override
		public Long doInHibernate(Session session) throws HibernateException {
			String hql="select count(pid) from Product where pflag=:pflag and cid=:cid";
			Query createQuery = session.createQuery(hql);
			createQuery.setParameter("pflag", 0);
			createQuery.setParameter("cid", cid);
			Long totalCount = (Long) createQuery.uniqueResult();
			return totalCount;
		}
	});
	return totalCount.intValue();
}

在Service层中

/**
* 根据cid和第几页获取商品的业务方法 ming 2018/12/16
 */
@Override
public PageBean findProductListByCid(String cid, Integer currentPage,
		int currentCount) {
	// 封装一个PageBean对象
	PageBean<Product> pageBean=new PageBean<Product>();
	pageBean.setCurrentPage(currentPage);//第几页
	int totalCount=productDao.getTotalCountByCid(cid);//总条目
	pageBean.setCurrentCount(currentCount);//当前页要显示的条目
	int totalPage=(int) Math.ceil(1.0*totalCount/currentCount);
	pageBean.setTotalPage(totalPage);//总页数
	/**
	 * 数据库索引与当前页的关系
	 * 索引	当前页	当前页显示条目
	 * 0		1		12
	 * 12	2		12
	 * 24	3		12
	 * 、、、、
	 */
	int index=(currentPage-1)*currentCount;
	List<Product> list=productDao.findProductListByCid(cid,index,currentCount);
	pageBean.setList(list);//显示对象列表
	return pageBean;
}
/**
 * 根据商品id查找商品的业务方法 ming 2018/12/16
 */
@Override
public Product findProductByPid(String pid) {
	return productDao.findProductByPid(pid);
}

在Web层中

/**
 * 加载商品列表的方法 ming 2018/12/16
 */
public String  productList() throws Exception {
	if (null==parameterBean.getCurrentPage()) {
		parameterBean.setCurrentPage(1);
	}
	PageBean pageBean=null;//分页对象
	try {
		int currentCount=12;
	    pageBean=productService.findProductListByCid(parameterBean.getCid(),parameterBean.getCurrentPage(),currentCount);
		//-------从客户端获取浏览商品记录
		Cookie[] cookies = ServletActionContext.getRequest().getCookies();
		LinkedList<Product> HistoryProductList=new LinkedList<Product>();
		if (null!=cookies) {
			for (Cookie cookie : cookies) {
				if ("pids".equals(cookie.getName())) {
					String valuePids = cookie.getValue();//1-2-3
					String[] pidsArray = valuePids.split("-");//{1,2,3}
					List<String> asList = Arrays.asList(pidsArray);//[1,2,3]
					for (int i = 0; i < pidsArray.length; i++) {//根据每一个pid找到对应的product
						Product product = productService.findProductByPid(pidsArray[i]);
						HistoryProductList.add(product);
					}
				}					
			}
			ActionContext.getContext().put("HistoryProductList", HistoryProductList);
		}
		//-----------------------
		if (null!=pageBean) {//保存数据并转发到product_list.jsp页面
			System.out.println(pageBean);
			ActionContext.getContext().put("pageBean", pageBean);
			ActionContext.getContext().put("cid", parameterBean.getCid());
			return "toProduct_list";
		} 
	} catch (Exception e) {
		e.printStackTrace();
	}
	return "toIndex";
}
--------------------------------------------------------------------------------------------------------------------------
JSP页面部分代码:
<%----------使用jstl标签与el表达式遍历-----------%>
<c:forEach items="${pageBean.list}" var="pro">
	<div class="col-md-2" style="height: 250px;">
		<a href="${pageContext.request.contextPath}/ProductAction_productInfo?pid=${pro.pid}&cid=${cid}&currentPage=${pageBean.currentPage}">
		 <img src="${pageContext.request.contextPath}/${pro.pimage}"
			width="170" height="170" style="display: inline-block;">
		</a>
		<p>
			<a href="product_info.html" style='color: green'>${pro.pname}</a>
		</p>
		<p>
			<font color="#FF0000">商城价:&yen;${pro.shop_price}</font>
		</p>
	</div>
</c:forEach>
<%----------使用Struts2标签遍历-----------%>
<%-- <s:iterator value="#pageBean.list" var="pro">
		<div class="col-md-2" style="height: 250px;">
			<a href="${pageContext.request.contextPath}/ProductAction_productInfo?pid=<s:property value='#pro.pid'/>
			&cid=<s:property value='#pro.cid'/>&currentPage=<s:property value='#pageBean.currentPage'/>"> 
			<img src="${pageContext.request.contextPath}/<s:property value='#pro.pimage'/>"
				width="170" height="170" style="display: inline-block;">
			</a>
			<p>
				<a href="product_info.html" style='color: green'><s:property value="#pro.pname"/></a>
			</p>
			<p>
				<font color="#FF0000">商城价:&yen;<s:property value="#pro.shop_price"/></font>
			</p>
		</div>
</s:iterator> --%>

最后

感谢这位博主的解决方法,来自博客园的wdnnccey,博客链接如下:
https://www.cnblogs.com/wdnnccey/p/5971870.html

完。。。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值