现在我们要实现下面的需求:

当用户点击左侧二级菜单选项的时候,在右侧要显示对应的该二级菜单项下面存在哪些商品,例如点击潮流女装,要在右侧分页显示该潮流女装下对应哪些商品

1、要分页显示 首先要获得该二级菜单下对应商品的总数

2、分页查询和显示该二级菜单下对应商品的数目

我们首先在productList.jsp

    <s:iterator var="cs" value="#c.categorySeconds">
<dd>
<a href="${ pageContext.request.contextPath }/product_findByCsid.action?csid=<s:property value="#cs.csid"/>&page=1"><s:property value="#cs.csname"/></a>
</dd>
</s:iterator>

此处就是表示当前用户点击了某个二级菜单选项  需要传递当前二级菜单的csid和当前默认的page

传递到product_findByCsid.action传递到ProductAction的findByCsid这个方法中进行处理,ProductAction中需要定义一个成员变量csid接受传递过来的二级菜单选项的id值,也需要定义一个成员变量page接受page的值

我们来看对应的代码

package cn.itcast.shop.product.action;

import java.util.List;

import org.apache.struts2.ServletActionContext;

import cn.itcast.shop.category.beans.Category;
import cn.itcast.shop.category.service.CategoryService;
import cn.itcast.shop.product.beans.Product;
import cn.itcast.shop.product.service.ProductService;
import cn.itcast.shop.utils.PageBean; import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven; public class ProductAction extends ActionSupport implements ModelDriven<Product>{ private ProductService productService; private CategoryService categoryService; // 接收分类cid
private Integer cid; // 接收当前页数:
private int page; // 接收二级分类id
private Integer csid; public Integer getCsid() {
return csid;
}
public void setCsid(Integer csid) {
this.csid = csid;
}
public int getPage() {
return page;
}
public void setPage(int page) {
this.page = page;
}
public Integer getCid() {
return cid;
}
public void setCid(Integer cid) {
this.cid = cid;
}
public CategoryService getCategoryService() {
return categoryService;
}
public void setCategoryService(CategoryService categoryService) {
this.categoryService = categoryService;
}
public ProductService getProductService() {
return productService;
}
public void setProductService(ProductService productService) {
this.productService = productService;
}
public Product getProduct() {
return product;
}
public void setProduct(Product product) {
this.product = product;
}
private Product product = new Product();
@Override
public Product getModel() {
// TODO Auto-generated method stub
return product;
} // 根据商品的ID进行查询商品:执行方法:
public String findByPid() throws Exception{
// 调用Service的方法完成查询.
product = productService.findByPid(product.getPid());
return "findByPid";
} // 根据分类的id查询商品:
public String findByCid() {
List<Category> cList = categoryService.findAll();
ActionContext.getContext().getValueStack().set("cList", cList);
PageBean<Product> pageBean = productService.findByPageCid(cid, page);// 根据一级分类查询商品,带分页查询
// 将PageBean存入到值栈中:
ActionContext.getContext().getValueStack().set("pageBean", pageBean);
return "findByCid";
} // 根据二级分类id查询商品:
public String findByCsid() {
// 根据二级分类查询商品
PageBean<Product> pageBean = productService.findByPageCsid(csid, page);
// 将PageBean存入到值栈中:
ActionContext.getContext().getValueStack().set("pageBean", pageBean);
return "findByCsid";
} }

我们来看看对应的业务类方法

package cn.itcast.shop.product.service;

import java.util.List;

