关于分页标签

问题:什么是分页,为什么使用分页?
		分页就是将数据以多页去展示,使用分页可以提高客户的感受。
		
	分页分类:
		1.物理分页
			只从数据库中查询出当前页的数据。
			优点:不占用很多内存
			缺点:效率比较低
		2.逻辑分页
			从数据库中将所有记录查询出业,存储到内存中,要想展示当前页
			数据,直接从内存中获取。
			优点:效率高
			缺点:占用内存比较高
			
		在java开发领域,我们使用的比较多的是物理分页。
			物理分页的实现:
			
				1.直接使用jdbc完成
					使用滚动结果集.  优点:跨数据库。缺点:性能低。
				2.使用数据库本身提供的分页操作.
					会使用每一个数据库特定的分页函数,优点:性能高  缺点:不能跨数据库。
					
					mysql:limit
					sqlservlet:top
					oracle:rownum
					
		介绍limit使用.
			select * from 表 limit m,n;
			m:代表的是从第几条开始  注意:它是从0开始记录.
			n:代表查询几条记录.
			
			示例:分页音,每页显示6条,要查询第2页的数据.
				
				select * from 表  limit  (页码-1)*每页条数,每页条数;
				
	------------------------------------------------------------------------------
	分页分析:
		1.页码  默认第一页  
		2.每页条数   人为定义
		3.总条数   select count(*) from 表
		4.总页数    总页数=总条数%每页条数==0?总条数/每页条数:总条数/每页条数+1
					总页数=Math.ceil(总条数*1.0/每页条数);
					
		5.当前页的数据  List<?>----->select * from 表  limit  (页码-1)*每页条数,每页条数;	

	----------------------------------------------------------------------------------		
	分页代码实现:
		
		1.在success.jsp页面上
				<a href="${pageContext.request.contextPath}/findAllByPage">查看所有客户信息(分页展示)</a><br>
		
		2.创建CustomerFindAllByPageServlet完成分页
				
				问题:要向页面携带的数据有很多,不仅是要展示的数据,例如:页码,总页数等,都需要携带到页面上,怎样处理?
					解决方案:可以创建一个分页Bean,在这个Bean中封装所有关于分页相关的数据.
					
		3.在showCustomerByPage.jsp页面上添加
				<a href="/day20_1/findAllByPage?pageNum=1">首页</a>   
						
				<a href="/day20_1/findAllByPage?pageNum=${pb.pageNum-1}">上一页</a>   
				
				<a href="/day20_1/findAllByPage?pageNum=${pb.pageNum+1 }">下一页</a>   
				
				<a href="/day20_1/findAllByPage?pageNum=${pb.totalPage }">尾页</a>   
				
			在CustomerFindAllByPageServlet中处理请求参数 pageNum
				int pageNum = 1;
				String _pageNum = request.getParameter("pageNum");
				if (_pageNum != null) {
					pageNum = Integer.parseInt(_pageNum);
				}
			
			问题:怎样控制上一页,下一页。
				条件判断就可以解决.
				<c:if test="${pb.pageNum==1}">
					上一页   
				</c:if>
				<c:if test="${pb.pageNum!=1}">
					<a href="/day20_1/findAllByPage?pageNum=${pb.pageNum-1}">上一页</a>   
				</c:if>
				
				<c:if test="${pb.pageNum==pb.totalPage}">
					下一页   
				</c:if>
				<c:if test="${pb.pageNum!=pb.totalPage}">
					<a href="/day20_1/findAllByPage?pageNum=${pb.pageNum+1 }">下一页</a>   
				</c:if>
	--------------------------------------------------------------------
	分页扩展:
		1.设定每页显示条数			
			1.在showCustomerByPage.jsp页面上添加一个<select>
						<select name="currentPage" οnchange="changeCurrentPage(this.value);">
							<option>--请选择每页条数--</option>
							<option value="5">5</option>
							<option value="10">10</option>
							<option value="20">20</option>
						</select>
						
					function changeCurrentPage(value){		
						location.href="/day20_1/findAllByPage?currentPage="+value;
					};	
			
			2.在首页,上一页,下一页,尾页的连接上也要添加每页显示条数。
				例如:
				<a href="/day20_1/findAllByPage?pageNum=1¤tPage=${pb.currentPage}">首页</a>
				
		------------------------------------
		2.关于页码显示
			
			<c:forEach begin="1" end="${pb.totalPage}" var="n" step="1">
				<a href="/day20_1/findAllByPage?pageNum=${n}¤tPage=${pb.currentPage}">第${n}页</a>  
			</c:forEach>
			
			问题:如果页码比较多怎样处理?
				可以限定页码数,例如:前5后4。
				
				这样做,页面的判断条件比较多,可以使用自定义标签。
				
				可以在自定义标签中通过java代码来解决判断操作。如果直接在页面上,使用<c:if>代码太乱。
