java web复习 day15(jdbc,分页技术详解,过程)

        分页挺难的,看了两遍我都有点没搞懂,这个逻辑过程挺复杂的,算是我学这个来最大的问题了。

        下面我们分步骤来详细介绍分页技术。

(刚才准备分页代码的时候出现这么一个错误:Connection fails with "Public Key Retrieval is not allowed" for native auth,明明昨天还是好好的,今天却出现这么一个问题,于是搜索一番后,得知这个错误的意思是:不允许公开密钥检索,好吧,我把配置文件中的url后加上了allowPublicKeyRetrieval=true这么一个参数之后,立刻就好了。之后想看看错误,去掉这个参数之后居然又没错了,真是十分神奇,面向运气编程,名不虚传。)

        1.什么是分页?

        分页,就是一种美观展示大量数据的逻辑方法,在google上它是这样的:

        

        在百度上,它是这样的:

        

        但是我们今天做的,是这样的:

        

       嘿嘿,有模有样。闲话不多说,开始讲:

        (1)设计一个保存数据的Page类: 

package cn.itcast.domain;

import java.util.List;

//封装页面数据
public class Page {
	
	private List list;
	private int totalpage;  //记住总页数
	
	private int totalrecord; //页面记录总数
	private int pagesize = 1; //设置页面大小
	
	
	private int pagenum;   //代表用户想看的页
	private int startindex;  //代表用户想看的页的数据从数据库哪个地方开始取
	
	
	private int startPage;  //记住jsp页面显示的起始页码
	private int endPage;  //记往jsp页面显示的结束页码
	
	private String url;   //记住用于处理分页的servlet
	
	//构造函数
	public Page(int totalrecord,int pagenum){
		this.totalrecord = totalrecord;
		
		if(this.totalrecord%this.pagesize==0){
			this.totalpage = this.totalrecord/this.pagesize;  //如果记录总数刚好可以除尽页面大小,页面总数就是结果
		}else{
			this.totalpage = this.totalrecord/this.pagesize + 1;//如果记录总数除不尽,页面总数就是结果+1
		}
		
		this.pagenum = pagenum;  //1
		this.startindex = (this.pagenum-1)*this.pagesize; //在数据库中开始的位置为(用户想看的页-1)*页面大小
		
		
		//根据用户想看的页pagenum,算出jsp页面的起始和结束页码,这里默认显示10页
		if(this.totalpage<=10){
			this.startPage = 1;
			this.endPage = this.totalpage;
		}else{
			//如果超过10页,就调整页码,只显示10页
			this.startPage = this.pagenum -4;
			this.endPage = this.pagenum + 5;
			
			//如果经过上面计算之后开始页码小于1,则开始页面设为1
			if(this.startPage<1){
				this.startPage = 1;
				this.endPage = 10;
			}
			//如果进过上面的运算之后结束页码大于1,则结束页面设为总页面,开始为总页面-1
			if(this.endPage > this.totalpage){
				this.endPage = this.totalpage;
				this.startPage = this.totalpage-9;
			}			
		}
	}
	
	public String getUrl() {
		return url;
	}

	public void setUrl(String url) {
		this.url = url;
	}




	public int getStartPage() {
		return startPage;
	}



	public void setStartPage(int startPage) {
		this.startPage = startPage;
	}



	public int getEndPage() {
		return endPage;
	}



	public void setEndPage(int endPage) {
		this.endPage = endPage;
	}



	public List getList() {
		return list;
	}



	public void setList(List list) {
		this.list = list;
	}



	public int getTotalpage() {
		return totalpage;
	}



	public void setTotalpage(int totalpage) {
		this.totalpage = totalpage;
	}



	public int getTotalrecord() {
		return totalrecord;
	}



	public void setTotalrecord(int totalrecord) {
		this.totalrecord = totalrecord;
	}



	public int getPagesize() {
		return pagesize;
	}



	public void setPagesize(int pagesize) {
		this.pagesize = pagesize;
	}



	public int getPagenum() {
		return pagenum;
	}



	public void setPagenum(int pagenum) {
		this.pagenum = pagenum;
	}



	public int getStartindex() {
		return startindex;
	}



	public void setStartindex(int startindex) {
		this.startindex = startindex;
	}
	
}

(2)在dao中编写对应方法

//获取分页数据
		public List<Customer> getPageData(int startindex,int pagesize){
			Connection conn = null;
			PreparedStatement st = null;
			ResultSet rs = null;
			try{
				conn = JdbcUtils.getConnection();
				String sql = "select * from customer limit ?,?";
				st = conn.prepareStatement(sql);
				st.setInt(1, startindex);
				st.setInt(2, pagesize);
				
				rs = st.executeQuery();
				List list = new ArrayList();
				while(rs.next()){
					Customer c = new Customer();
					c.setBirthday(rs.getDate("birthday"));
					c.setCellphone(rs.getString("cellphone"));
					c.setDescription(rs.getString("description"));
					c.setEmail(rs.getString("email"));
					c.setGender(rs.getString("gender"));
					c.setId(rs.getString("id"));
					c.setName(rs.getString("name"));
					c.setPreference(rs.getString("preference"));
					c.setType(rs.getString("type"));
					list.add(c);
				}
				
				return list;
			}catch (Exception e) {
				throw new DaoException(e);
			}finally{
				JdbcUtils.release(conn, st, rs);
			}
		}
		
		//得到总记录数
		public int getTotalrecord(){
			Connection conn = null;
			PreparedStatement st = null;
			ResultSet rs = null;
			try{
				conn = JdbcUtils.getConnection();
				String sql = "select count(*) from customer";
				st = conn.prepareStatement(sql);
				rs = st.executeQuery();
				if(rs.next()){
					return rs.getInt(1);
				}
				return 0;
			}catch (Exception e) {
				throw new DaoException(e);
			}finally{
				JdbcUtils.release(conn, st, rs);
			}
		}

