教你在JSP中分页

SP中分页在实际开发中很常用,在这里教大家怎样在JSP中实现分页效果。分别用超链接、按钮和下拉列表框三种形式来实现。

只需掌握三点,在JSP中实现分页就可以轻松搞定。简而言之,就是"123原则",
即1条SQL语句;2个方法;3条数显示数据。

首先,SQL语句在分页中的作用很重要,它的查询原理就是"不在前@条的前@条数据",所以涉及到两个查询变量:第1个变量为一页显示的条数(pageSize),第2个变量为动态的、变化的页数(pageDynamic);假定当前页面为pageNo,那么它们之间存在这样的关系:pageDynamic = pageSize*(pageNo-1);
示例代码:
select top (?) * from Product where productid not in (select top (?) productid from product order by productid)

其次,在业务逻辑中编写两个方法;第一个方法是用于分页查询的,返回一个List<>泛型集合对象,第二个方法返回数据库中一共有多少条数据,返回整型数据;
示例代码:
public List<Product> getProduct(int pageNo,int pageSize)
{
 //创建一个ArrayList泛型集合对象
 List<Product> products = new ArrayList<Product>();
 //创建一条SQL语句
 String sql = "select top (?) * from Product where productid not in (select top (?)                       productid from product order by productid)";
  
 try {
  conn = getConn();  //得到数据库连接
  pstmt = conn.prepareStatement(sql);  //取得pstmt对象
  pstmt.setInt(1, pageSize);
  pstmt.setInt(2, pageSize*(pageNo-1));  //设置参数
  rs = pstmt.executeQuery();  //执行查询,将结果集赋给rs
   
  while (rs.next())
  {
   //创建一个Product对象
   Product pro = new Product();
   //为数据设置值
   pro.setProductId(rs.getString("productId"));
   pro.setProductName(rs.getString("productName"));
   pro.setProductPrice(rs.getString("productPrice"));
   pro.setProductDescription(rs.getString("productDescription"));
   products.add(pro);
  }
  
 } catch (ClassNotFoundException e) {
  e.printStackTrace();
 } catch (SQLException e) {
  e.printStackTrace();
 } 
  
 return products;
}

 

public int getAllPages(int pageSize)  //pageSize为每页显示的条数
{
  
 int result = 0;  //返回值
 try
 {
  conn = getConn();  //获得数据库连接
  //查询出数据表中的全部数据条数,在此必须写"as a(a为变量)",否则rs无法接收整型值
  String sql = "select count(*) as a from product"; 
  pstmt = conn.prepareStatement(sql);               
  rs = pstmt.executeQuery();                        
   
  if (rs.next())
  {
   result = rs.getInt("a");
  }
 }
 catch (Exception ex)
 {
  ex.printStackTrace();
 }
 finally
 {
  this.closeAll(conn, pstmt, rs);
 }
 //如果总条数/每页显示条数能被整除,则返回该条数,如不能被整除,则返回总条数+1
 return result%pageSize == 0?result/pageSize:result/pageSize+1; 
}
 

之后,在JSP页面中编写doPages.jsp专门用于分页,并且将三条数据保存到session中,用于显示在页面中;
示例代码:doPages.jsp
<%@ page language="java" import="java.util.*,s2jsp.exercise.dao.*,s2jsp.exercise.entity.*" pageEncoding="UTF-8"%>
<%
 int pageNo=1;  //当前页(起始页)为1
 //获得请求参数
 String pagaNoString = request.getParameter("pageNo");
 //请求参数不为空时,将参数赋给pageNo;
 if (pagaNoString != null)
 {
  pageNo = Integer.parseInt(pagaNoString);
 }
        //创建ProductDao方法,用于调用分页查询方法
 ProductDao pDao = new ProductDao();
 List<Product> list = pDao.getProduct(pageNo,4);  //当前页面显示的条数为4
 int pages = pDao.getPages(4);  //页数
 //向session中保存3条数据
 session.setAttribute("pageNo",pageNo);
 session.setAttribute("list",list);
 session.setAttribute("pages",pages);
 response.sendRedirect("showAllProducts.jsp");
 
%>

之后,在显示页面调用doPages.jsp页面,显示出来之后,我们用3种方式进行分页操作:
1.超链接实现分页;
示例代码:
<a href="showAllProducts.jsp?pageNo=<%=pageNo==1?1:pageNo-1 %>">上一页</a>
<a href="showAllProducts.jsp?pageNo=<%=pageNo==pages?pages:pageNo+1 %>">下一页</a>

2.按钮实现;(按钮实现与下拉列表框的实现都得依赖于一个JavaScript方法)
JavaScript示例代码:
    <script type="text/javascript">
 function dopage(page)
 {
  location.href="showAllProducts.jsp?pageNo="+page;
 }
    </script>

示例代码:
  <%if(pageNo==1){ %>
     <input type="button" value="上一页" onClick="dopage(<%=pageNo==1?1:pageNo-1%>)"    disabled="disabled"/>
     <%}else{ %>
     <input type="button" value="上一页" onClick="dopage(<%=pageNo==1?1:pageNo-1%>)"/>
  <%} %>
     <%if(pageNo==pages){ %>
     <input type="button" value="下一页" onClick="dopage(<%=pageNo==pages?pages:pageNo+1%>)"    disabled="disabled"/>
     <%}else{ %>
     <input type="button" value="下一页" onClick="dopage(<%=pageNo==pages?pages:pageNo+1%>)"/>
     <%} %>

3.下拉列表框实现;
示例代码:
<select onChange="dopage(this.value)">
<%for(int i=1;i<=pages;i++){%>
<%if(pageNo==i) {%>
<option value="<%=i %>" selected="selected"><%=i %></option>
<%}else{ %>
<option value="<%=i %>"><%=i %></option>
<%}} %>
</select>

最后,JSP分页就完成了。记住:"123原则"。

你可能感兴趣的:(分页)