`
zengbo0710
  • 浏览: 415351 次
社区版块
存档分类
最新评论

关于分页,标签,缓存

阅读更多
keyword:分页 缓存 eXtremeTable oscache
引子:这几天在弄一个关于页面的分页,查了一下网上的资料,大都不合要求,要么就是说怎么在数据库这个层面上如何实现,晕,有了hibernate我用那么费劲翻身么.看到一个用的比较多的方案是做了一个Page工具类,实现诸如getBooks(),getNextPage(),看了一下底层实现居然是"select * from book",吓死偶了,要是有1千万条记录那不是要吐血啊,这哪叫分页啊,这该叫杀人不见血啊. 一气之下在jbuilder下建了一个项目就叫Page  :)

好了,言归正传,本文主要说的是关于在展示层一些常用的方案和实现,目录如下:
  • 手工实现分页
  • 用eXtremeTable标签实现自动分页
  • 用oscache缓存jsp,提高性能
第一.自己实现一个工具类PageBean完成所有分页工作.

本分页实现概览:Struts + hibernate
PageBean负责两部分内容,一是要在页面显示的业务信息,是一个ArrayList;另一个是逻辑控制信息,诸如是否有下一页,上一页等等.
PageBean代码如下:
<!---->public class PageBean {
  
int currentPage = 1;//当前页:Action控制
  int totalPages = 0;//总页数 :自己运算
  int pageRecorders = 5//每页记录数,默认为5,可以在初始化的时候修改//总数据数
  int pageStartRow = 0//每页的起始数
  int pageEndRow = 0//每页显示数据的终止数
  boolean hasNextPage = false//是否有下一页:自己运算
  boolean hasPreviousPage = false//是否有前一页 :自己运算
  List objList = new ArrayList();//存放欲展示的对象列表
  int totalRows;//总记录数,由底层service提供

  
//是否有上一页
  public boolean isHasPreviousPage() {
    
return (currentPage > 1?true:false );
  }

  
//共有多少页,service只提供有多少条记录,多少页数由PageBean自己运算
  public int getTotalPages() {
    
return (totalRows/pageRecorders ==0?totalRows/pageRecorders:totalRows/pageRecorders+1);
  }

  
public int getCurrentPage() {
    
return currentPage;
  }

  
public int getPageEndRow() {
    
return pageEndRow;
  }

  
//是否有下一页
  public boolean isHasNextPage() {
    
return (currentPage < this.getTotalPages() ? true:false);
  }

  
public int getTotalRows() {
    
return totalRows;
  }

  
public int getPageStartRow() {
    
return pageStartRow;
  }

  
public int getPageRecorders() {
    
return pageRecorders;
  }

  
public void setObjList(List objList) {
    
this.objList = objList;
  }

  
public void setHasPreviousPage(boolean hasPreviousPage) {
    
this.hasPreviousPage = hasPreviousPage;
  }

  
public void setTotalPages(int totalPages) {
    
this.totalPages = totalPages;
  }

  
public void setCurrentPage(int currentPage) {
    
this.currentPage = currentPage;
  }

  
public void setPageEndRow(int pageEndRow) {
    
this.pageEndRow = pageEndRow;
  }

  
public void setHasNextPage(boolean hasNextPage) {
    
this.hasNextPage = hasNextPage;
  }

  
public void setTotalRows(int totalRows) {
    
this.totalRows = totalRows;
  }

  
public void setPageStartRow(int pageStartRow) {
    
this.pageStartRow = pageStartRow;
  }

  
public void setPageRecorders(int pageRecorders) {
    
this.pageRecorders = pageRecorders;
  }

  
public List getObjList() {
    
return objList;
  }

  
public PageBean() {}


  
public void description() {

    String description 
= "共有数据数:" + this.getTotalRows() +

        
"共有页数: " + this.getTotalPages() +

        
"当前页数为:" + this.getCurrentPage() +

        
" 是否有前一页: " + this.isHasPreviousPage() +

        
" 是否有下一页:" + this.isHasNextPage() +

        
" 开始行数:" + this.getPageStartRow() +

        
" 终止行数:" + this.getPageEndRow();

    System.out.println(description);
  }
}

注意,我没有在PageBean里放具体的业务逻辑,诸如getBooks()等,目的很简单,具有通用性,业务逻辑由另一个业务类实现BookService,BookService获得的业务数据都放在了PageBean的ArrayList里.

BookService代码如下:
<!---->public class BookService {
  
private static Logger log = Logger.getLogger(BookService.class.getName());
  
public BookService() {
  }

  
/**
   * 获得book列表
   * 
@param pageBean PageBean:返回的对象存在pageBean里
   
*/
  
public static void getBooks(PageBean pageBean) {
    String infoSql 
= "from Book";//获得业务信息
    String countSql = "select count(*) from Book";//获得控制信息
    Session session = null;
    
try {
      session 
= DBUtil.currentSession();
      Query query 
= session.createQuery(infoSql);
      query.setFirstResult((pageBean.getCurrentPage()
-1)* pageBean.getPageRecorders());//起始页
      query.setMaxResults(pageBean.getPageRecorders());//每页记录数
      pageBean.getObjList().clear();
      
for (Iterator it = query.iterate(); it.hasNext(); ) {
        Book po 
= (Book)it.next();
        BookVo vo 
= new BookVo();
        BeanUtils.copyProperties(vo,po);
        pageBean.getObjList().add(vo);
      }
      session 
= DBUtil.currentSession();
      query 
= session.createQuery(countSql);
      
int totalRecords = ((Integer)query.list().get(0)).intValue();
      pageBean.setTotalRows(totalRecords);
    }
    
catch (Exception e) {
      e.printStackTrace();
      System.out.println(
"数据库异常" + e.toString());
    }
    
finally {
      
try {
        
if (null != session) {
          session.close();
        }
      }
      
catch (HibernateException ex) {
        ex.printStackTrace();
      }
    }

  }


}

在Struts的Action中调用service,返回一个PageBean给展示页面
Action代码如下:
<!----> 1 public class PageListAction extends Action {
 2 
 3   public PageListAction() {}
 4 
 5   ArrayList arrayList = new ArrayList();
 6 
 7   public ActionForward execute(ActionMapping mapping,ActionForm form,HttpServletRequest request,HttpServletResponse response) throws Exception {
 8     String action;
 9     PageBean pageBean = null;
10     action = request.getParameter("action");
11     if(action == null || action.equals("null")) { //第一次读取数据
12       pageBean = new PageBean();
13     } else {//用户选择上一页或者下一页
14       if(action == "nextPage" || action.equals("nextPage")) {
15         pageBean = (PageBean)request.getSession().getAttribute("pageBean");
16         pageBean.setCurrentPage(pageBean.getCurrentPage()+1);
17       }else if(action == "previousPage" || action.equals("previousPage")) {
18         pageBean = (PageBean)request.getSession().getAttribute("pageBean");
19         pageBean.setCurrentPage(pageBean.getCurrentPage()-1);
20       }else if(action == "targetPage" || action.equals("targetPage")){//指定页
21         pageBean = (PageBean)request.getSession().getAttribute("pageBean");
22         System.out.println("targetPage=" + request.getParameter("targetPage"));
23         //这里根据需要可以对填写的目标页进行判断,不要大于最大页数[此处省略]
24         pageBean.setCurrentPage(Integer.parseInt(request.getParameter("targetPage")));
25       }
26     }
27     if(null == pageBean) throw new Exception("获得PageBean异常");
28     BookService service = new BookService();
29     service.getBooks(pageBean);
30     pageBean.description();
31     request.getSession().setAttribute("pageBean",pageBean);
32     request.setAttribute("result",pageBean.getObjList());
33     return(mapping.findForward("success"));
34   }
35 }

在本Action中判断了可能出现的三种情况:
  1. 用户选择了"上一页"
  2. 用户选择了"下一页"
  3. 用户手工输入了指定的某一页
这里有点感觉不爽的是必须hard coding,但是不这么做感觉暂时也想不出什么好的办法来,毕竟一个PageBean不可能封装所有的细节,如果你有更好的方式请指点哦 :)

好了,到了我们呼之欲出的展示页面了 :)
show.jsp代码如下
<!----><%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<%@ page contentType="text/html; charset=gb2312" language="java"%>

<html:html locale="true">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
  
<script language="javaScript">
    
function go(){
      
try{
      
var targetValue = document.getElementById("targetPage").value;
      parseInt(targetValue);
      alert(targetValue);
      }
catch(e){
        alert(
"请正确填写目标页");
        
return;
      }
      
if(targetValue == null || targetValue == ''){
        alert(
"请填写目标页");
        
return;
      }
      window.location 
= "//pageList.do?action=targetPage&targetPage="+targetValue;
    }
  
</script>
</head>
<body>
<logic:present name="pageBean">
  共有数据总数
<bean:write name="pageBean" property="totalRows"/>;
共分
<bean:write name="pageBean" property="totalPages"/>页,
当前是第
<bean:write name="pageBean" property="currentPage"/>
</logic:present>
<table border="1">
<tr><th>书名</th><th>作者</th><th>价格</th></tr>
    
<logic:present name="result">
        
<logic:iterate id="book" name="result">
        
<logic:present name="book">
        
<tr>
           
<td><bean:write name="book" property="name" /></td>
           
<td> <bean:write name="book" property="author" /></td>
           
<td><bean:write name="book" property="price" /></td>
        
/tr>
        
</logic:present>
        
</logic:iterate>
    
</logic:present>
</table>
<logic:present name="pageBean">
<logic:equal name="pageBean" property="hasNextPage" value="true">
    
<html:link page="/pageList.do?action=nextPage">nextPage</html:link>
</logic:equal>
<logic:equal name="pageBean" property="hasPreviousPage" value="true">
    
<html:link page="/pageList.do?action=previousPage">PreviousPage</html:link>
</logic:equal>
<input type="text" name
分享到:
评论

相关推荐

    实用java分页标签

    Java分页标签是Java Web开发中的一个重要概念,它主要用于处理大量数据的展示,尤其是在数据库查询结果需要在网页上以多页形式呈现时。这个技术可以让用户更方便地浏览和导航大量的信息,而不会一次性加载所有数据...

    jsp-web开发通用分页标签

    本教程将详细讲解如何使用JSP(JavaServer Pages)技术来实现一个通用的分页标签,以便在各种项目中复用。 首先,JSP是Java平台上的动态网页技术,它允许开发人员在HTML或者XML文档中嵌入Java代码。在分页场景下,...

    java自定义分页标签

    在Java开发中,自定义分页标签是一种常见的需求,它能帮助我们构建用户友好的界面,使得大量数据的展示变得更加高效和便捷。本教程将详细讲解如何创建和使用自定义分页标签,以及如何实现淘宝购物分页标签的样式。 ...

    基于struts2 自定义标签 分页

    在这个基于Struts2的自定义分页标签的实践中,我们将深入探讨如何创建、配置和使用自定义标签来实现数据的分页展示,同时与Oracle数据库进行交互。 首先,理解分页的基本概念至关重要。分页是将大量数据分成小块,...

    自定义分页标签 Java

    自定义分页标签是指开发者根据项目需求创建的个性化分页组件,它能够灵活地与后端数据库交互,实现数据的分页展示。本文将深入探讨如何在Java环境中自定义分页标签,以及涉及到的相关技术点。 首先,我们需要理解...

    很不错的自定义分页标签

    在Java Web开发中,分页是常见的功能,用于处理大量...以上就是关于“很不错的自定义分页标签”的详细解释,希望对你有所帮助。在实践中,你可以根据具体需求进行调整和优化,打造出满足自己项目需求的高效分页组件。

    自定义分页标签源代码

    自定义分页标签可以进一步优化,例如增加缓存支持,提高性能;或者添加更多参数,支持动态调整每页大小,以及实现跳转到任意页的功能。此外,也可以考虑使其兼容其他视图技术,如Thymeleaf或FreeMarker。 综上所述...

    如何操作cookie,分页标签

    最后,关于自定义分页标签,它通常用于在网页上显示分页链接,允许用户浏览大量数据的多个页面。分页标签可能包含如当前页、总页数、每页条目数等属性,并且可以扩展以支持跳转、页码范围显示等功能。创建这样一个...

    这是一个自定义分页标签

    5. **优化性能**:为了提高性能,自定义分页标签通常会包含缓存策略,避免每次请求都执行完整的数据库查询。此外,还可以通过预计算总页数、只查询需要的数据等方式进一步优化。 在Oracle中,我们使用ROWNUM配合子...

    java+jdbc分页标签

    Java和JDBC分页标签是Java Web开发中用于实现数据分页显示的一种高效方法。在大型Web应用中,为了提高用户体验并减少服务器负担,通常会采用分页技术来展示大量数据,而不是一次性加载所有记录。Java JDBC分页标签...

    Struts+Hibernate分页标签

    在处理大量数据时,为了提高用户体验,通常会采用分页显示数据,这就是所谓的"Struts+Hibernate分页标签"。在这个场景下,我们将深入探讨如何在Struts2框架中使用自定义标签来实现与Hibernate的整合,完成数据的分页...

    Struts2自定义分页标签

    Struts2自定义分页标签是Java Web开发中一种高效且灵活的页面数据展示方法,尤其在处理大数据量时非常实用。Struts2框架提供了一种内置的分页支持,但有时开发人员需要根据项目需求定制更符合业务逻辑的分页功能。本...

    通用的分页标签实现分页的列子

    本实例将详细讲解如何通过SSH(Spring、Struts和Hibernate)框架来实现一个通用的分页标签。 首先,SSH框架是Java Web开发中的经典组合,Spring提供了依赖注入和事务管理,Struts负责MVC架构,而Hibernate则是持久...

    自定义标签分页

    在本例中,"fenyeTag"可能是自定义分页标签库的名字,用于在JSP页面上展示分页链接。 要实现自定义标签,你需要遵循以下步骤: 1. **创建TLD文件**:TLD(Tag Library Descriptor)文件定义了自定义标签的行为、...

    JSP分页标签

    **JSP分页标签**是Web开发中一种简化页面分页功能实现的工具。在传统的JSP开发中,分页通常需要编写大量的Java代码和HTML混合的JSP代码,这不仅使得代码复杂,而且不易维护。为了克服这个问题,开发者创建了自定义的...

    jsp java分页标签

    本文将深入探讨如何在JSP中实现Java分页标签,以及与之相关的源码和工具。 首先,让我们了解什么是分页。分页是将大量数据分割成较小、易管理的部分,用户可以逐页浏览,而不是一次性加载所有数据。这有助于提高...

    jsp分页标签JPage(HOT)

    `jsp分页标签JPage`是一个在Java Web开发中常见的自定义标签库,用于实现页面数据的分页展示。在这个项目中,作者提供了两种不同的分页样式:一种是基础的“上一页”和“下一页”的切换,另一种则是模仿百度搜索结果...

    struts自制标签分页封装

    在分页标签中,我们需要考虑参数如当前页、总页数、每页显示条数等。 3. **模型驱动**:在 Struts 框架中,可以使用模型驱动的方式来处理分页。模型对象包含了关于数据分页的信息,如总记录数、当前页数等。通过...

    Struts2中实现自定义分页标签 --功能扩充

    本篇文章将探讨如何在Struts2中实现自定义分页标签,这是一项非常实用的功能,尤其对于处理大量数据展示时,能显著提高用户体验。我们将深入源码,了解其工作原理,并提供一个自定义分页标签的实现过程。 首先,...

Global site tag (gtag.js) - Google Analytics