首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Web前端 >

(Spring&Hibernate )Spring & Hibernate的整合分页有关问题之二:代码解析和逻辑关系

2012-10-25 
(Spring&Hibernate )Spring & Hibernate的整合分页问题之二:代码解析和逻辑关系总所周知,JavaEE软件开发三

(Spring&Hibernate )Spring & Hibernate的整合分页问题之二:代码解析和逻辑关系

总所周知,JavaEE软件开发三层构架分别是:显示层(JSP页面/html页面/aspx页面),业务逻辑层(Servlet/Action),数据访问层(DAO).三层构架之间的逻辑关系和数据流构成了软件的基本内容。此部分主要研究在Spring&Hibernate的整合分页中之间的数据流和逻辑跳转的关系;

?

业务介绍:由添加产品直接跳转到所有产品的显示页面(add.jsp---Sumbit--->add.action---redirect--->list.action--->list.jsp)...在这里,我们关注的是(list.action--->list.jsp)

?

1:显示层,在这里我们是用JSP页面做为显示并引用S-Tag。

?

2:业务逻辑层,由add.action重定向到list.action。这次逻辑跳转很明显没有数据流通过add.jsp页面传到业务层面。

?

3:数据访问层,list.action访问数据库的数据。如list.action的代码所显示:从数据中获取数据的总条数:

this.buygoodsDao.getRows()           //从数据库中获取数据的总条数

?获取一个Pager对象pager (获取这个对象的作用是什么了?接下来会给详细的解释),此出Class PagerService,这里的paperService作用是为了获取一个Pager的对象(作用访问页面的数据,在动态的通过一个对象实现页面的传递)

this.pager = this.pageService.getPager(this.getCurrentPage(), this.getPagerMethod(), Integer.parseInt(this.getTotalRows()));

这里我们来看Class Pager(点击查看代码),Paper中有很多类似于javabean中的get&set方法(在这里的作用无非是实现数据流的作用),另外还有构造方法public Pager(int _totalRows) {}(在这里的作用是获取第一页得数据源),public void first() {}等方法(在这里的作用是控制currentPages的数据变化);

?

this.setCurrentPage(String.valueOf(pager.getCurrentPage()));//this.setTotalPages(String.valueOf(pager.getTotalPages()));this.setBuygoods(this.buygoodsDao.getPageAllBuyGoods(pager.getPageSize(),pager.getStartRow()));

?

?4:数据显示(显示层)。将从数据库中获取的数据传到JSP以实现显示的功能。

????? 在这里,值得注意的是" 由于这是第一次作用于list.action,并没有jsp页面到业务逻辑层面的数据的传递"。

