分页数据模型
在点击商品分类的各种种类的时候,需要展示各种分类下的商品信息,这时候我们需要创建一个分页的数据模型。
里面包括:
当前的页数
每一页显示多少条数
总记录数
总页数
还需要有一个集合,里面放置所以的goods
page model如下:
package com.sikiedu.model;
import java.util.List;
//分页的数据模型
public class Page {
private int pageNo;//当前是第几页
private int pageSize;//每一页显示多少条数据
private int totalCount;//总记录数 数据总个数
private int totalPage;//总页数
private List<Object> list;
public void setPageSizeAndTotalCount(int pageSize,int totalCount) {
//每页显示多少个 总记录数
this.pageSize=pageSize;
this.totalCount=totalCount;
totalPage=(int) Math.ceil((double)totalCount/pageSize);
}
public int getPageNo() {
return pageNo;
}
public void setPageNo(int pageNo) {
this.pageNo = pageNo;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getTotalCount() {
return totalCount;
}
public void setTotalCount(int totalCount) {
this.totalCount = totalCount;
}
public int getTotalPage() {
return totalPage;
}
public void setTotalPage(int totalPage) {
this.totalPage = totalPage;
}
public List<Object> getList() {
return list;
}
public void setList(List<Object> list) {
this.list = list;
}
}
通过servlet得到id 和pageNo ,通过id 和pageNo得到分页的数据模型,放进request里面。
下面是商品列表的servlet:
package com.sikiedu.servelt;
import java.io.IOException;
import java.util.List;
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 com.sikiedu.model.Goods;
import com.sikiedu.model.Page;
import com.sikiedu.model.Type;
import com.sikiedu.service.GoodsService;
import com.sikiedu.service.TypeService;
/**
* Servlet implementation class GoodsListServlet
*/
@WebServlet("/goods_list")
public class GoodsListServlet extends HttpServlet {
private GoodsService gService=new GoodsService();//为了调用Service
private TypeService tService=new TypeService();
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
int id=0;
if(request.getParameter("id")!=null) {
id=Integer.parseInt(request.getParameter("id"));
}
int pageNo=1;
if(request.getParameter("pageNo")!=null) {
pageNo=Integer.parseInt(request.getParameter("pageNo"));
}
// List<Goods> list=gService.selectGoods(id, pageNo, 8);
// request.setAttribute("list", list);
Page p=gService.getGoodsPage(id, pageNo);
request.setAttribute("p", p);
request.setAttribute("id", id);
Type t=null;
if(id!=0) {
t=tService.Select(id);
}
request.setAttribute("t", t);
request.getRequestDispatcher("/goods_list.jsp").forward(request, response);
}
}
分类的过程中,头部的类型,在各个页面都需要显示,所以我们可以放在Application里面,在Application创建的时候就将各个列表的信息存入进去,所以创在监听器的包里面。
package com.sikiedu.listener;
/**
*
* 整个页面在显示的时候都需要商品列表的显示,所以这个属性可以放在Application里面,在所有的页面都可以查询到
* 放在servlet里面比较麻烦,每次都请求,所有之间放在Application里面
*
*
*/
import java.util.List;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import com.sikiedu.model.Type;
import com.sikiedu.service.TypeService;
/**
* Application Lifecycle Listener implementation class ApplicationListener
*
*/
@WebListener
public class ApplicationListener implements ServletContextListener {
private TypeService tService=new TypeService();//用它去查询
/**
* @see ServletContextListener#contextDestroyed(ServletContextEvent)
*/
public void contextDestroyed(ServletContextEvent arg0) {
// TODO Auto-generated method stub
}
/**
* @see ServletContextListener#contextInitialized(ServletContextEvent)
*/
public void contextInitialized(ServletContextEvent arg0) {
List<Type> list=tService.selectAll();
arg0.getServletContext().setAttribute("typeList", list);//将类型放在Application里面
}
}
分页查询数据库的操作
limit分页公式:PageNo是当前第几页;pageSize是一页多少条记录
limit (PageNo-1)*pageSize,pageSize
//分页查询商品
public List<Goods> selectGoods(int typeId,int pageNo,int pageSize) throws SQLException{
QueryRunner r=new QueryRunner(DBUtil.getDataSource());
if(typeId==0) {
String sql="select * from goods limit ?,?";
return r.query(sql, new BeanListHandler<Goods>(Goods.class),(pageNo-1)*pageSize,pageSize);
}else {
String sql="select * from goods where type_id=? limit ?,?";
return r.query(sql, new BeanListHandler<Goods>(Goods.class),typeId,(pageNo-1)*pageSize,pageSize);
}
}
在商品列表页面jsp显示的时候,使用foreach遍历显示
<h2><c:choose><c:when test="${empty t }" >全部系列</c:when><c:otherwise>${t.name }</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="${pageContext.request.contextPath }/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="${pageContext.request.contextPath }${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>查看详情</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(6)">
<div class="clearfix"> </div>
</div>
</div>
</div>
</c:forEach>
在进行上下页的时候也用el和jstl相结合判断逻辑即可
<a class='btn btn-info' <c:if test="${p.pageNo==1 }">disabled</c:if> <c:if test="${p.pageNo!=1 }">href="${pageContext.request.contextPath }/goods_list?pageNo=1&id=${id}</c:if> ">首页</a>
<a class='btn btn-info' <c:if test="${p.pageNo==1 }">disabled</c:if> <c:if test="${p.pageNo!=1 }">href="${pageContext.request.contextPath }/goods_list?pageNo=${p.pageNo-1 }&id=${id}</c:if> ">上一页</a>
<h2 style='display:inline;'>[${p.pageNo }/${p.totalPage }]</h2>
<h2 style='display:inline;'>[${p.totalCount }]</h2>
<a class='btn btn-info' <c:if test="${p.totalPage==0||p.pageNo==p.totalPage }">disabled</c:if> <c:if test="${p.pageNo!=p.totalPage }">href="${pageContext.request.contextPath }/goods_list?pageNo=${p.pageNo+1}&id=${id}"</c:if>>下一页</a>
<a class='btn btn-info' <c:if test="${p.totalPage==0||p.pageNo==p.totalPage }">disabled</c:if> <c:if test="${p.pageNo!=p.totalPage }">href="${pageContext.request.contextPath }/goods_list?pageNo=${p.totalPage}&id=${id}"</c:if>>尾页</a>
<input type='text' class='form-control' style='display:inline;width:60px;' value=''/><a class='btn btn-info' href='javascript:void(0);' onclick='location.href="${pageContext.request.contextPath }/goods_list?id=${id}&pageNo="+(this.previousSibling.value)'>GO</a>