读书人

分页的至极

发布时间: 2012-08-09 15:59:21 作者: rapoo

分页的极致

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了。
















读书人网 >Web前端

热点推荐