概念
本文将完成实现项目的热销和新品两个分类的商品列表进行分页展示。
热销和新品功能实现步骤
在head.jsp头部页面中点击这两个超链接向服务器发送请求。
在servlet包中创建GoodRecommendListServlet类,用于接收浏览器的请求。
package servlet;
import model.Page;
import service.GoodsService;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(name = "goodrecommendList",urlPatterns = "/goodsrecommend_list")
public class GoodRecommendListServlet extends HttpServlet {
private GoodsService gService = new GoodsService();
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
int type = Integer.parseInt(request.getParameter("type") ) ;
int pageNumber = 1;
if(request.getParameter("pageNumber") != null) {
try {
pageNumber=Integer.parseInt(request.getParameter("pageNumber") ) ;
}
catch (Exception e)
{
}
}
if(pageNumber<=0)
pageNumber=1;
Page p = gService.getGoodsRecommendPage(type, pageNumber);
if(p.getTotalPage()==0)
{
p.setTotalPage(1);
p.setPageNumber(1);
}
else {
if(pageNumber>=p.getTotalPage()+1)
{
p = gService.getGoodsRecommendPage(type, p.getTotalPage());
}
}
request.setAttribute("p", p);
request.setAttribute("t", type);
request.getRequestDispatcher("goodsrecommend_list.jsp").forward(request, response);
}
}
以上代码中,通过接收浏览器发送的type参数的值来判断是需要获得热销商品还是需要获得新品分类的商品,同时也判断是否有页码参数,如果浏览器没有传递页码参数,则默认为第一页。并通过分类参数和页码参数作为条件查询该分类的商品总页数,以及分页信息。
因此在service包中的GoodsService类中定义热销和新品两个分类的获取商品信息的方法
//根据当前分类和页码获得当前分页信息
public Page getGoodsRecommendPage(int type,int pageNumber) {
Page p = new Page();
p.setPageNumber(pageNumber);
int totalCount = 0;
try {
totalCount = gDao.getRecommendCountOfGoodsByTypeID(type);
} catch (SQLException e) {
e.printStackTrace();
}
p.SetPageSizeAndTotalCount(8, totalCount);
List list=null;
try {
list = gDao.selectGoodsbyRecommend(type, pageNumber, 8);
for(Goods g : (List<Goods>)list) {
g.setScroll(gDao.isScroll(g));
g.setHot(gDao.isHot(g));
g.setNew(gDao.isNew(g));
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
p.setList(list);
return p;
}
接着需要调用dao层执行sql语句获取数据分类商品总数
public int getRecommendCountOfGoodsByTypeID(int type) throws SQLException {
if(type==0)return getCountOfGoodsByTypeID(0);
QueryRunner r = new QueryRunner(DataSourceUtils.getDataSource());
String sql = "select count(*) from recommend where type=?";
return r.query(sql, new ScalarHandler<Long>(),type).intValue();
}
根据分类,页码以及每页的商品数量作为条件获得分类商品列表信息
//根据标识id分页查询商品信息
public List<Goods> selectGoodsbyRecommend(int type,int pageNumber,int pageSize) throws SQLException {
QueryRunner r = new QueryRunner(DataSourceUtils.getDataSource());
if(type==0) {
//当不添加推荐类型限制的时候
String sql = " select g.id,g.name,g.cover,g.image1,g.image2,g.intro,g.price,g.stock,t.name typename from goods g,type t where g.type_id=t.id order by g.id limit ?,?";
return r.query(sql, new BeanListHandler<Goods>(Goods.class),(pageNumber-1)*pageSize,pageSize);
}
String sql = " select g.id,g.name,g.cover,g.image1,g.image2,g.intro,g.price,g.stock,t.name typename from goods g,recommend r,type t where g.id=r.goods_id and g.type_id=t.id and r.type=? order by g.id limit ?,?";
return r.query(sql, new BeanListHandler<Goods>(Goods.class),type,(pageNumber-1)*pageSize,pageSize);
}
并且判断查询出来的商品是轮播图商品,还是热销商品或者是新品商品,进行标识和区分,并且进行验证当前商品是否属于该分类的商品
public boolean isScroll(Goods g) throws SQLException {
return isRecommend(g, 1);
}
public boolean isHot(Goods g) throws SQLException {
return isRecommend(g, 2);
}
public boolean isNew(Goods g) throws SQLException {
return isRecommend(g, 3);
}
private boolean isRecommend(Goods g,int type) throws SQLException {
QueryRunner r = new QueryRunner(DataSourceUtils.getDataSource());
String sql = "select * from recommend where type=? and goods_id=?";
Recommend recommend = r.query(sql, new BeanHandler<Recommend>(Recommend.class),type,g.getId());
if(recommend==null) {
return false;
}else {
return true;
}
}
将查询和验证的数据保存在Recommend实体类中,因此需要在model包中创建给实体类
package model;
public class Recommend {
private int id;
private int type;//1条幅 2热销 3新品
private Goods goods;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public Goods getGoods() {
return goods;
}
public void setGoods(Goods goods) {
this.goods = goods;
}
public Recommend(int id, int type, Goods goods) {
super();
this.id = id;
this.type = type;
this.goods = goods;
}
public Recommend() {
super();
}
}
最后,所获得的商品分页信息通过请求转发的方法是发送到goodsrecommend_list.jsp页面中显示
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<title>首页</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link type="text/css" rel="stylesheet" href="css/bootstrap.css">
<link type="text/css" rel="stylesheet" href="css/style.css">
<script type="text/javascript" src="js/jquery.min.js"></script>
<script type="text/javascript" src="js/bootstrap.min.js"></script>
<script type="text/javascript" src="js/simpleCart.min.js"></script>
<script type="text/javascript" src="layer/layer.js"></script>
<script type="text/javascript" src="js/cart.js"></script>
</head>
<body>
<jsp:include page="header.jsp">
<jsp:param name="flag" value="3"></jsp:param>
</jsp:include>
<div class="products">
<div class="container">
<h2><c:choose><c:when test="${t==2}">热销商品</c:when><c:otherwise>新品商品</c:otherwise></c:choose></h2>
<div class="col-md-12 product-model-sec">
<c:forEach items="${p.list}" var="g">
<div class="product-grid">
<a href="/goods_detail?id=${g.id}">
<div class="more-product"><span> </span></div>
<div class="product-img b-link-stripe b-animate-go thickbox">
<img src="${g.cover}" class="img-responsive" alt="${g.name}" width="240" height="240">
<div class="b-wrapper">
<h4 class="b-animate b-from-left b-delay03">
<button href="/goods_detail?id=${g.id}">查看详情</button>
</h4>
</div>
</div>
</a>
<div class="product-info simpleCart_shelfItem">
<div class="product-info-cust prt_name">
<h4>${g.name}</h4>
<span class="item_price">¥ ${g.price}</span>
<input type="button" class="item_add items" value="加入购物车" onclick="buy(${g.id})">
<div class="clearfix"> </div>
</div>
</div>
</div>
</c:forEach>
</div>
<jsp:include page="page.jsp">
<jsp:param name="url" value="/goodsrecommend_list"></jsp:param>
<jsp:param name="param" value="&type=${t}"></jsp:param>
</jsp:include>
</div>
</div>
</div>
<jsp:include page="footer.jsp"></jsp:include>
</body>
</html>