JavaWeb-在会一会【分页】
话说:
各位读者,晚上好!
好久不见!真的不愿意间隔了这么久才动笔,如果今天再不发表博客,就不能原谅自己。笔者在10.14号博客《JavaWeb-News-分页》博客中用对象的方式写了分页,没记错的话,那时候实现的分页还是有小bug。这次直接用在Servlet中实现分页,页面显示方式参考百度分页,这次效果很满意。(当然倾向于功能,没有美化)。
目标:
Servlet中直接实现分页
难度系数:★☆☆☆☆
建议用时:30min 实际用时2H
目录:
一、效果图
二、Servlet
三、页面(重点)
四、总结
五、下期预告
开发工具:Eclipse
一、效果图
页面非常粗糙,如果加上美化,效果会非常好。
首页,每页显示10条数据
中间页,当前页不是超链接。
末页
二、Servlet
这里直接调用底层方法,查处数据。为便于分页,可以在新增数据的时候,调用Servlet本身,可产生大量数据。
TextListServlet
package com.hmc.controller;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.hmc.dao.UserDaoImpl;
import com.hmc.pojo.ListShow;
/**
*
*2017年12月26日
*User:Meice
*下午9:14:17
*/
public class TextListServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.接收参数
/**
* 分页5要素:
* 1)pageIndex 当前页
* 2)startIndex 从第几条数据开始
* 3)countAll 总条目数
* 4)pageSize 每页大小
* 5)pageCount 总共多少页
*/
int pageIndex;
int startIndex;
int countAll;
int pageSize = 10;
int pageCount;
//当前页
String pageIndexStr = req.getParameter("pageIndex");
if(pageIndexStr!=null && !pageIndexStr.equals("")) {
pageIndex = Integer.parseInt(pageIndexStr);
}else {
pageIndex = 1;
}
System.out.println("当前页:"+pageIndex);
//总条目数
countAll = new UserDaoImpl().getCountAll();
System.out.println("总页数:"+countAll);
//总页数
pageCount = (int)Math.ceil(((double)countAll/pageSize));
// 从哪页的数据开始显示(当前页-1)*2;
startIndex = (pageIndex-1)*pageSize;
System.out.println("偏移量:"+startIndex);
//2.调用方法
String sql = "select a.textId, a.title,a.userNick,b.replyCount,a.textTime from (select t.textId,t.title,u.userNick,t.textTime from text t inner join user u on t.userId = u.userId)a left join (select t.title,count(replyId) replyCount from reply r inner join text t on r.textId = t.textId inner join user u on r.userId = u.userId group by title) b on a.title = b.title order by a.textId limit ?,?";
Object[] params = {startIndex,pageSize};
List<ListShow> list =(List<ListShow>)new UserDaoImpl().textShowSearch(sql, params);
//3.页面跳转
req.setAttribute("list", list);
req.setAttribute("pageCount", pageCount);
req.setAttribute("pageIndex", pageIndex);
req.setAttribute("pageCount", pageCount);
req.setAttribute("pageSize", pageSize);
req.getRequestDispatcher("TextList.jsp").forward(req, resp);
}
}
有了Servlet,当然少不了配置web.xml
<!--=============================首页显示的TextListServlet==============================-->
<servlet>
<servlet-name>listServlet</servlet-name>
<servlet-class>com.hmc.controller.TextListServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>listServlet</servlet-name>
<url-pattern>/pageList</url-pattern>
</servlet-mapping>
三、页面
TextList
<%@page import="com.hmc.util.getStringToIntUtil"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!--Author:Meice 2017年12月26日下午9:23:43 -->
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>帖子分页</title>
<script type="text/javascript">
function skipToPage() {
}
</script>
<%-- <%
String skipPageStr = request.getParameter("skip");
System.out.print("选择框内容:"+skipPageStr);
int skipPage = getStringToIntUtil.getInt(skipPageStr);
%> --%>
</head>
<body>
<table border="1" width="90%" align="center">
<thead>
<tr>
<th>帖子标题</th>
<th>发帖人</th>
<th>回复数量</th>
<th>发帖时间</th>
</tr>
</thead>
<tbody>
<c:forEach var="ListShow" items="${list}">
<tr>
<td>${ListShow.title}</td>
<td>${ListShow.userNick}</td>
<td>${ListShow.replyCount}</td>
<td>${ListShow.textTime}</td>
</tr>
</c:forEach>
<tr>
<td colspan="4" align="center">
<c:if test="${pageIndex>1 }">
<a href="pageList?pageIndex=1">首页</a>
<a href="pageList?pageIndex=${pageIndex-1}">上一页</a>
</c:if>
<!--开头10页 -->
<c:if test="${pageIndex<=10 }">
<c:forEach begin="1" end="10" var="i">
<c:if test="${pageIndex==i}">
${i}
</c:if>
<c:if test="${pageIndex!=i}">
<a href="pageList?pageIndex=${i}">${i}</a>
</c:if>
</c:forEach>
</c:if>
<!--中间部分 -->
<c:if test="${pageIndex>10 &&pageIndex<pageCount-(pageSize-1)}">
<c:forEach begin="${pageIndex-4 }" end="${pageIndex+5}" var="i">
<c:if test="${pageIndex==i}">
${i}
</c:if>
<c:if test="${pageIndex!=i}">
<a href="pageList?pageIndex=${i}">${i}</a>
</c:if>
</c:forEach>
</c:if>
<!--最后10页-->
<c:if test="${pageIndex>=pageCount-(pageSize-1)}">
<c:forEach begin="${pageCount-(pageSize-1)}" end="${pageCount }" var="i">
<c:if test="${pageIndex==i }">
${i}
</c:if>
<c:if test="${pageIndex!=i }">
<a href="pageList?pageIndex=${i}">${i}</a>
</c:if>
</c:forEach>
</c:if>
<c:if test="${pageIndex<pageCount}">
<a href="pageList?pageIndex=${pageIndex+1}">下一页</a>
<a href="pageList?pageIndex=${pageCount}">末页</a>
</c:if>
${pageIndex}/${pageCount}
<!--跳转页面 -->
<form action="pageList" method="get">
<select name="pageIndex">
<option value="15" selected>15</option>
<option >20</option>
<option >30</option>
</select>
<input type="submit" value="跳转">
</form>
</td>
</tr>
</tbody>
</table>
</body>
</html>
四、总结
1、分页的核心在五要素:
pageIndex——当前页
countAll——总条目数
pageSize——每页显示数量,limit的第二个?号
pageAll——总页数
startPage——limit的起始查询值,第一个?号
;
2、页面处理核心在于处理好第一页、中间页面、尾部页面;整体逻辑是:第一页我们写固定,最后一页也写固定,中间按照每页大小灵活变动;
3、控制好实现效果,用好以下标签即可,需要先导入JSTL包。
<c:forEach var="" items="${传过来的值}"></c:forEach>
<c:forEach begin="" end="" var=""></c:forEach>
<c:if text="满足条件表达式"></c:if>
熟悉这三个,分页就可以搞定。
五、下期预告
最近分身乏术,没有精力推进企业门户网项目,暂且搁置,一旦有空,就是更新这个。
好了,晚安!下期再会!17年即将过去,冬至到了,春天真的不远了。
上一篇: 机器学习及项目实战
推荐阅读