以实现产品分页显示为例
实现分页那么首先需要创建一个page对象
//每页展示数
private Integer pageSize;
//当前页数
private Integer currentPage;
//总页数
private Integer totalPage;
//总记录数
private Integer allRow;
//存储的数据
private List<T> data;
//两个方法
//计算当前记录数offSet 每页展示数 *(当前页数-1)
/**
* 计算起始页数
* @param pageSize 每页展示条数
* @param currentPage 当前页
* @return
*/
public static Integer currentOffset(Integer pageSize,Integer currentPage) {
return pageSize * (currentPage-1);
}
/**
* 计算总页数
* @param allRow 所以记录数
* @param pageSize 每页展示数
* @return
*/
public static Integer totalPage(Integer allRow,Integer pageSize) {
return allRow%pageSize==0? allRow/pageSize:allRow/pageSize+1;
}
2.产品对象实例化
3.搜索对象实例化(将所有需要搜索的条件封装成一个类)
4.productDao层两个方法
/**
* 查询总记录数
* @return
* @throws Exception
*/
public Integer queryAllRow(SearchProduct sp) throws Exception {
Connection conn=DBUtil.getConn();
//保证全查为真,所以在这里加上where 1=1
String sql="select count(id) from products where 1=1";
//可变字符串拼接
StringBuffer sb=new StringBuffer(sql);
if(sp.getProName()!=null&&!"".equals(sp.getProName())) {
sb.append(" and name like ?");
}
if(sp.getCatalog()!=null&&!"0".equals(sp.getCatalog())) {
sb.append(" and catalog_name= ?");
}
if(sp.getMinPrice()!=null) {
sb.append(" and price > ?");
}
if(sp.getMaxPrice()!=null) {
sb.append(" and price < ?");
}
PreparedStatement psta=conn.prepareStatement(sb.toString());
//对每一个未知参数赋值
int index=1;
if(sp.getProName()!=null&&!"".equals(sp.getProName())) {
psta.setString(index, "%"+sp.getProName()+"%");
index++;
}
if(sp.getCatalog()!=null&&!"0".equals(sp.getCatalog())) {
psta.setString(index, sp.getCatalog());
index++;
}
if(sp.getMinPrice()!=null) {
psta.setDouble(index, sp.getMinPrice());
index++;
}
if(sp.getMaxPrice()!=null) {
psta.setDouble(index, sp.getMaxPrice());
}
ResultSet rs=psta.executeQuery();
//System.out.println("rs的值"+rs);
if(rs.next()) {
return rs.getInt("count(id)");
}
return 0;
}
public List<Products> list(Integer offset,Integer pageSize,SearchProduct sp) throws Exception{
Connection conn=DBUtil.getConn();
String sql="select id,name,catalog_name,price from products where 1=1";
String endsql=" limit ?,?";
StringBuffer sb=new StringBuffer(sql);
//可变字符串拼接
if(sp.getProName()!=null&&!"".equals(sp.getProName())) {
sb.append(" and name like ?");
}
if(sp.getCatalog()!=null&&!"0".equals(sp.getCatalog())) {
sb.append(" and catalog_name=?");
}
if(sp.getMinPrice()!=null) {
sb.append(" and price > ?");
}
if(sp.getMaxPrice()!=null) {
sb.append(" and price < ?");
}
sb.append(endsql);
PreparedStatement psta=conn.prepareStatement(sb.toString());
int index=1;
if(sp.getProName()!=null&&!"".equals(sp.getProName())) {
psta.setString(index, "%"+sp.getProName()+"%");
index++;
}
if(sp.getCatalog()!=null&&!"0".equals(sp.getCatalog())) {
psta.setString(index, sp.getCatalog());
index++;
}
if(sp.getMinPrice()!=null) {
psta.setDouble(index, sp.getMinPrice());
index++;
}
if(sp.getMaxPrice()!=null) {
psta.setDouble(index, sp.getMaxPrice());
index++;
}
psta.setInt(index, offset);
index++;
psta.setInt(index, pageSize);
ResultSet rs=psta.executeQuery();
List<Products> productList=new ArrayList<Products>();
while(rs.next()) {
Products product=new Products(rs.getInt("id"),rs.getString("name"),rs.getString("catalog_name"),rs.getDouble("price"));
productList.add(product);
}
return productList;
}
5.productService
public class ProductService {
ProductDao pd=new ProductDao();
public Page<Products> queryPage(Integer currentPage,Integer pageSize,SearchProduct sp) {
try {
//获得总记录数(多条件查询的时候,就需要修改总记录数)
Integer allRow=pd.queryAllRow(sp);
//根据总记录数计算总页数
Integer totalPage=Page.totalPage(allRow, pageSize);
//计算开始记录数
Integer offSet=Page.currentOffset(pageSize, currentPage);
//调用dao层方法
List<Products> productList=pd.list(offSet, pageSize,sp);
Page<Products> page=new Page<Products>(pageSize,currentPage,totalPage,allRow,productList);
return page;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
DBUtil.close();
}
return null;
}
6.ProductServlet
@WebServlet(urlPatterns = "/listProductServlet")
public class ListProductServlet extends HttpServlet{
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/**
* 在执行多条件分页查询时,当点击上一页或下一页时根据上次的查询条件进行展示
*/
req.setCharacterEncoding("utf-8");
//获得用户输入的值
String proName=req.getParameter("proName");
String strMinPrice=req.getParameter("minPrice");
String strMaxPrice=req.getParameter("maxPrice");
String catalog=req.getParameter("catalog");
//这个不能直接进行转换,如果用户没有输入的话,程序会报错,所以要进行判断
Double minPrice=null;
Double maxPrice=null;
if(strMinPrice!=null&&!"".equals(strMinPrice)) {
minPrice=Double.parseDouble(strMinPrice);
}
if(strMaxPrice!=null&&!"".equals(strMaxPrice)) {
maxPrice=Double.parseDouble(strMaxPrice);
}
//将获得的值放在一个类里面,这样传参的时候不会很多
SearchProduct sp=new SearchProduct(proName,minPrice,maxPrice,catalog);
System.out.println(sp);
String strCurrentPage=req.getParameter("currentPage");
//默认起始页面
Integer currentPage=1;
//如果不是默认页,点击了上一页或下一页,进行传递数据
if(strCurrentPage!=null&&!"".equals(strCurrentPage)) {
currentPage=Integer.parseInt(strCurrentPage);
}
//默认显示条数
Integer pageSize=10;
//调用业务
ProductService ps=new ProductService();
Page<Products> page=ps.queryPage(currentPage, pageSize,sp);
//这个里面其实已经包含了所有的信息
req.setAttribute("pageInfo", page);
req.setAttribute("productList", page.getData());
//将用户上一次输入的信息保存在这里
req.setAttribute("sp",sp );
req.getRequestDispatcher("/list.jsp").forward(req, resp);
return;
}
list.jsp
</head>
<%
pageContext.setAttribute("root", request.getContextPath());
%>
<body>
<!-- 用户可以输入条件进行查询 -->
<form action="${root}/listProductServlet" method="post" name="searchForm">
产品名称<input name="proName" value="${sp.proName}">
产品价格区间<input name="minPrice" value="${sp.minPrice}">-<input name="maxPrice" value="${sp.maxPrice}">
<select name="catalog" >
<option value="0"<c:if test="${empty sp.catalog}">selected</c:if>>请选择类型</option>
<option value="幽默杂货"<c:if test="${sp.catalog eq '幽默杂货' }">selected</c:if>
>幽默杂货</option>
<option value="巧妙收纳"<c:if test="${sp.catalog eq '巧妙收纳' }">selected</c:if>
>巧妙收纳</option>
<option value="与钟不同"<c:if test="${sp.catalog eq '与钟不同' }">selected</c:if>
>与钟不同</option>
<option value="品味茶杯"<c:if test="${sp.catalog eq '品味茶杯' }">selected</c:if>
>品味茶杯</option>
</select>
<input type="submit" value="查询">
<input type="hidden" name="currentPage">
<!-- 隐藏域,将当前页码放进去,当点击上一页下一页的时候,
不再是直接发送超链接请求,而是通过表单提交
表单中携带查询条件
-->
</form>
<table>
<tr>
<th>序号</th>
<th>名称</th>
<th>类型</th>
<th>价格</th>
</tr>
<c:forEach items="${productList}" var="p" varStatus="i">
<tr>
<td>${i.count}</td>
<td>${p.name}</td>
<td>${p.catalogName}</td>
<td>${p.price}</td>
</tr>
</c:forEach>
<tr>
<td colspan="4">
共${pageInfo.allRow}条记录,共${pageInfo.totalPage}页,
当前第${pageInfo.currentPage}页
<c:if test="${pageInfo.currentPage ne 1 }">
<!-- ${root}/listProductServlet?currentPage=1 -->
<a href="javascript:gopage(1)">首页</a>
<!-- ${root}/listProductServlet?currentPage=${pageInfo.currentPage-1} -->
<a href="javascript:gopage(${pageInfo.currentPage-1})">上一页</a>
</c:if>
<c:if test="${pageInfo.currentPage ne pageInfo.totalPage}">
<a href="javascript:gopage(${pageInfo.currentPage+1})">下一页</a>
<a href="javascript:gopage(${pageInfo.totalPage})">末页</a>
</c:if>
</td>
</tr>
</table>
<script type="text/javascript">
function gopage(pageNum) {
//alert(pageNum)
window.document.searchForm.currentPage.value=pageNum;
window.document.searchForm.submit();
}
</script>
</body>