- 浏览: 497249 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (250)
- concurrent (11)
- io (1)
- CI (10)
- linux (57)
- windows (2)
- java (38)
- mac (4)
- eclipse (9)
- db (13)
- python (5)
- groovy (5)
- flex (7)
- hibernate (5)
- odb (8)
- netbeans (1)
- web (31)
- book (14)
- erlang (2)
- communication (2)
- virtualization (5)
- jUnit (0)
- jsf (1)
- perl (1)
- java jax-rs (5)
- Jenkins (2)
- Jenkins Plugin (3)
- android (2)
- git (1)
- big data (0)
- 试读 (1)
最新评论
-
yzzy4793:
讲的很清楚,明白
同步synchronized方法和代码块 -
aa51513:
中文乱码式硬伤
Jersey2.x对REST请求处理流程的分析 -
feiwomoshu1991:
...
同步synchronized方法和代码块 -
marshan:
启动失败的原因是加载的类版本冲突,因此你首先要保证依赖的版本和 ...
richfaces中facelet版本升级到2时的典型错误和解决办法 -
zhaohang6688:
请问我按照你的方式修改还是报错 错误信息还是这个 是为什么啊 ...
richfaces中facelet版本升级到2时的典型错误和解决办法
richfaces提供的rich:dataTable和rich:datascroller能够很好地,自动实现数据量较小的分页业务。
如果是海量的数据,一次将数据都放入cache做翻页会产生两个突出问题。一是会急剧消耗掉server的内存,另择对数据的变化无法及时更新到页面--除非及时更新cache,但这会带来并发,性能等问题。
都查出来的对立面是只查询当页数据。当然,也可以考虑中间方案--查询相邻几页信息。
为了描述简单起见,这里不对查询相邻页策略进行讨论,只对查询当页做进一步描述。
因为rich:datascroller是对rich:dataTable数据进行智能感知的,如果只查询当页,这里建议不使用该控件。怎么实现?自己实现分页!即实现首页/末页 前页/后页的控制。
<rich:panel id="scrollerPanel1" styleClass="scrollerPanel" bodyClass="panelBody"> <h:commandButton value="First" action="#{groupsBean.swichFirstPage}" style=" border-style: none; margin-right: 5px" disabled="#{groupsBean.disabledFirst}"/> <h:commandButton value="Previous" action="#{groupsBean.swichPreviousPage}" style=" border-style: none; margin-right: 5px" disabled="#{groupsBean.disabledFirst}"/> <h:panelGroup id="pagePanel"> <h:outputText value="Page " /> <h:selectOneMenu id="pageMenu" value="#{groupsBean.pageIndex}"> <f:selectItems value="#{groupsBean.pageNumbers}" /> <a4j:support event="onchange" action="#{groupsBean.swichPage}" reRender="groupForm" /> </h:selectOneMenu> <h:outputText value=" of #{groupsBean.pageCount}" /> </h:panelGroup> <h:commandButton value="Next" action="#{groupsBean.swichNextPage}" style=" border-style: none; margin-left: 5px; margin-right: 5px" disabled="#{groupsBean.disabledLast}"/> <h:commandButton value="Last" action="#{groupsBean.swichLastPage}" style=" border-style: none" disabled="#{groupsBean.disabledLast}"/> </rich:panel>
这里的groupsBean是关联页面的java类,它的scope是request级别,jsf页面要做keepAlive声明,否则翻页无法实现。
<a4j:keepAlive beanName="groupsBean"/>
按钮是否可用的逻辑是:
disabledFirst = pageIndex == 1;
disabledLast = pageIndex == pageCount;
这个赋值需要在构造时和翻页方法中处理。
为什么使用两个变量而不是把判断写在页面里:即
disabled="#{groupsBean.disabledFirst}
改成:
disabled="#{groupsBean.pageIndex == 1}
?因为我测试过,在翻页后,如果按F5刷新页面,此时pageIndex会初始化为1,而 groupsBean是keepAlive的,即没有离开该页面时,它的值是保留的,因此逻辑会产生歧义。
每执行一次翻页,访问一次数据库。其缺点是明显的--频繁访问数据库,即产生了频繁的服务器端和数据库服务器的网络交互,数据库服务器对IO的操作。但这要根据具体业务考虑,如果是频繁更新的业务,这么处理反而简单。
执行效果如下图:
评论
这里的groupsBean是关联页面的java类,它的scope是request级别,jsf页面要做keepAlive声明,否则翻页无法实现。
这个groupsBean可以设置成page scope 代替keepAlive
1 楼 lingling7887 你看看是否问题出在这里。
<ui:composition
template="/WEB-INF/template/default.xhtml"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:s="http://jboss.com/products/seam/taglib"
xmlns:rich="http://richfaces.org/rich"
xmlns:a4j="http://richfaces.org/a4j"
xmlns:c="http://java.sun.com/jsp/jstl/core">
<ui:param name="title" value="uRecover" />
<ui:define name="body">
<h:form id="resultForm">
<fieldset class="wid_100Percent">
<h:panelGrid id="searchPanel" styleClass="wid_100Percent" columns="4" columnClasses="col_20Percent,col_30Percent,col_20Percent,col_30Percent">
<h:outputLabel for="accountNo" value="#{msg['account.account.no']}:" />
<h:inputText id="accountNo" value="#{writeOffAccountBean.searchParameters.accountNumber}" maxlength="14" />
<h:outputLabel for="fullName" value="#{msg['contact.fullname']}:" />
<h:inputText id="fullName" value="#{writeOffAccountBean.searchParameters.fullName}" maxlength="40" />
<h:outputLabel for="taxId" value="#{msg['contact.tax']}:" />
<h:inputText id="taxId" value="#{writeOffAccountBean.searchParameters.taxId}" maxlength="9" />
<h:outputLabel for="billingPhone" value="#{msg['account.billing.phone']}:" />
<h:inputText id="billingPhone" value="#{writeOffAccountBean.searchParameters.billingPhone}" maxlength="10"/>
<h:outputLabel for="address" value="#{msg['search.address']}:" />
<h:inputText id="address" value="#{writeOffAccountBean.searchParameters.address}" />
<h:outputLabel for="companyName" value="#{msg['search.company.name']}:" />
<h:inputText id="companyName" value="#{writeOffAccountBean.searchParameters.companyName}" maxlength="40" />
</h:panelGrid>
<h:panelGroup layout="block" styleClass="wid_100Percent" style="text-align: right;">
<h:commandButton value="#{msg['search']}" action="#{writeOffAccountBean.swichFirstPage}" />
</h:panelGroup>
</fieldset>
<br />
<rich:messages />
<rich:dataTable id="accountSearchResults" styleClass="wid_100Percent" rows="10" value="#{writeOffAccountBean.results}" var="result" iterationStatusVar="resultIt" rendered="#{!(empty writeOffAccountBean.results)}">
<rich:column>
<f:facet name="header">
<h:outputText value="#{msg['account.account.no']}" />
</f:facet>
<h:commandLink value="#{result.customerReferenceId}" action="viewAccount" immediate="true" />
</rich:column>
<rich:column>
<f:facet name="header">
<h:outputText value="#{msg['search.customer.name']}" />
</f:facet>
<h:outputText value="#{result.accountHolder.fullName}" rendered="#{result.accountHolder.type == 'RESIDENTIAL'}" />
<h:outputText value="#{result.accountHolder.business.name}" rendered="#{result.accountHolder.type == 'BUSINESS'}" />
</rich:column>
<rich:column>
<f:facet name="header">
<h:outputText value="#{msg['contact.tax']}" />
</f:facet>
<h:outputText value="#{result.accountHolder.socialId}" />
</rich:column>
<rich:column>
<f:facet name="header">
<h:outputText value="#{msg['account.billing.phone']}" />
</f:facet>
<h:outputText value="#{result.billingDetails.phone}" />
</rich:column>
<rich:column>
<f:facet name="header">
<h:outputText value="#{msg['account.agency.code']}" />
</f:facet>
<h:outputText value="#{result.activePlacement.levelAgency.code}" />
</rich:column>
</rich:dataTable>
<h:panelGroup id="scrollerPanel1" styleClass="scrollerPanel" bodyClass="panelBody">
<h:commandButton value="First" action="#{writeOffAccountBean.swichFirstPage}" style=" border-style: none; margin-right: 5px" disabled="#{writeOffAccountBean.disabledFirst}"/>
<a4j:commandButton value="First" action="#{writeOffAccountBean.swichFirstPage}" reRender="accountSearchResults" />
<h:commandButton value="Previous" action="#{writeOffAccountBean.swichPreviousPage}" style=" border-style: none; margin-right: 5px" disabled="#{writeOffAccountBean.disabledFirst}"/>
<h:panelGroup id="pagePanel">
<h:outputText value="Page " />
<h:selectOneMenu id="pageMenu" value="#{writeOffAccountBean.pageIndex}">
<f:selectItems value="#{writeOffAccountBean.pageNumbers}" />
<f:ajax event="change" action="#{writeOffAccountBean.swichPage}" reRender="resultForm" />
</h:selectOneMenu>
<h:outputText value=" of #{writeOffAccountBean.pageCount}" />
</h:panelGroup>
<h:commandButton value="Next" action="#{writeOffAccountBeann.swichNextPage}" style=" border-style: none; margin-left: 5px; margin-right: 5px" disabled="#{writeOffAccountBean.disabledLast}"/>
<h:commandButton value="Last" action="#{writeOffAccountBean.swichLastPage}" style=" border-style: none" disabled="#{writeOffAccountBean.disabledLast}"/>
</h:panelGroup>
</h:form>
</ui:define>
</ui:composition>
发表评论
-
Apache benchmarking
2013-11-17 16:15 1203NAME ab - Apache HTTP ser ... -
dojo 动态创建下拉菜单和输入框
2013-02-04 18:35 5986<!DOCTYPE HTML PUBLIC " ... -
动态加载css和java script
2013-01-24 18:53 2684var portalLoader = { dojo : ... -
[web architect] nginx1.2.6+ tomcat7+memcached1.2.6
2012-12-25 17:40 1329Load Balancer (Nginx) ... -
[web architect] tomcat+nginx单机
2012-12-24 18:39 990location / { ... -
Tomcat管理配置
2011-04-10 00:49 1211<?xml version='1.0' encod ... -
当前浏览器对html5的支持[狠图]
2011-01-15 03:08 4505html5是web的未来,这部巨作尚未完成,现在闪现的还只是一 ... -
richfaces中facelet版本升级到2时的典型错误和解决办法
2010-08-31 10:23 60042010-8-31 9:48:35 com.sun.faces ... -
checkbox与dataTable的完美结合
2010-02-23 17:43 11263本文介绍了richface的一种使用情况:datatable和 ... -
richface 皮肤
2010-01-07 13:36 1504一、绪 richface默认提供 ... -
RichFaces第一例
2009-12-29 14:30 1665学习JSF和RichFaces一周了,总结以一个小例子为介,分 ... -
大小写问题
2008-10-14 16:11 1245背景: 系统包括单点登录模块,存在多个数据库,有mysql和o ... -
九张图
2004-12-02 13:52 1196这些天一直在做查询页面。昨天碰到了这个:美工提供的在页面上显示 ... -
翻页的处理
2004-12-28 10:11 10821 翻页时排序:为了实 ... -
上传file前,判断上传文件的扩展名
2004-12-28 10:20 1642首先我不太确定Js能否扑捉到file的value,于是作了一个 ... -
上传文件前判空
2004-12-28 10:24 1264上传文件时如果下拉列表框或file框为空,会报错。下面就解决这 ... -
根据radio值动态显示file
2005-03-01 17:51 1266<html><head><met ... -
jsp/servlet 乱码解决小方法
2005-03-13 15:13 1324import java.io.UnsupportedEncod ... -
关于unconditional
2005-03-18 23:18 931在active状态调用destroyApp(boolean u ... -
实现转贴功能的store procedure
2005-04-05 11:59 1201数据库结构board表--论坛板块表theme表--论坛主题表 ...
相关推荐
在JavaServer Faces (JSF)框架中,分页是一种常用的技术,用于处理大量数据时提供更好的用户体验。当数据集过大,一次性加载所有记录到页面上会导致性能下降且用户界面响应变慢。通过分页,我们可以将数据分成多个...
本文将深入探讨JSF分页控件的关键知识点,以及如何实现大容量数据的可查询分页。 首先,理解JSF(JavaServer Faces)框架的基础是必要的。JSF是一种用于构建Web应用程序的Java标准,它提供了一种模型-视图-控制器...
本篇文章将深入探讨JSF中的分页组件,以及如何利用它们来实现高效的数据分页。 **1. 分页组件的基本概念** 分页组件通常由两个主要部分组成:分页导航和数据显示区。分页导航包括上一页、下一页、首页和末页等按钮...
本篇将深入探讨JSF中的分页实现。 首先,我们需要理解分页的基本概念。分页是将大量数据分为多个较小的部分,每次只加载一部分到页面上,用户可以通过导航按钮在不同页面之间切换。在JSF中,我们可以利用组件库如...
JSF(JavaServer Faces)是一种用于构建Web应用程序的Java EE框架,它简化了用户界面组件的开发和管理。在这个JSF2商品管理小项目中,我们深入探讨了如何利用JSF的核心特性来创建一个高效、功能丰富的商品管理系统。...
- **事件处理机制:** 提供了一种灵活的事件处理机制,使得开发者能够轻松地响应用户操作,并执行相应的后端逻辑。 #### 四、如何开始使用RichFaces 1. **安装配置:** 首先需要将RichFaces库添加到项目的类路径中...
该版本不仅包含了一整套的UI组件,还提供了一种叫做Ajax4jsf的框架,使得开发者可以轻松实现页面部分刷新,提升用户体验。 二、源码结构分析 1. **项目结构**:解压后的richfaces-ui-3.2.2.GA文件夹主要包含以下几...
在IT行业中,JSF(JavaServer Faces)是一种用于构建用户界面的Java EE框架,而RichFaces则是一个基于AJAX的JSF组件库,它极大地丰富了JSF的应用场景,提供了许多高级功能,如数据网格、表单处理和富用户体验。...
DateTable是Richfaces提供的一种用于展示和管理日期相关的数据表格。它不仅具有基本的表格功能,如排序、分页和筛选,还支持日期选择器和其他与日期相关的交互。DateTable可以很好地整合到JSF应用程序中,通过AJAX...
因此,文档提出了一种解决方案——在JSF框架中实现数据表控件的分页功能,以此减少服务器端资源消耗和网络传输数据量,提高客户端响应速度。 #### 三、JSF框架简介 ##### 1. JSF框架特点 - **组件为中心的UI构建*...