jsp分页技术的实现


这是我们所要的效果

但是怎么用代码实现呢,那摩让我们先来分析一下吧!


第一步分析我们做分页需要什么数据:

我们从两个方向来分析:1 页面方向,2 servlet方向

一 ,页面方向

1 当前页 currPageCode

2  总 页数 totalPage

3一页中的记录数据 datas

二,servlet方向

1 当前页 currPageCode

2  总页数 totalPage

3 每页记录数 pagesize

4 一共多少条记录 totalRecord

5 一页中的记录数据 datas

6当前页第一条记录的行数 currPageBeginIndex

7 url

哦了

那摩我们来写一个JavaBean吧

public class PageBean {
	private int cp;//当前页
	
	private int pc;//可以通过每页记录数和共多少条记录得到 (dt%md ==0 )?dt/md : dt/md+1 一共多少页
	
	private int md;//每页记录数
	
	private List pd;//页中的记录数据 
	
	private int dt;//一共多少条记录
	
	private int cd;//可以通过每页记录是*(当前页数-1) + 1得到,当前页第一条记录的行数
	
	private String url;
//为了清楚起见,我就没有粘上我的setget方法
}
嗯,有了javabean了,那摩就先让我们写一下servlet吧!

public String findAll(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		
		 /*
		  * 1 通过页面回传的当前页信息设置当前页
		  * 2 设置每页所显示的数据
		  * 3 调用servlce的findAll方法获得一共多少条记录及当前页的数据
		  * 
		  */
		 PageBean pb = new PageBean();
		 
		 if(request.getParameter("cp") != null && !request.getParameter("cp").trim().isEmpty()) {
			 int cp = Integer.parseInt(request.getParameter("cp"));
		 	 pb.setCp(cp);
		 }	
		 else {
			 pb.setCp(1);
		 }
		 pb.setMd(10);
		 pb.setPd(service.findAll(pb.getCd(),pb.getMd()));
		 pb.setDt(service.count());
		 String url = getUrl(request);
		 pb.setUrl(url);
		 request.setAttribute("pb",pb);
		 return "f:list.jsp";
	}

嗯,有了数据了,这个方法会转发找list.jsp页面中,我们来看该页的技术点


	

客户列表

客户姓名 性别 生日 手机 邮箱 描述 操作
${customer.cname } ${customer.gender } ${customer.birthday} ${customer.cellphone } ${customer.email } ${customer.description } 编辑 删除
第${requestScope.pb.cp }页/共 ${pb.pc }页 ">首页 上一页 <%-- 用来进行中间页码的显示及使用超链接所带来的的问题的解决方案 如何显示页码呢,我们其实只需要两个数据,begin和end就哦了, 我们常见的百度页面有什么特点呢,你可以去看看我就不多说了;下面我给出他的计算公式: 如果总页数<=10(列表长度),那么begin=1,end=总页数 否则 使用公式计算;begin=pc-5, end=pc + 4; 两种特殊情况: 头溢出:当begin<1时,让begin=1 尾溢出:当end>${tp}时,让end=${tp} --%> ${i } [${i }] 下一页 尾页
哦了多余的话我就不解释了,我想你看过这段代码之后会明白的吧。


那摩接下来让我们来写一个service和dao就算完事了,service我就不说了我们直接来看dao吧

public List findAll(int index,int length) {
		String sql  = "select * from t_customer limit ?,?";
		List l = null;
		Object[] p = {index,length};
		try {
			l = queryRunner.query(sql, new BeanListHandler(Customer.class),p);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return l;
	}
public int count() {
		String sql = "select count(*) from t_customer";
		Number n = null;
		try {
			n = (Number)queryRunner.query(sql, new ScalarHandler());
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return n.intValue();
	}


是滴,全部查找就是这摸简单,只要还是得利用当前行数,和每页记录数


哦了

有人会问我getUrl()方法是什么鬼,还有encoding()方法又是你妈什么?

应为我们是使用get提交的所以会造成乱码,嗯对,我们获取的customer对象他爹都不认识他,我们的encoding方法就是用来进行解码的

//这是其中的一个,其他的属性也如同
if(c.getCname() != null && !c.getCname().trim().isEmpty()) {
			byte[] b = null;
			try {
				b = c.getCname().getBytes("iso-8859-1");
			} catch (UnsupportedEncodingException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			String name=null;
			try {
				name = new String(b,"utf-8");
			} catch (UnsupportedEncodingException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			c.setCname(name);
		}


getUrl是用来获取参数路径并去除&cp参数的:

private String getUrl(HttpServletRequest request) {
		//String c = request.getContextPath();
		String q = request.getQueryString();
		String s = request.getServletPath();
		
		if(q != null && !q.trim().isEmpty()) {
			if( q.contains("&cp=")) {
				int i = q.indexOf("&cp=");
				q = q.substring(0, i);
			}
		}
		String url =  s + "?" + q;
		return url;
	}


哦了,大致的技术点我们就鸡巴说没了,让我们提升点难度,试试多条件查询:

//多条件查询的servlet方法
public String query(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		Customer customer = new Customer();
		
		try {
			BeanUtils.populate(customer,request.getParameterMap());
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		Customer c = encoding(customer);
		
		
		PageBean pb = new PageBean();
		
		 
		 if(request.getParameter("cp") != null && !request.getParameter("cp").trim().isEmpty()) {
			 int cp = Integer.parseInt(request.getParameter("cp"));
		 	 pb.setCp(cp);
		 }	
		 
		 else {
			 pb.setCp(1);
		 }
		 
		 pb.setMd(10);
		 
		 pb.setPd(service.query(customer,pb.getCd(),pb.getMd()));
		 
		 pb.setDt(service.count());
		 
		 String url = getUrl(request);
		 
		 pb.setUrl(url);
		 
		 request.setAttribute("pb",pb);
		 
		 return "f:list.jsp";
	}

多条件查询的dao
public List query(Customer customer ,int index,int length) {
		//我们将其参数放入ArrayList中
		List l = new ArrayList();
		//我们使用StringBuffer连接我们所需要的条件
		StringBuffer sql = new StringBuffer
				("select * from t_customer where 1=1 ");
		
		if(customer.getCname() != null && !customer.getCname().trim().isEmpty()) {
			sql.append("and cname=? ");
			l.add(customer.getCname());
		}
		
		if(customer.getBirthday() != null && !customer.getBirthday().trim().isEmpty()) {
			sql.append("and birthday=? ");
			l.add(customer.getBirthday());
		}
		
		if(customer.getCellphone() != null && !customer.getCellphone().trim().isEmpty()) {
			sql.append("and cellphone=? ");
			l.add(customer.getCellphone());
		}
		
		if(customer.getDescription() != null && !customer.getDescription().trim().isEmpty()) {
			sql.append("and description=? ");
			l.add(customer.getDescription());
		}
		
		if(customer.getEmail() != null && !customer.getEmail().trim().isEmpty()) {
			sql.append("and email=? ");
			l.add(customer.getEmail());
		}
		
		if(customer.getGender() != null && !customer.getGender().trim().isEmpty()) {
			sql.append("and gender=? ");
			l.add(customer.getGender());
		}
		sql.append("limit ?,?");
		l.add(index);
		l.add(length);
		
		List lc= null;
		try {
			lc = queryRunner.query(sql.toString(), new BeanListHandler(Customer.class), l.toArray());
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return lc;
	} 
  


你可能感兴趣的:(servlet&jsp)