Oracle+JSP+Servlet实现的数据分页展示

版权声明:转载请标明出处,否则会依法追究其责任 https://blog.csdn.net/qq_41204714/article/details/82693711

前言

在做任何事情之前,我们都应该清楚的知道这件事是什么以及我们为什么做这件事,分页也不例外,我们在分页之前首要要知道什么是分页?还要知道为什么要去进行分页?我们只有弄清楚了这两个问题,才能去讨论如何实现分页。

首先,说一下什么是分页以及为什么进行分页(这两个概念放在一起讲最合适)?

在我的认知里,分页正如字面上的意思,分成一页一页,我们从小到大应该都接触过书籍,没有哪一本书籍是放在一页上的吧,当然文章内容少一页就可以放完的除外,我们发现:文章的内容,都是分成一页一页去展示,而我们都是一页一页去阅读内容。现实生活中如此,在数据库中也是如此,当我们遇到一个容量大的数据库(比如几十个G的容量),如果要一下子从数据库中取到所有数据,暂且不考虑服务器端的压力问题,取出来的几百万,几千万条量的数据在页面这显示都成了问题。而且在淘宝或者京东这些购物平台上,一般用户的选择大部分不会超出数据库中数据的前100,条数据,但淘宝、京东这些电商数据库的内容只有紧紧100条吗,不,他们的数据库更大,只不过对于用户的需求,前100条数据就可以完全满足。读到了这里,我想大家应该明白数据库分页的必要了吧,下面来看如何在Oracle数据库中实现分页,并且在JSP页面中去得到显示出来。

Servlet页面

@WebServlet("/EmpServlet")
public class EmpServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	private EmpService es = new EmpServiceImpl();
       
    public EmpServlet() {
        super();
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//默认起始页为第一页
                int pageIndex = 1;
		String pageStr = request.getParameter("page");
		if(pageStr != null){
			pageIndex = Integer.parseInt(pageStr);
		}
		
		//获得总页码
		int maxPage = es.getTotalPage();
		//获得员工列表
		List<Emp> emps = es.getEmpByPage(pageIndex);

		request.setAttribute("emps", emps);
		request.setAttribute("page", pageIndex);
		request.setAttribute("maxPage", maxPage);
		request.getRequestDispatcher("emps.jsp").forward(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}

在servlet中,设置一个起始页(为第一页),然后获得提交过来的参数:本业的页码。通过预先写的service层等到数据库中数据的最大页码数和本业页码的数据,将数据设置为request属性并转发交给emps主页面进行显示。

jsp页面

<table border="1">
		<caption>员工列表</caption>
		<tr>
			<td>编号</td>
			<td>姓名</td>
			<td>职位</td>
			<td>上级编号</td>
			<td>入职日期</td>
			<td>工资</td>
			<td>奖金</td>
			<td>部门编号</td>
			<td colspan="2">操作</td>
		</tr>
		<c:forEach items="${emps }" var="emp">
			<tr>
			<td>${emp.empNo }</td>
			<td>${emp.empName }</td>
			<td>${emp.job }</td>
			<td>${emp.mgr }</td>
			<td>${emp.hiredate }</td>
			<td>${emp.sal }</td>
			<td>${emp.comm }</td>
			<td>${emp.deptNo }</td>
			<td><button>修改</button></td>
			<td><button>删除</button></td>
		</tr>
		</c:forEach>
	</table>
	
	<c:url var="first" value="EmpServlet">
		<c:param name="page" value="1"></c:param>
	</c:url>
	<c:url var="forward" value="EmpServlet">
		<c:param name="page" value="${page-1 }"></c:param>
	</c:url>
	<c:url var="next" value="EmpServlet">
		<c:param name="page" value="${page+1 }"></c:param>
	</c:url>
	<c:url var="end" value="EmpServlet">
		<c:param name="page" value="${maxPage }"></c:param>
	</c:url>
	<c:if test="${page>1 }">
	<a href="${first }">首页</a>
	<a href="${forward }">上一页</a>
	</c:if>
	<c:if test="${page<maxPage }">
	<a href="${next }">下一页</a>
	<a href="${end }">末页</a>
	</c:if>

在JSP页面里,通过servlert里面设置的属性可以得到本业页码、总页码、本业页码数据这三个信息,进而通过JSTL表达式的C标签进行相应的数据读取和判断,比如foreach进行数据的读取,通过url设置页码的超链接,通过if来来判断是否为第一页或者最后一页,若为第一页的话,设置首页和上一页不显示,相应的为最后一页时,下一页和末页不进行显示。

Oracle中的分页

--首先得到EMP表中所有的数据,通过工资字段sal进行排序
SELECT E.* FROM EMP E ORDER BY SAL DESC
--为上查询出的表添加ROWNUM字段
SELECT ED.*, ROWNUM RN FROM (SELECT E.* FROM EMP E ORDER BY SAL DESC) ED
--固化ROWNUM字段,并判断取第几页
SELECT *
  FROM (SELECT ED.*, ROWNUM RN
          FROM (SELECT T.* FROM EMP T  WHERE 1 = 1 ORDER BY SAL DESC) ED)
 WHERE RN >= 1
   AND RN <= 5

数据库分页一般分为三步骤进行:

第一步、查询出字段并进行相应的排序。

第二步、为上述查出的表添加ROWNUM字段。

第三步、固化ROWNUM,并进行分页查询。

上述三步骤如果不进行排序的话可以将第一步和第二步进行合并,那样两步就可以完成分页查询,ROWNUM进行的排序,前面为(page-1)*pageSize-1,后面为page*pageSize。

综上,完成了对数据库数据的分页查询和显示,水平有限,如有地方写的有错误,欢迎留言指出。

猜你喜欢

转载自blog.csdn.net/qq_41204714/article/details/82693711
今日推荐