我正在尝试使用PrimeFaces 5.3(与JSF 2.2一起)来实现包含项的数据表,并且每个项都有一个命令按钮列表来执行服务器端操作。我使用Primefaces LazyDataModel,因为我有巨大的数据集,并且在视图加载时无法加载所有项目。但是,在生命滚动发生后,行的行为不会按预期方式进行。
我已经设置了一个小项目来说明我的问题。(
当我按 A0 时,必须在控制台上打印“已执行的 A0”(依此类推)。
第一个数据集一切正常。当我按下前三个按钮时会发生什么:
Fetching starting at 0 //expected result
Executed A0 //A0
Executed A1 //A1
Executed A2 //A2
但是当我滚动并且加载了其他3个项目时,前三行无法正常工作。
以下是按顺序按下所有按钮时发生的情况:
Fetching starting at 3 //expected result
Executed A3 //A0
Executed A4 //A1
Executed A5 //A2
Executed A3 //A3
Executed A4 //A4
Executed A5 //A5
前三个按钮执行后三个按钮的操作:(
这不是客户端问题,我已经监视了发送的请求。
当我按A0时,请求包含以下POST参数:
j_idt8:resultsTable:0:j_idt12:0:j_idt13=j_idt8:resultsTable:0:j_idt12:0:j_idt13
javax.faces.source=j_idt8:resultsTable:0:j_idt12:0:j_idt13
当我按A3时:
j_idt8:resultsTable:3:j_idt12:0:j_idt13=j_idt8:resultsTable:3:j_idt12:0:j_idt13
javax.faces.source=j_idt8:resultsTable:3:j_idt12:0:j_idt13
结果表后引用正确的行:
我还弄乱了调试模式。当我按A1时,使用包含字段rowIndex=1的事件调用UIData#brodacast(FacesEvent)。所以现在它工作正常。
然后,我真的不明白会发生什么。但在过程结束时,目标方法在错误的实例上执行。。。
项目.java
public class Item {
private int id;
private String name;
private List<ItemAction> actions;
public Item(int id, String name, List<ItemAction> actions) {
this.id = id;
this.name = name;
this.actions = actions;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
public List<ItemAction> getActions() {
return actions;
}
}
ItemAction.java
public class ItemAction {
private String label;
public ItemAction(String label) {
this.label = label;
}
public void execute(){
System.out.println("Executed " + label);
}
public String getLabel() {
return label;
}
}
TheService.java
public class TheService {
private static final int ITEMS_COUNT = 8;
public int getItemsCount() {
return ITEMS_COUNT;
}
public List<Item> retrieveItems(int startIndex, int pageSize){
List<Item> result = new ArrayList<>(pageSize);
int endIndex = startIndex + pageSize;
if(endIndex > ITEMS_COUNT){
endIndex = ITEMS_COUNT;
}
for(int index=startIndex; index<endIndex; index++){
result.add(generateItem(index));
}
return result;
}
private Item generateItem(int id){
List<ItemAction> actions = new ArrayList<>(2);
actions.add(new ItemAction("A" + id));
actions.add(new ItemAction("B" + id));
return new Item(id, "Item " + id, actions);
}
}
DatatableLazyModel.java
@ManagedBean
@ViewScoped
public class DatatableLazyModel extends LazyDataModel<Item>{
private TheService service;
private List<Item> allResults;
public DatatableLazyModel() {
this.service = new TheService();
this.allResults = new ArrayList<>();
}
@Override
public int getRowCount() {
return service.getItemsCount();
}
@Override
public List<Item> load(int first, int pageSize, String sortField, SortOrder sortOrder,
Map<String, Object> filters) {
System.out.println("Fetching starting at " + first);
List<Item> pageResults = service.retrieveItems(first, pageSize);
allResults.addAll(pageResults);
return pageResults;
}
}
索引.xhtml
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition 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:p="http://primefaces.org/ui" template="template/ui.xhtml">
<ui:define name="body">
<h3>Datatablelazy load</h3>
<h:form>
<p:dataTable id="resultsTable" var="item"
value="#{datatableLazyModel}" liveScroll="true" scrollRows="3"
scrollHeight="100" scrollable="true" lazy="true">
<p:column headerText="Name">
<h:outputText value="#{item.name}" />
</p:column>
<p:column headerText="Actions">
<ui:repeat var="action" value="#{item.actions}">
<p:commandButton action="#{action.execute()}" value="#{action.label}">
</p:commandButton>
</ui:repeat>
</p:column>
</p:dataTable>
</h:form>
</ui:define>
</ui:composition>
波姆。xml依赖关系
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-api</artifactId>
<version>2.2.4</version>
</dependency>
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-impl</artifactId>
<version>2.2.4</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
</dependency>
<dependency>
<groupId>org.primefaces</groupId>
<artifactId>primefaces</artifactId>
<version>5.3</version>
</dependency>
我试过加载更多的项目。每次仅执行最后加载集上的方法。甚至从旧的组件。
所以基本上,问题是:“我如何让所有的按钮都像预期的那样工作?”
为什么方法不能在正确的实例上执行?如何解析目标实例?
谢谢你的帮助:)
问题在于LazyDataModel实现,该实现旨在用于页面而不是实时滚动,尤其是这个片段:
if(rowIndex == -1 || pageSize == 0)
this.rowIndex = -1;
else
this.rowIndex = (rowIndex % pageSize);
我用自己的实现子化了LazyDataModel来解决这个问题。
LiveScrollLazyDataModel.java
public abstract class LiveScrollLazyModel<T> extends LazyDataModel<T> {
private int rowIndex;
@Override
public void setRowIndex(int rowIndex) {
int oldIndex = getRowIndex();
if (rowIndex == -1 || getPageSize() == 0){
super.setRowIndex(-1);
this.rowIndex = -1;
}else{
super.setRowIndex(rowIndex);
this.rowIndex = rowIndex;
}
if (getResults() == null) {
return;
}
DataModelListener[] listeners = getDataModelListeners();
if (listeners != null && oldIndex != this.rowIndex) {
Object rowData = null;
if (isRowAvailable()) {
rowData = getRowData();
}
DataModelEvent dataModelEvent = new DataModelEvent(this, rowIndex, rowData);
for (int i = 0; i < listeners.length; i++) {
listeners[i].rowSelected(dataModelEvent);
}
}
}
@Override
public T getRowData() {
return getResults().get(this.rowIndex);
}
@Override
public boolean isRowAvailable() {
if(getResults() == null) {
return false;
}
return rowIndex >= 0 && rowIndex < getResults().size();
}
/**
* The complete list of results
* @return
*/
public abstract List<T> getResults();
}
实现者需要实现提供完整结果列表的get结果()方法。
问题内容: 我有以下程序,其中我需要使用以下结构来解析yaml: https://codebeautify.org/yaml- validator/cbabd352 这是 有效的Yaml ,我使用字节使其更简单,也许缩进在复制粘贴到问题的过程中已更改,但您可以在链接中看到yaml有效 YAML的有API_VERSION和亚军,每个转轮(关键是名字),我已经命令的列表,我需要打印这些命令和,我究
问题内容: 我正在尝试解析一个字符串,但是很不幸,去的月份不正确(一月而不是六月) 玩 问题答案: 问题是您的时区偏移在布局中定义不正确:参考偏移为。您将定义为,因此将被解释为月份,并删除先前定义的月份。并且由于您的工作偏移也将被分析为一月。 以下示例适用于我的游乐场
我有以下HTML: div是Bootstrap流体容器中Bootstrap行的子行。div上的类为。tbody由带有内容(/)的JavaScript函数填充。 我想要实现: 表格填充div中的剩余空间 如果我也给tbody添加一个固定的高度,并给它一个的样式,滚动就像一个魅力。不幸的是,如果我删除固定表/tbody的高度,使其填充div=中的剩余空间 有什么想法吗?
我试图用android的JodaTime库解析ISO格式的日期,但得到了错误的时区偏移量。 我的默认时区是“欧洲/莫斯科”,但结果是“1990-05-04T00:00:00.000 0400”,而它应该是“1990-05-03T23:00:00.000 0300”。Android版本是KitKat。 我做错了什么?
当我向下滚动到列表底部时,它会抛出一个错误,但如果不滚动,则所有工作都正常,请帮助我。下面是我的代码: CustomAdapter.java 这就是错误所在
线程“main”java.lang.NoClassDeffounder异常错误:java.base/java.lang.ClassLoader.DefineClass1(本机方法)java.base/java.lang.ClassLoader.DefineClass(ClassLoader.java:1010)java.base/java.security.SecureClassLoader.De