(3)在service中调用该方法:

public Page getPageData(String pagenum,String url){
		
		int totalrecord = dao.getTotalrecord();
		
		if(pagenum==null){
			//代表用户想看第一页的数据
			Page page = new Page(totalrecord,1);  //算出了总页数,以及用户想看的页从数据库哪个地方开始取
			List list = dao.getPageData(page.getStartindex(), page.getPagesize());
			page.setList(list);
			page.setUrl(url);
			return page;
		}else{
			//代表用户想看指定的页
			Page page = new Page(totalrecord,Integer.parseInt(pagenum)); 
			List list = dao.getPageData(page.getStartindex(), page.getPagesize());
			page.setList(list);
			page.setUrl(url);
			return page;
		}
	}

(4)做出UIservlet转发到jsp

package cn.itcast.web.controller;

import java.io.IOException;


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 cn.itcast.domain.Page;
import cn.itcast.service.impl.BusinessService;

/**
 * Servlet implementation class ListCustomerServlet
 */
@WebServlet(urlPatterns="/servlet/ListCustomerServlet")
public class ListCustomerServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
    public ListCustomerServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		try{
			String pagenum = request.getParameter("pagenum");
			BusinessService service = new BusinessService();
			//获取servlet名称,切分
			String[] servletNames = this.getServletName().split("\\.");
			//制作url
			Page page = service.getPageData(pagenum,request.getContextPath() + "/servlet/" + servletNames[4]);
			request.setAttribute("page", page);
			request.getRequestDispatcher("/WEB-INF/jsp/listcustomer.jsp").forward(request, response);
			
		}catch (Exception e) {
			e.printStackTrace();
			request.setAttribute("message", "查询失败!!!");
			request.getRequestDispatcher("/message.jsp").forward(request, response);
			
		}
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

(5)做出Jsp展示数据:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core"  prefix="c"%>
<%@taglib uri="/WEB-INF/itcast.tld" prefix="itcast" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>显示所有用户</title>
  </head>
  
  <body style="text-align: center;">
 
    <table border="1"   width="90%" frame="border">
    	<tr>
    		<td>客户姓名</td>
    		<td>性别</td>
    		<td>生日</td>
    		<td>手机号码</td>
    		<td>邮箱</td>
    		<td>爱好</td>
    		<td>类型</td>
    		<td>备注</td>
    		<td>操作</td>
    	</tr>
    	
    	<c:forEach var="c" items="${page.list}">
    		<tr>
	    		<td><c:out value="${c.name }" escapeXml="true"/></td>
	    		<td><c:out value="${c.gender }" escapeXml="true"/></td>
	    		<td><c:out value="${c.birthday }" escapeXml="true"/></td>
	    		<td><c:out value="${c.cellphone }" escapeXml="true"/></td>
	    		<td><c:out value="${c.email }" escapeXml="true"/></td>
	    		<td><c:out value="${itcast:subString(c.preference,10)}" escapeXml="true"/></td>
	    		<td><c:out value="${c.type }" escapeXml="true"/></td>
	    		<td><c:out value="${itcast:subString(c.description,10)}" escapeXml="true"/></td>
	    		
	    		<td>
	    			<a href="${pageContext.request.contextPath }/servlet/UpdateCustomerUIServlet?id=${c.id }">修改</a>
	    			<a href="javascript:dodelete('${c.id }')">删除</a>
	    			
	    			
	    		</td>
    		</tr>
    	</c:forEach>
    
    </table>
    
     <br/>
   	<%@include file="/public/page.jsp" %>
   	
    <script type="text/javascript">
  	function dodelete(id)
  	{
  		var b = window.confirm("您确认删除吗??");
  		if(b){
  			window.location.href="${pageContext.request.contextPath }/servlet/DeleteCustomerServlet?id=" + id;
  		}
  	}
  </script>
  </body>
</html>

其中,${itcast:subString(String,int)}为一个自定义函数,用于将过长的文本省略展示,以造成页面的美观,展示效果为:


tld文件为:

<?xml version="1.0" encoding="UTF-8" ?>

<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
    version="2.0">
    
    <description>A tag library exercising SimpleTag handlers.</description>
    <tlib-version>1.0</tlib-version>
    <short-name>SimpleTagLibrary</short-name>
    <uri>/itcast</uri>
    
    <function>
        <name>subString</name>
		<function-class>cn.itcast.web.el.ElUtils</function-class>
		<function-signature>java.lang.String subString( java.lang.String,java.lang.Integer )</function-signature>
    </function>
</taglib>

ELUtils设计为:

package cn.itcast.web.el;

public class ElUtils {
	
	public static String subString(String source,Integer length){
		
		if(source.length()>length){
			return source.substring(0,length) + ".......";
		}
		return source;
	}
	
}
这就是分页技术详细过程啦,随便转载!(逃

猜你喜欢

转载自blog.csdn.net/sinat_35087646/article/details/80079197