对本例子的错误进行分析
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}¤tPage=${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">商城价:¥${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'/>¤tPage=<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">商城价:¥<s:property value="#pro.shop_price"/></font>
</p>
</div>
</s:iterator> --%>
最后
感谢这位博主的解决方法,来自博客园的wdnnccey,博客链接如下:
https://www.cnblogs.com/wdnnccey/p/5971870.html