- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我知道这里有很多关于 JSF 分页的帖子,但没有一个让我满意。
要将相当大的数据拆分成页面,我将使用 RichFaces Data 滚动组件。
它似乎适合这种情况,但它看起来像是“人工”分页。
我不喜欢这里的是它加载所有数据,然后只显示其中的一部分。至少它似乎是这样做的。如果我错了纠正我。
丰富的面孔有很好的演示,但由于某种原因,他们跳过了 bean 定义——只有 xhtml。
我看到有人提到了 ExtendedDataModel,但我发现的唯一例子并没有给我留下深刻印象。
为什么我应该有 5 个屏幕代码只显示数据的子集?
老实说,像分页这样简单的问题在 JSF 中碰巧非常复杂,我真的不明白为什么。
所以我的问题是:
1. Richfaces 可以只加载一页数据吗
2.不将其存储到 session 中(我的意思是实际数据未列出状态-当前页面等)
我只对 Richfaces lib 感兴趣,因为我已经在我的项目中使用了它,并且不知道要引入对其他东西的依赖
提前谢谢
最佳答案
在 RichFaces 论坛上讨论后,提出了以下解决方案(感谢 Brendan Healey):
RichLazyDataModel.java
/**
* Extended data model
* @author Brendan Healey
*/
public abstract class RichLazyDataModel<T> extends ExtendedDataModel<T> {
private SequenceRange cachedRange;
private Integer cachedRowCount;
private List<T> cachedList;
private Object rowKey;
public abstract List<T> getDataList(int firstRow, int numRows);
public abstract Object getKey(T t);
public abstract int getTotalCount();
@Override
public void walk(FacesContext ctx, DataVisitor dv, Range range, Object argument) {
SequenceRange sr = (SequenceRange) range;
if (cachedList == null || !equalRanges(cachedRange, sr)) {
cachedList = getDataList(sr.getFirstRow(), sr.getRows());
cachedRange = sr;
}
for (T t : cachedList) {
if (getKey(t) == null) {
/*
* the 2nd param is used to build the client id of the table
* row, i.e. mytable:234:inputname, so don't let it be null.
*/
throw new IllegalStateException("found null key");
}
dv.process(ctx, getKey(t), argument);
}
}
/*
* The rowKey is the id from getKey, presumably obtained from
* dv.process(...).
*/
@Override
public void setRowKey(Object rowKey) {
this.rowKey = rowKey;
}
@Override
public Object getRowKey() {
return rowKey;
}
@Override
public boolean isRowAvailable() {
return (getRowData() != null);
}
@Override
public int getRowCount() {
if (cachedRowCount == null) {
cachedRowCount = getTotalCount();
}
return cachedRowCount;
}
@Override
public T getRowData() {
for (T t : cachedList) {
if (getKey(t).equals(this.getRowKey())) {
return t;
}
}
return null;
}
protected static boolean equalRanges(SequenceRange range1, SequenceRange range2) {
if (range1 == null || range2 == null) {
return range1 == null && range2 == null;
} else {
return range1.getFirstRow() == range2.getFirstRow() && range1.getRows() == range2.getRows();
}
}
/*
* get/setRowIndex are used when doing multiple select in an
* extendedDataTable, apparently. Not tested. Actually, the get method is
* used when using iterationStatusVar="it" & #{it.index}.
*/
@Override
public int getRowIndex() {
if (cachedList != null) {
ListIterator<T> it = cachedList.listIterator();
while (it.hasNext()) {
T t = it.next();
if (getKey(t).equals(this.getRowKey())) {
return it.previousIndex() + cachedRange.getFirstRow();
}
}
}
return -1;
}
@Override
public void setRowIndex(int rowIndex) {
int upperBound = cachedRange.getFirstRow() + cachedRange.getRows();
if (rowIndex >= cachedRange.getFirstRow() && rowIndex < upperBound) {
int index = rowIndex % cachedRange.getRows();
T t = cachedList.get(index);
setRowKey(getKey(t));
}
}
@Override
public Object getWrappedData() {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void setWrappedData(Object data) {
throw new UnsupportedOperationException("Not supported yet.");
}
public List<T> getCachedList() {
return cachedList;
}
/**
* Holds list state
*/
public class ListState implements Serializable {
private int page;
private Map<String, Serializable> searchCriteria = new HashMap<String, Serializable>();
public int getPage() {
return page;
}
public void setPage(int page) {
this.page = page;
}
public Map<String,Serializable> getSearchCriteria() {
return searchCriteria;
}
@ManagedBean(name="cardsBean")
public class CardsBean {
@ManagedProperty("#{cardService}")
private CardService cardService;
private ListState state;
private RichLazyDataModel<Card> cardsModel = new RichLazyDataModel<Card>() {
@Override
public List<Card> getDataList(int firstRow, int numRows) {
MyUserDetails user = SecurityUtils.getCurrentUser();
return cardService.findUserCards(user.getUser(), firstRow, numRows, state.getSearchCriteria());
}
@Override
public Object getKey(Card card) {
return card.getId();
}
@Override
public int getTotalCount() {
MyUserDetails user = SecurityUtils.getCurrentUser();
return cardService.countUserCards(user.getUser(), state.getSearchCriteria());
}
};
public RichLazyDataModel<Card> getCards() {
return cardsModel;
}
public String getSearchString() {
return (String)state.getSearchCriteria().get("searchString");
}
public int getCurrentPage() {
return state.getPage();
}
public void setCurrentPage(int page) {
state.setPage(page);
}
public void setSearchString(String searchString) {
state.getSearchCriteria().put("searchString", searchString);
}
public void setCardService(CardService cardService) {
this.cardService = cardService;
}
public boolean isPinned() {
return Boolean.TRUE.equals(state.getSearchCriteria().get("pinned"));
}
public void setPinned(boolean pinned) {
state.getSearchCriteria().put("pinned", pinned);
}
public void togglePinned() {
setPinned(!isPinned());
}
@PostConstruct
public void init() {
state = getFromSession("cardsList", null);
if (state == null) {
state = new ListState();
storeInSession("cardsList", state);
}
}
public <T extends Serializable> T getFromSession(String name, T defaultValue) {
T ret = (T) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get(name);
if (ret == null) {
ret = defaultValue;
}
return ret;
}
public void storeInSession(String name, Serializable obj) {
FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put(name, obj);
}
}
...
<h:form>
<rich:dataGrid value="#{cardsBean.cards}" var="card" columns="2" elements="20" first="#{cardsBean.currentPage}" style="margin:0 auto;width:70em" id="cardsTable">
<f:facet name="header">
<h:inputText value="#{cardsBean.searchString}">
<a4j:ajax event="keyup" render="cardsTable@body, cardsTable@footer">
<a4j:attachQueue requestDelay="700" ignoreDupResponses="true" />
</a4j:ajax>
</h:inputText>
</f:facet>
<rich:panel id="cd">
<ui:include src="WEB-INF/parts/card.xhtml">
<ui:param name="card" value="#{card}"/>
</ui:include>
</rich:panel>
<f:facet name="footer">
<rich:dataScroller page="#{cardsBean.currentPage}" />
</f:facet>
</rich:dataGrid>
</h:form>
...
关于JSF、RichFaces、分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11937660/
非常简单: }" ajaxSingle="true"> 那显然是无效的EL。我以这种方式有条件地显示 myModelPanel 的最简洁方法是什么? 谢谢 IA 最佳
我正在尝试使用 simple demo来自 richfaces progressBar 页面。 当我转到页面时,它呈现开始按钮,按下按钮后进度条显示为 0% - 而不是计数到 100 显示 -1 就是
我目前正在处理一个项目,我想将其从 3.3.3.Final 版本迁移到 RichFaces 4。我想知道... 在迁移之前有什么我应该考虑、了解或考虑的重要事项吗? (可能是一个愚蠢的问题,但是...
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
很抱歉问题标题,但我想不出更好的标题。 我正在使用 JSF 2.0 (MyFaces 2.0.2) 并将 RichFaces 4 (4.0.0.20101004-M3) 添加到我的项目中。我找到了一个
我们正在从 RichFaces 3.3.3 升级到 RichFaces 4.2.0。似乎元素 css 类名称已更改,但我找不到新旧名称之间的任何映射。我们的元素中有很多用于丰富组件的自定义 css 规
什么是limitToList在 JSF 中,RichFaces?它在 RichFaces 4.x 中被删除了吗?是 limitToList和 limitRender一样吗? 最佳答案 limitRen
我尝试运行 RichFaces 4.3.1 Final 的 richfaces-showcase。当我按照 readme.txt 的指示执行命令“mvn clean package”时,出现 Mave
我正在将 JSF 2 和 richfaces 3.3.3 用于托管在 tomcat 6.0.20 上的应用程序。一旦通过浏览器(Mozilla 和 IE)发出请求,应用程序就会崩溃。 我的 web.x
最近我尝试将我的应用程序从 RF-4.1.0.Final 升级到 RF-4.3.2.Final。 我使用的应用服务器是Tomcat-7,项目是使用Maven构建的。 我遇到的一些问题: 1.在Rich
我正在将 JSF 1.2 升级到 JSF 2.x。在这个过程中,我想将应用程序中的每个页面都一个一个地升级。我已经设置了每个依赖项和配置。 RichFaces 4.x 和 PrimeFaces 3.5
简单的 JSF1.2 和 Jboss Server 5.0 工作正常,但添加 Richfaces 3.X JAR 后出现错误。我的应用程序无法运行。 Richfaces jar richfaces-a
好的,这里有点奇怪,我没有看到任何其他报告,最近我们有一些IE11用户报告了UI错误,经过一些测试之后,我意识到执行reRender(我正在使用A4J)后IE11正在放HTML元素放置在错误的位置,例
我的问题是让 RichFaces 日历限制允许选择的日期 由用户。 假设我只想允许用户选择本月的日期和下个月的日期。 我使用了 preloadDateRangeStart 和 preloadDateR
我知道这里有很多关于 JSF 分页的帖子,但没有一个让我满意。 要将相当大的数据拆分成页面,我将使用 RichFaces Data 滚动组件。 它似乎适合这种情况,但它看起来像是“人工”分页。 我不喜
我有一个 h:inputText 和一个 rich:fileUpload。我希望 inputText 在单击时调用 fileUpload。我该怎么做呢?现在,我有这个:
您能告诉我如何找出我正在运行的 Richfaces 版本吗? 我需要知道我是否已经安装了 jQuery,所以也许一种测试方法也可以作为答案。 我正在使用 JBOSS Developer Studio
我有: 我创建了一个具有以下值的组合框: - 测试 - 示例 - 示例 - 洛雷姆·伊普苏姆 在组合框中键入字母/字母组合将触发组件建议以输入文本/组合开头的值。 期望的输出: 强制组合框建议包含输入
我很努力地解决这个问题,但没有找到解决方案。 我只是不想为一个且仅有一个 HTML 页面启用 Richfaces。 为什么?因为我只在一个页面上使用 RichFaces。此外,由于我不使用 JavaS
我使用的是richfaces 3.3我希望我的用户能够在服务器上指定可以保存文件的位置。我该怎么做? 最佳答案 使用任何上传组件 使用额外的组件(trie-view)来表示服务器上的结构 提交时,获取
我是一名优秀的程序员,十分优秀!