分页展示数据,并实现关键字搜索

以实现产品分页显示为例

实现分页那么首先需要创建一个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>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值