import cn.itcast.shop.product.beans.Product;
import cn.itcast.shop.product.dao.ProductDao;
import cn.itcast.shop.utils.PageBean; public class ProductService {
private ProductDao productDao; public ProductDao getProductDao() {
return productDao;
} public void setProductDao(ProductDao productDao) {
this.productDao = productDao;
} public List<Product> findHot() {
// TODO Auto-generated method stub
return productDao.findHot();
}
public List<Product> findNew(){
return productDao.findNew();
}
public Product findByPid(Integer pid) {
return productDao.findByPid(pid);
} // 根据一级分类的cid带有分页查询商品
public PageBean<Product> findByPageCid(Integer cid, int page) {
PageBean<Product> pageBean = new PageBean<Product>();
// 设置当前页数:
pageBean.setPage(page);
// 设置每页显示记录数:
int limit = 8;
pageBean.setLimit(limit);
// 设置总记录数:
int totalCount = 0;
totalCount = productDao.findCountCid(cid);
pageBean.setTotalCount(totalCount);
// 设置总页数:
int totalPage = 0;
// Math.ceil(totalCount / limit);
if (totalCount % limit == 0) {
totalPage = totalCount / limit;
} else {
totalPage = totalCount / limit + 1;
}
pageBean.setTotalPage(totalPage);
// 每页显示的数据集合:
// 从哪开始:
int begin = (page - 1) * limit;
List<Product> list = productDao.findByPageCid(cid, begin, limit);
pageBean.setList(list);
return pageBean;
} // 根据二级分类查询商品信息
public PageBean<Product> findByPageCsid(Integer csid, int page) {
PageBean<Product> pageBean = new PageBean<Product>();
// 设置当前页数:
pageBean.setPage(page);
// 设置每页显示记录数:
int limit = 8;
pageBean.setLimit(limit);
// 设置总记录数:
int totalCount = 0;
totalCount = productDao.findCountCsid(csid);
pageBean.setTotalCount(totalCount);
// 设置总页数:
int totalPage = 0;
// Math.ceil(totalCount / limit);
if (totalCount % limit == 0) {
totalPage = totalCount / limit;
} else {
totalPage = totalCount / limit + 1;
}
pageBean.setTotalPage(totalPage);
// 每页显示的数据集合:
// 从哪开始:
int begin = (page - 1) * limit;
List<Product> list = productDao.findByPageCsid(csid, begin, limit);
pageBean.setList(list);
return pageBean;
} }

我们来看看对应的dao数据库层的方法

package cn.itcast.shop.product.dao;

import java.util.List;

import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import cn.itcast.shop.product.beans.Product;
import cn.itcast.shop.utils.PageHibernateCallback; import java.sql.SQLException;
import java.util.List; import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport; public class ProductDao extends HibernateDaoSupport { // 首页上热门商品查询
public List<Product> findHot() {
// 使用离线条件查询.
DetachedCriteria criteria = DetachedCriteria.forClass(Product.class);
// 查询热门的商品,条件就是is_host = 1
criteria.add(Restrictions.eq("is_hot", 1));
// 倒序排序输出:
criteria.addOrder(Order.desc("pdate"));
// 执行查询:
List<Product> list = this.getHibernateTemplate().findByCriteria(
criteria, 0, 10);
return list;
} // 首页上最新商品的查询
public List<Product> findNew() {
// 使用离线条件查询:
DetachedCriteria criteria = DetachedCriteria.forClass(Product.class);
// 按日期进行倒序排序:
criteria.addOrder(Order.desc("pdate"));
// 执行查询:
List<Product> list = this.getHibernateTemplate().findByCriteria(criteria, 0, 10);
return list;
} // 根据商品ID查询商品
public Product findByPid(Integer pid) {
return (Product) this.getHibernateTemplate().get(Product.class, pid);
} //获得对应的一级分类下的所有的商品总的记录数
public int findCountCid(Integer cid) {
// TODO Auto-generated method stub
String hql = "select count(*) from Product p where p.categorySecond.category.cid = ?";
List<Long> list = this.getHibernateTemplate().find(hql,cid);
if(list != null && list.size() > 0){
return list.get(0).intValue();
}
return 0;
} // 根据分类id查询商品的集合
public List<Product> findByPageCid(Integer cid, int begin, int limit) {
// select p.* from category c,categorysecond cs,product p where c.cid = cs.cid and cs.csid = p.csid and c.cid = 2
// select p from Category c,CategorySecond cs,Product p where c.cid = cs.category.cid and cs.csid = p.categorySecond.csid and c.cid = ?
String hql = "select p from Product p join p.categorySecond cs join cs.category c where c.cid = ?";
// 分页另一种写法:
List<Product> list = (List<Product>) this.getHibernateTemplate().execute(new PageHibernateCallback<Product>(hql, new Object[]{cid}, begin, limit));
if(list != null && list.size() > 0){
return list;
}
return null; } // 根据二级分类查询商品个数
public int findCountCsid(Integer csid) {
String hql = "select count(*) from Product p where p.categorySecond.csid = ?";
List<Long> list = this.getHibernateTemplate().find(hql, csid);
if(list != null && list.size() > 0){
return list.get(0).intValue();
}
return 0;
} // 根据二级分类查询商品信息
public List<Product> findByPageCsid(Integer csid, int begin, int limit) {
String hql = "select p from Product p join p.categorySecond cs where cs.csid = ?";
List<Product> list = (List<Product>) this.getHibernateTemplate().execute(new PageHibernateCallback<Product>(hql, new Object[]{csid}, begin, limit));
if(list != null && list.size() > 0){
return list;
}
return null;
} }

