分页的极致package cn.itcast.servletday13.business.webimport java.io.IOExceptionimport java.io.Pri
分页的极致
package cn.itcast.servletday13.business.web;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.omg.CosNaming.NamingContextExtPackage.StringNameHelper;import cn.itcast.servletday13.business.domain.PageBean;import cn.itcast.servletday13.business.domain.PageInfo;import cn.itcast.servletday13.business.manager.PageManager;public class PageListServlet extends HttpServlet {/** * The doGet method of the servlet. <br> * * This method is called when a form has its tag value method equals to get. * * @param request the request send by the client to the server * @param response the response send by the server to the client * @throws ServletException if an error occurred * @throws IOException if an error occurred */public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//这就是MVC,不直接访问通过servelt访问,并且在访问时间把一些东西也转发过去 。PageManager pageManager = new PageManager();PageInfo pageInfo = new PageInfo();String pid = request.getParameter("pid");int currentPage = 1;try {currentPage = Integer.parseInt(pid);} catch (Exception e) {// TODO: handle exception}String pSize = request.getParameter("psize");int pageSize = 10 ;//每页显示默认为10。try {pageSize = Integer.parseInt(pSize);} catch (Exception e) {// TODO: handle exception}pageInfo.setCurrentPage(currentPage);pageInfo.setPageSize(pageSize);System.out.println(pageInfo.getCurrentPage());System.out.println(pageInfo.getPageSize());//写代码先写核心,把最主要的写上,其它都是慢慢添加。下面三句是MVC中最核心的。PageBean pageBean = pageManager.getCurrentPage(pageInfo);request.setAttribute("pageBean",pageBean);request.getRequestDispatcher("/WEB-INF/pageList.jsp").forward(request, response);}}
分页步骤:
根据MVC设计模式 将页面记录放在一个javabean对象里面
javabean对象里面的属性则根据页面显示的效果进行设置
谁来创建javabean对象呢?
大的方面来说是servlet创建的javabean对象,小的方面来说
javabean对象是由servlet调用别的模块,通常是service/manger来
创建的.
dao层专门用来处理数据库
业务逻辑层:service/manager层是dao层的上一层,一般传递参数
给dao层
在该分页案例里:
PageManager的输入和输出:
PageManager使用PageInfo(参数对象)对象输出PageBean对象
PageDao层通过SQL语句查询出结果,把查询出的结果输出到
QueryResult对象里.
1.先创建
web,business,business.domain,business.manger,business.dao
几个包
2.在business.domain中创建PageBean.java 完成这个类
根据页面的属性设置PageBean的属性。
PageBean的属性有当前页面数currentPage,总页面数totalPages
,总记录数totalRecoreds,单位页面记录数pageSize,上一页
previousPage,下一页nextPage,是否是第一页firstPage,是否是
最后一页lastPage,页码条数组pageBar,页面记录的集合beanList
完善各个属性对应的setter和getter方法
【】发现问题:当前页面和传入的页面可能发生错误,如只有10页,
却传入了20页,这时就应该把currentPage放在manager里进行处理
.又发现上一页和下一页不需要定义这个属性,可以直接在
getPreviousPage()里设定.
getPageBar()方法:
先设置一个final类型的static的常量PAGEBARSIZE,
定义数组开始时的数字:int startPage = (currentPage-
1)/PAGEBARSIZE*PAGEBARSIZE+1;
定义数组结束时的数字:int endPage = (currentPage-
1)/PAGEBARSIZE*PAGEBARSIZE+PAGEBARSIZE;
再判断endPage
if(endPage>getTotalPages()){
endPage = getTotalPages();
}
再补充这个数组
int[] pageBar = new int[endPage-startPage+1];
3.在business.manager中创建PageManager.java类 完成这个类
pageManager类要返回一个pageBean对象,要想返回pageBean对
象,就得传入一个pageInfo对象,用getCurrentPage(pageInfo
info)方法获得pageBean对象.
所以先在business.manager里创建pageInfo类。
pageInfo类的属性就是传入的当前页面currentPage和单位页面记录
数pageSize.
完成getCurrentPage()方法,需要在方法内部调用一个dao处理数据
库,所以创建一个PageDao类.
在pageDao里设置一个getPageQueryResult()方法,得到结果集
queryResult对象。
注意:把queryResult类设计在dao包里面。里面存放记录总数
totalRecords和记录集合beanList.
我的错误:DAO层要写正确
connection =
JdbcUtils.getConnection();//得到连接
String sql = "select count(*) from
page";
statement =
connection.prepareStatement(sql);//让连接去预编译
rs = statement.executeQuery
();//让状态执行。
根据MVC思想,先访问一个serlvet,然后把该传的数据在这里给它
传进去。
应该把数据放在一个bean里面传进去,那么如何获取这个bean就是
自己要
写的,在页面上用的也这个bean里面的数据。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0
Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
这是HTML新规范,这样才能支持更多的。
<style type="text/css">
.odd{background-color: #f3c3f3}
.even{background-color: #c3f3c3}
tr:hover{background-color: #888}
</style>
<script type="text/javascript">
function gotoPage(pid){
var psize =
document.getElementById("psize").value;
window.location.href="${pageContext.request.contextPath}/
servlet/PageListServlet?pid="+pid+"&psize="+psize;
}
</script>
<c:forEach items="${pageBean.beanList}" var="page"
varStatus="status">
<tr class="${status.count%
2==1?'odd':'even'}">
<td>
${page.id}
</td>
<td>
${page.name}
</td>
</tr>
</c:forEach>
html中表格的本质就一个格一个格的,而不是我们看到的表格,
如果我们设置为border=1,那么其实它的表格宽度就是2了。