tld配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.1" xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd">
	<tlib-version>1.0</tlib-version>
	<short-name>my</short-name>
	<uri>http://www.itcast.cn/tag</uri>

	<tag>
		<name>sex</name><!-- 标签名称 -->
		<tag-class>cn.itcast.customer.tag.GenderTag</tag-class><!-- 标签类 -->
		<body-content>empty</body-content><!-- 标签体中内容 -->

		<attribute>
			<name>gender</name> <!-- 属性名称 -->
			<required>true</required> <!-- 属性必须有 -->
			<rtexprvalue>true</rtexprvalue><!-- 属性值可以接收el表达式 -->
		</attribute>
	</tag>


	<!-- 分页标签 -->
	<tag>
		<name>page</name>
		<tag-class>cn.itcast.customer.tag.PageTag</tag-class>
		<body-content>empty</body-content>
		<attribute>
			<name>pb</name>
			<required>true</required> <!-- 属性必须有 -->
			<rtexprvalue>true</rtexprvalue><!-- 属性值可以接收el表达式 -->
		</attribute>
	</tag>
</taglib>

package cn.itcast.customer.tag;

import java.io.IOException;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;

public class GenderTag extends SimpleTagSupport {

	private String gender;

	public String getGender() {
		return gender;
	}

	public void setGender(String gender) {
		this.gender = gender;
	}

	@Override
	public void doTag() throws JspException, IOException {

		StringBuffer buff = new StringBuffer();

		if ("男".equals(gender)) {
			buff.append("<input type='radio' name='gender' value='男' checked='checked'>男<input type='radio' name='gender' value='女'>女<br>");
		} else {
			buff.append("<input type='radio' name='gender' value='男'>男<input type='radio' name='gender' value='女' checked='checked'>女<br>");
		}

		this.getJspContext().getOut().write(buff.toString());

	}
}

package cn.itcast.customer.tag;

import java.io.IOException;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;

import cn.itcast.customer.domain.PageBean;

public class PageTag extends SimpleTagSupport {

	private PageBean pb;

	public PageBean getPb() {
		return pb;
	}

	public void setPb(PageBean pb) {
		this.pb = pb;
	}

	@Override
	public void doTag() throws JspException, IOException {
		StringBuffer buff = new StringBuffer();
		int totalPage = pb.getTotalPage();
		int pageNum = pb.getPageNum(); // 当前页码
		if (pageNum - 5 >= 0) {
			for (int i = pageNum-5; i < pageNum+4; i++) {

				if (i + 1 == pb.getPageNum()) {
					buff.append("<a href='页面跳转路径?pageNum="
							+ (i + 1) + "¤tPage=" + pb.getCurrentPage()
							+ "'><font color='green'>" + (i + 1)
							+ "</font></a>  ");
				} else {

					buff.append("<a href='页面跳转路径?pageNum="
							+ (i + 1) + "¤tPage=" + pb.getCurrentPage()
							+ "'>" + (i + 1) + "</a>  ");
				}
			}

		} else if (pageNum - 5 < 0) {

			for (int i = 0; i < pageNum; i++) {

				if (i + 1 == pb.getPageNum()) {
					buff.append("<a href='页面跳转路径?pageNum="
							+ (i + 1) + "¤tPage=" + pb.getCurrentPage()
							+ "'><font color='green'>" + (i + 1)
							+ "</font></a>  ");
				} else {

					buff.append("<a href='页面跳转路径?pageNum="
							+ (i + 1) + "¤tPage=" + pb.getCurrentPage()
							+ "'>" + (i + 1) + "</a>  ");
				}
			}

			for (int i = pageNum; i < (pageNum + 4); i++) {

				if (i + 1 == pb.getPageNum()) {
					buff.append("<a href='页面跳转路径?pageNum="
							+ (i + 1) + "¤tPage=" + pb.getCurrentPage()
							+ "'><font color='green'>" + (i + 1)
							+ "</font></a>  ");
				} else {

					buff.append("<a href='页面跳转路径?pageNum="
							+ (i + 1) + "¤tPage=" + pb.getCurrentPage()
							+ "'>" + (i + 1) + "</a>  ");
				}
			}
		}

		this.getJspContext().getOut().write(buff.toString());

	}
}

页面直接写:
<my:page pb="${pb}" />




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值