网页开发离不开分页,分页如何实现呢
-
可以看一下百度的分页有什么功能
-
上一页、下一页、10页按钮、一页显示10条信息
定义一个 PageResult类专门返回分页所需信息##
public class PageResult {
//满足条件的总记录数
private int count;
//当前页数
private int pageNo;
//每页显示的条数
private int pageSize;
//总页数
private int pageCount;
//内容
private uLt reslts;
//get和set方法省了
}
看看数据库提供了什么分页功能
SELECT * FROM user ORDER BY userId ASC limit 1,10
这表示从第一个开始,一共有十个。看见数据库提供的功能,可以更清楚的写页面分页
写一个分页的方法传入第几页,和一页显示多少条,
可以根据第几页和每页条数知道开始的第几条(PageNo-1)*pageSize
public List<User> getUserListPage(int PageNo, int pageSize) {
List<User> users =new ArrayList<User>();
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = DBConnectionUtil.CreateConnection();
String sql = "SELECT * FROM user ORDER BY userId ASC limit ?,?";
ps = conn.prepareStatement(sql);
ps.setInt(1,(PageNo-1)*pageSize);
ps.setInt(2,pageSize);
rs = ps.executeQuery();
while (rs.next()) {
User user = new User();
user.setUserId(rs.getInt("userid"));
user.setUsername(rs.getString("username"));
user.setPassword(rs.getString("password"));
users.add(user);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
DBConnectionUtil.closeAll(rs, ps, conn);
}
return users;
}
- 后台的分页就实现了,可以写个测试类调用分页方法看看是否存在错误 无误后,开始向页面传值了。
- 写个分页信息显示的Servlet的 我们写了个PageResult现在可以用起来了
- 一开始加载页面是肯定没有传值所有默认开始为1,每页10条 把值都赋给PageResult
- 注意总页数是总条数除以每页数,有余数进一
@WebServlet(name = "UsersServlet",urlPatterns = {"/userPage"})
public class UsersServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
int pageNo =1;
int pageSize =10;
String pageNoStr =request.getParameter("pageNO");
String pageSizeStr =request.getParameter("pageSize");
if(pageNoStr!=null){
pageNo=Integer.valueOf(pageNoStr);
}
if(pageSizeStr!=null){
pageSize=Integer.parseInt(pageSizeStr);
}
UserService userService =new UserServiceImpl();
List<User> users =userService.getUserListPage(pageNo,pageSize);
int count =userService.getUsersCount();
PageResult pageResult =new PageResult();
pageResult.setPageNo(pageNo);
pageResult.setPageSize(pageSize);
pageResult.setResults(users);
pageResult.setCount(count);
if (count%pageSize!=0){
pageResult.setPageCount(count/pageSize);
}else {
pageResult.setPageCount(count/pageSize+1);
}
response.setCharacterEncoding("UTF-8");
System.out.println(pageResult);
request.setAttribute("pageResult",pageResult);
try {
request.getRequestDispatcher("/users.jsp").forward(request,response);
} catch (ServletException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
数据都传输到页面了,现在需要页面处理数据
-
对PageResult中。Results遍历得到页面信息 Index.index 只能显示页面条数序号,全部信息的序号要加上前面的总条数
${(pageResult.pageNo-1)*pageResult.pageSize+index.index}###下面的分页操作需要一些逻辑,和代码拼接 ###
如果页数很多会显示不全,所有我们只取10个页码
页码的内容是变化的
上一页和下一页就比较简单的可以实现了参数上加一,减一 -
开始页数int start =pageNO-5<= 0?1:pageNO-5;
-
结束页数 int end= start+10大于pageCount? start+10: pageCount;
<table>
<tr>
<td>序号</td>
<td>username</td>
<td>password</td>
</tr>
<c:forEach var="user" items="${pageResult.results}" varStatus="index">
<tr>
<td>${(pageResult.pageNo-1)*pageResult.pageSize+index.index}</td>
<td>${user.username}</td>
<td>${user.password}</td>
</tr>
</c:forEach>
</table>
<%
PageResult pageResult = (PageResult) request.getAttribute("pageResult");
int pageNO =pageResult.getPageNo();
int pageCount =pageResult.getPageCount();
int start =pageNO-5<= 0?1:pageNO-5;
int end= start+10<pageCount? start+10: pageCount;
if(pageNO >1){
%>
<a href="userPage?pageNO=1">首页</a>
<a href="userPage?pageNO=<%=pageNO-1%>">上一页</a>
<%
}
for(int i=start;i<end;i++){
%>
<a style="color:<%=(i==pageNO?"red":"")%>" href="userPage?pageNO=<%=i%>">第<%=i%>页</a>
<%
}
if(pageNO<pageCount){
%>
<a href="userPage?pageNO=<%=pageNO+1%>">上一页</a>
<a href="userPage?pageNO=<%=pageCount%>">首页</a>
<%
}
%>
<form action="userPage">
第<input type="text"name="pageNO" value="${pageResult.pageNo}">页
<input type="submit" value="确定">
</form>
一共有<span>${pageResult.count}</span>
###归根结底分页功能的实现逻辑上很简单,后端把分页信息封装在一个对象中,把对象给前端,前端处理信息显示并个分页按钮herf赋上url+页码参数 点击再次请求服务器就可以了 ###