public String list(){this.setTotalRows(String.valueOf(this.buygoodsDao.getRows()));System.out.println("A获取的TotalRows="+this.getTotalRows());System.out.println("A获取的CurrentPage="+this.getCurrentPage());System.out.println("A获取的PagerMethod="+this.getPagerMethod());this.pager = this.pageService.getPager(this.getCurrentPage(), this.getPagerMethod(), Integer.parseInt(this.getTotalRows()));System.out.println(this.getTotalRows());System.out.println("B获取的TotalRows="+this.getTotalRows());System.out.println("B获取的CurrentPage="+this.getCurrentPage());System.out.println("B获取的PagerMethod="+this.getPagerMethod());this.setCurrentPage(String.valueOf(pager.getCurrentPage()));//this.setTotalPages(String.valueOf(pager.getTotalPages()));this.setBuygoods(this.buygoodsDao.getPageAllBuyGoods(pager.getPageSize(),pager.getStartRow()));}return "success";}

?输出的结果是:

??? (在这里pager这个对象通过get&set的方法传到了list.jsp上)

A获取的TotalRows=33A获取的CurrentPage=nullA获取的PagerMethod=nullB获取的TotalRows=33B获取的CurrentPage=nullB获取的PagerMethod=null

??由上面的结果可以看的出 CurrentPage PagerMethod并不是从页面取得的,这就是为上面在PagerService中要判断这两个数据是不是空值的原因。new 一个Pager的对象;

Pager pager = new Pager(totalRows);

转到Pager上,Pager有一个含参数的构造方法,确定了第一页。

public Pager(int _totalRows) {totalRows = _totalRows;totalPages=totalRows/pageSize;int mod=totalRows%pageSize;if(mod>0){totalPages++;}currentPage = 1;startRow = 0;}

此时赋值了的currentPage 传到list.jsp上。

?

看看jsp中的代码,中的属性元素:totalRows;currentPage;pager;

<td colspan="7">    共<s:property value="totalRows"/>行&nbsp;    第<s:property value="currentPage"/>页&nbsp;    共<s:property value="pager.getTotalPages()"/>页&nbsp;    <a href="<s:url value="listBuyGoods.action">    <s:param name="currentPage" value="currentPage"/>    <s:param name="pagerMethod" value="'first'"/>    </s:url>">首页</a>        <a href="<s:url value="listBuyGoods.action">    <s:param name="currentPage" value="currentPage"/>    <s:param name="pagerMethod" value="'previous'"/>    </s:url>">上一页</a>        <a href="<s:url value="listBuyGoods.action">    <s:param name="currentPage" value="currentPage"/>    <s:param name="pagerMethod" value="'next'"/>    </s:url>">下一页</a>        <a href="<s:url value="listBuyGoods.action">    <s:param name="currentPage" value="currentPage"/>    <s:param name="pagerMethod" value="'last'"/>    </s:url>">尾页</a>    </td>

?疑问一:为什么一下三个的取值的方法不同?

共<s:property value="totalRows"/>行&nbsp;第<s:property value="currentPage"/>页&nbsp;共<s:property value="pager.getTotalPages()"/>页&nbsp;

?疑问二:Pager的对象pager有totalRows;currentPage这两个属性,同时也增加了set&get的方法;

?

?共<s:property value="pager.getTotalRows()"/>行&nbsp;?第<s:property value="pager.getCurrentPage()"/>页&nbsp;?共<s:property value="pager.getTotalPages()"/>页&nbsp;

?这样的取值方式可以吗? 操作证明,这种方法也是可以去到值的...

?

疑问三:为什么在Action中要把CurrentPage set出去?不是通过Pager这个对象可以去到....

this.setCurrentPage(String.valueOf(pager.getCurrentPage()));

?

带着三个疑问回到list.action中...我们会发现一下代码:

this.pager = this.pageService.getPager(this.getCurrentPage(), this.getPagerMethod(), Integer.parseInt(this.getTotalRows()));

?

CurrentPage PagerMethod这两个属相的值是用页面获取的到,通过pageService.getPager()方法返回一个pager的对象。再通过这个对象在页面上取值。当CurrentPage PagerMethod为空的时候,就是第一次得初始值。

?

这个情况是程序这样设计的关键....第一次初始值的需要

?

在分页中,往往是在页面上点击“首页,前一页,后一页,尾页”按键触发一个事件,这时将触发的数据传到servlet中,通过pageService获取一个对象pager,通过pager控制数据的变化,最后通过servet将数据传出去。

?

假设一:如果action中的这段程序截掉......

this.setCurrentPage(String.valueOf(pager.getCurrentPage()));

?那么“首页,前一页,后一页,尾页”将会失效...因为currentpage将取不到值

?

假设二:在假设一的基础上,将程序改成这样:

<a href="<s:url value="listBuyGoods.action"><s:param name="currentPage" value="pager.getCurrentPage()"/><s:param name="pagerMethod" value="'first'"/></s:url>">首页</a>

?这样程序仍然为正确。

?

这里就设计到程序的优化问题....可惜小弟还没学...哈哈

?

?

?

热点排行