// 根据二级分类id查询商品:
public String findByCsid() {
// 根据二级分类查询商品
PageBean<Product> pageBean = productService.findByPageCsid(csid, page);
// 将PageBean存入到值栈中:
ActionContext.getContext().getValueStack().set("pageBean", pageBean);
return "findByCsid";
}

我们将查询的二级菜单选项下的商品集合、当前的page等封装到了一个PageBean对象中存储在值栈中

    <!-- 商品模块的Action -->
<action name="product_*" class="productAction" method="{1}">
<result name="findByPid">/WEB-INF/jsp/product.jsp</result>
<result name="findByCid">/WEB-INF/jsp/productList.jsp</result>
<result name="findByCsid">/WEB-INF/jsp/productList.jsp</result>
</action>
</package>

这里我们是跳转到

productList.jsp

这里既可以显示一级分类下的商品,也可以显示二级分类下的商品,所以在

productList.jsp需要判断当前是显示那种情况
    <s:if test="cid != null">
<s:if test="pageBean.page != 1">
<a href="${ pageContext.request.contextPath }/product_findByCid.action?cid=<s:property value="cid"/>&page=1" class="firstPage">&nbsp;</a>
<a href="${ pageContext.request.contextPath }/product_findByCid.action?cid=<s:property value="cid"/>&page=<s:property value="pageBean.page-1"/>" class="previousPage">&nbsp;</a>
</s:if> <s:iterator var="i" begin="1" end="pageBean.totalPage">
<s:if test="pageBean.page != #i">
<a href="${ pageContext.request.contextPath }/product_findByCid.action?cid=<s:property value="cid"/>&page=<s:property value="#i"/>"><s:property value="#i"/></a>
</s:if>
<s:else>
<span class="currentPage"><s:property value="#i"/></span>
</s:else>
</s:iterator> <s:if test="pageBean.page != pageBean.totalPage">
<a class="nextPage" href="${ pageContext.request.contextPath }/product_findByCid.action?cid=<s:property value="cid"/>&page=<s:property value="pageBean.page+1"/>">&nbsp;</a>
<a class="lastPage" href="${ pageContext.request.contextPath }/product_findByCid.action?cid=<s:property value="cid"/>&page=<s:property value="pageBean.totalPage"/>">&nbsp;</a>
</s:if>
</s:if>
<s:if test="csid != null">
<s:if test="pageBean.page != 1">
<a href="${ pageContext.request.contextPath }/product_findByCsid.action?csid=<s:property value="csid"/>&page=1" class="firstPage">&nbsp;</a>
<a href="${ pageContext.request.contextPath }/product_findByCsid.action?csid=<s:property value="csid"/>&page=<s:property value="pageBean.page-1"/>" class="previousPage">&nbsp;</a>
</s:if> <s:iterator var="i" begin="1" end="pageBean.totalPage">
<s:if test="pageBean.page != #i">
<a href="${ pageContext.request.contextPath }/product_findByCsid.action?csid=<s:property value="csid"/>&page=<s:property value="#i"/>"><s:property value="#i"/></a>
</s:if>
<s:else>
<span class="currentPage"><s:property value="#i"/></span>
</s:else>
</s:iterator> <s:if test="pageBean.page != pageBean.totalPage">
<a class="nextPage" href="${ pageContext.request.contextPath }/product_findByCsid.action?csid=<s:property value="csid"/>&page=<s:property value="pageBean.page+1"/>">&nbsp;</a>
<a class="lastPage" href="${ pageContext.request.contextPath }/product_findByCsid.action?csid=<s:property value="csid"/>&page=<s:property value="pageBean.totalPage"/>">&nbsp;</a>
</s:if>
</s:if>
<s:if test="cid != null">表示就是当前一级分类的cid不等于null,就显示一级分类下的商品进行分页显示
整个
productList.jsp的代码如下所示:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!-- saved from url=(0048)http://localhost:8080/mango/product/list/1.jhtml -->
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>传智网上商城</title>
<link href="${pageContext.request.contextPath}/css/common.css" rel="stylesheet" type="text/css"/>
<link href="${pageContext.request.contextPath}/css/product.css" rel="stylesheet" type="text/css"/> </head>
<body>
<div class="container header">
<div class="span5">
<div class="logo">
<a href="http://localhost:8080/mango/">
<img src="${pageContext.request.contextPath}/image/r___________renleipic_01/logo.gif" alt="传智播客">
</a>
</div>
</div>
<div class="span9">
<div class="headerAd">
<img src="${pageContext.request.contextPath}/image/header.jpg" width="320" height="50" alt="正品保障" title="正品保障">
</div> </div> <%@ include file="menu.jsp" %> </div>
<div class="container productList">
<div class="span6">
<div class="hotProductCategory">
<s:iterator var="c" value="#session.cList">
<dl>
<dt>
<a href="${pageContext.request.contextPath}/product_findByCid.action?cid=<s:property value="#c.cid"/>&page=1"><s:property value="#c.cname"/></a>
</dt>
<s:iterator var="cs" value="#c.categorySeconds">
<dd>
<a href="${ pageContext.request.contextPath }/product_findByCsid.action?csid=<s:property value="#cs.csid"/>&page=1"><s:property value="#cs.csname"/></a>
</dd>
</s:iterator>
</dl>
</s:iterator>
</div>
</div>
<div class="span18 last"> <form id="productForm" action="${pageContext.request.contextPath}/image/蔬菜 - Powered By Mango Team.htm" method="get"> <div id="result" class="result table clearfix">
<ul>
<s:iterator var="p" value="pageBean.list">
<li>
<a href="${ pageContext.request.contextPath }/product_findByPid.action?pid=<s:property value="#p.pid"/>">
<img src="${pageContext.request.contextPath}/<s:property value="#p.image"/>" width="170" height="170" style="display: inline-block;"> <span style='color:green'>
<s:property value="#p.pname"/>
</span> <span class="price">
商城价: ¥<s:property value="#p.shop_price"/>
</span> </a>
</li>
</s:iterator> </ul>
</div>
<div class="pagination">
<span>第 <s:property value="pageBean.page"/>/<s:property value="pageBean.totalPage"/> 页</span>
<s:if test="cid != null">
<s:if test="pageBean.page != 1">
<a href="${ pageContext.request.contextPath }/product_findByCid.action?cid=<s:property value="cid"/>&page=1" class="firstPage">&nbsp;</a>
<a href="${ pageContext.request.contextPath }/product_findByCid.action?cid=<s:property value="cid"/>&page=<s:property value="pageBean.page-1"/>" class="previousPage">&nbsp;</a>
</s:if> <s:iterator var="i" begin="1" end="pageBean.totalPage">
<s:if test="pageBean.page != #i">
<a href="${ pageContext.request.contextPath }/product_findByCid.action?cid=<s:property value="cid"/>&page=<s:property value="#i"/>"><s:property value="#i"/></a>
</s:if>
<s:else>
<span class="currentPage"><s:property value="#i"/></span>
</s:else>
</s:iterator> <s:if test="pageBean.page != pageBean.totalPage">
<a class="nextPage" href="${ pageContext.request.contextPath }/product_findByCid.action?cid=<s:property value="cid"/>&page=<s:property value="pageBean.page+1"/>">&nbsp;</a>
<a class="lastPage" href="${ pageContext.request.contextPath }/product_findByCid.action?cid=<s:property value="cid"/>&page=<s:property value="pageBean.totalPage"/>">&nbsp;</a>
</s:if>
</s:if>
<s:if test="csid != null">
<s:if test="pageBean.page != 1">
<a href="${ pageContext.request.contextPath }/product_findByCsid.action?csid=<s:property value="csid"/>&page=1" class="firstPage">&nbsp;</a>
<a href="${ pageContext.request.contextPath }/product_findByCsid.action?csid=<s:property value="csid"/>&page=<s:property value="pageBean.page-1"/>" class="previousPage">&nbsp;</a>
</s:if> <s:iterator var="i" begin="1" end="pageBean.totalPage">
<s:if test="pageBean.page != #i">
<a href="${ pageContext.request.contextPath }/product_findByCsid.action?csid=<s:property value="csid"/>&page=<s:property value="#i"/>"><s:property value="#i"/></a>
</s:if>
<s:else>
<span class="currentPage"><s:property value="#i"/></span>
</s:else>
</s:iterator> <s:if test="pageBean.page != pageBean.totalPage">
<a class="nextPage" href="${ pageContext.request.contextPath }/product_findByCsid.action?csid=<s:property value="csid"/>&page=<s:property value="pageBean.page+1"/>">&nbsp;</a>
<a class="lastPage" href="${ pageContext.request.contextPath }/product_findByCsid.action?csid=<s:property value="csid"/>&page=<s:property value="pageBean.totalPage"/>">&nbsp;</a>
</s:if>
</s:if>
</div>
</form>
</div>
</div>
<div class="container footer">
<div class="span24">
<div class="footerAd">
<img src="${pageContext.request.contextPath}/image/footer.jpg" width="950" height="52" alt="我们的优势" title="我们的优势">
</div> </div>
<div class="span24">
<ul class="bottomNav">
<li>
<a >关于我们</a>
|
</li>
<li>
<a>联系我们</a>
|
</li>
<li>
<a >诚聘英才</a>
|
</li>
<li>
<a >法律声明</a>
|
</li>
<li>
<a>友情链接</a>
|
</li>
<li>
<a target="_blank">支付方式</a>
|
</li>
<li>
<a target="_blank">配送方式</a>
|
</li>
<li>
<a >官网</a>
|
</li>
<li>
<a >论坛</a> </li>
</ul>
</div>
<div class="span24">
<div class="copyright">Copyright©2005-2015 网上商城 版权所有</div>
</div>
</div>
</body></html>

最新文章

  1. IIS设置session时长
  2. MySQL的备份的一些策略和方法的总结
  3. IOS8Preview-Huge for developer and Massive for everyone else
  4. 【原】就IOS发布app时如何保护文本资源的一个方法
  5. if...else语句的应用题
  6. Codeforces Round #372 (Div. 2) A B C 水 暴力/模拟 构造
  7. Strust2最基本使用
  8. 精简版、GHOST版win7,arduino驱动安装失败的解决方法分享
  9. 【HDOJ】4513 吉哥系列故事——完美队形II
  10. FZU 2095 水面高度
  11. 输入计算表达式,将他们存在string【】中
  12. JavaSE中Collection集合框架学习笔记(3)——遍历对象的Iterator和收集对象后的排序
  13. android Intent机制详解
  14. Android开发之常见事件响应方式
  15. Linux 下安装 tomcat
  16. STM32固件库下载地址
  17. spring整合strus2的Hellowworld
  18. 【洛谷p2822】组合数问题
  19. 无需AutoCAD,用C#生成DWG文件
  20. centos7配置svn钩子hooks脚本自动同步代码到项目目录

热门文章

  1. 【C++】cout、cerr、clog之间的区别
  2. Rocket - util - PrefixSum
  3. 【大厂面试02期】Redis过期key是怎么样清理的?
  4. 使用turtle库绘制一个六角形
  5. Java实现 LeetCode 763 划分字母区间(暴力)
  6. Java实现 LeetCode 676 实现一个魔法字典(暴力)
  7. Java实现 LeetCode 552 学生出勤记录 II(数学转换?还是动态规划?)
  8. Java实现 蓝桥杯VIP 算法训练 摆动序列
  9. set基本运用
  10. 4-react 组件之间传值。