Java 向现有页面动态添加一个或多个outputText

Java 向现有页面动态添加一个或多个outputText,java,primefaces,Java,Primefaces,我需要用managedbeans生成的新数据不断更新页面。Managedbean每隔几分钟创建一个新的值列表,UI必须为Managedbean新创建的列表中的每个值创建一个OutputText。关键是,UI应该保留OutputText并为每个请求添加新的OutputText,而不应该刷新/删除旧的OutputText 我的代码如下所示——为每个ajax调用更新相同的outputText字段,我需要像上面提到的那样进行更改 <c:forEach var="data" items="#{myB

我需要用managedbeans生成的新数据不断更新页面。Managedbean每隔几分钟创建一个新的值列表,UI必须为Managedbean新创建的列表中的每个值创建一个OutputText。关键是,UI应该保留OutputText并为每个请求添加新的OutputText,而不应该刷新/删除旧的OutputText

我的代码如下所示——为每个ajax调用更新相同的outputText字段,我需要像上面提到的那样进行更改

<c:forEach var="data" items="#{myBean.dataList}">
    <p:fieldset legend="#{data}" toggleable="true" toggleSpeed="500">
        <h:panelGrid columns="2" cellpadding="5" border="0">
            <p:scrollPanel style="height:300px">
               <p:poll interval="2" listener="#{myBean.getDataList}" update="field1 field2"/>
                   <h:outputText value="#{data.field1}" id="field1"/>
                   <h:outputText value="#{data.field2}" id="field2"/>
            </p:scrollPanel>
        </h:panelGrid>
    </p:fieldset>
 </c:forEach>


因此,对于每个ajax调用,managedbeans生成的数据项可能很少,并且对于每个数据项,都应该有一个新的outputText字段。

您可以使用datalist for

制作一个列表并将其用作输出文本,是的,您需要一些css格式,因为datalist使用默认css。示例代码

<p:poll interval="3" listener="#{yourbean.yourmethod}" update="<updatecomponet>" />
<p:dataList value="#{yourbean.tempList}" var="s" id="updatecomponet">
        <p:outputLabel value="#{s}"></p:outputLabel>
</p:dataList>


注意:轮询调用侦听器时,需要在列表中添加值。它正在我的项目中工作,请告诉我任何其他信息。希望这会有所帮助。

您可以使用datalist for

制作一个列表并将其用作输出文本,是的,您需要一些css格式,因为datalist使用默认css。示例代码

<p:poll interval="3" listener="#{yourbean.yourmethod}" update="<updatecomponet>" />
<p:dataList value="#{yourbean.tempList}" var="s" id="updatecomponet">
        <p:outputLabel value="#{s}"></p:outputLabel>
</p:dataList>


注意:轮询调用侦听器时,需要在列表中添加值。它正在我的项目中工作,请告诉我任何其他信息。希望这会有所帮助。

也许不是完美的解决方案,但您可以使用延迟加载的DataTable,轮询组件可以更新DataTable页面,而无需更新大量组件

编辑: xhtml

 <p:dataTable var="v" 
     value="#{myBean.getLazyList}" 
     scrollRows="1" 
     liveScroll="true" 
     rows="20" 
     scrollHeight="300" 
     lazy="true" 
     scrollable="true" 
     id="tsUpdates">
            <p:column>
                   <h:outputText value="#{v.fields1}" />
            </p:column>
</p:dataTable>
    public class LazyMyClassModel extends LazyDataModel<MyClass>{
    private Integer findAllCount;

    public LazyMyClassModel(){

    }

    @Override
    public List<MyClass> load(int first, int pageSize, String sortField, SortOrder sortOrder,Map<String, String> filters){
        List<MyClass> myList = //your live source of data
        List<MyClass> data = new ArrayList<MyClass>();
        data = getSubList(MyList, first, pageSize)

        if (findAllCount == null) {
           findAllCount = myList.size
           this.setRowCount(findAllCount);
       }
       return data
    }

    public List<MyClass> getSubList(List<MyClass> list, int fromIndex, int toIndex) {
        int size = list.size();
        if (fromIndex >= size || toIndex <= 0 || fromIndex >= toIndex) {
            return Collections.emptyList();
        }
        fromIndex = Math.max(0, fromIndex);
        toIndex = Math.min(size, toIndex);
        return list.subList(fromIndex, toIndex);
    }
}

Bean

public class Bean {
    private LazyDataModel<MyClass> lazyList;

    @Named("myBean")
    @ViewScoped

    @PostConstruct
        public void init() {
           lazyList = new LazyMyClassModel();  //where myList is your data source
        }

    //getters and setters    
}
公共类Bean{
私人懒散数据模型懒散列表;
@命名为(“myBean”)
@视域
@施工后
公共void init(){
lazyList=new LazyMyClassModel();//其中myList是您的数据源
}
//接球手和接球手
}
LazyModel

 <p:dataTable var="v" 
     value="#{myBean.getLazyList}" 
     scrollRows="1" 
     liveScroll="true" 
     rows="20" 
     scrollHeight="300" 
     lazy="true" 
     scrollable="true" 
     id="tsUpdates">
            <p:column>
                   <h:outputText value="#{v.fields1}" />
            </p:column>
</p:dataTable>
    public class LazyMyClassModel extends LazyDataModel<MyClass>{
    private Integer findAllCount;

    public LazyMyClassModel(){

    }

    @Override
    public List<MyClass> load(int first, int pageSize, String sortField, SortOrder sortOrder,Map<String, String> filters){
        List<MyClass> myList = //your live source of data
        List<MyClass> data = new ArrayList<MyClass>();
        data = getSubList(MyList, first, pageSize)

        if (findAllCount == null) {
           findAllCount = myList.size
           this.setRowCount(findAllCount);
       }
       return data
    }

    public List<MyClass> getSubList(List<MyClass> list, int fromIndex, int toIndex) {
        int size = list.size();
        if (fromIndex >= size || toIndex <= 0 || fromIndex >= toIndex) {
            return Collections.emptyList();
        }
        fromIndex = Math.max(0, fromIndex);
        toIndex = Math.min(size, toIndex);
        return list.subList(fromIndex, toIndex);
    }
}
公共类LazyMyClassModel扩展了LazyDataModel{
私有整数findAllCount;
公共LazyMyClassModel(){
}
@凌驾
公共列表加载(int-first、int-pageSize、字符串排序字段、排序器排序器、映射过滤器){
List myList=//您的实时数据源
列表数据=新的ArrayList();
数据=getSubList(MyList,first,pageSize)
if(findAllCount==null){
findAllCount=myList.size
这个.setRowCount(findAllCount);
}
返回数据
}
公共列表getSubList(列表列表、int-fromIndex、int-toIndex){
int size=list.size();
如果(从索引>=大小| |到索引=到索引){
返回集合。emptyList();
}
fromIndex=Math.max(0,fromIndex);
toIndex=数学最小值(大小,toIndex);
返回列表。子列表(从索引到索引);
}
}

也许不是完美的解决方案,但您可以使用延迟加载的DataTable,轮询组件可以更新DataTable页面,而无需更新大量组件

编辑: xhtml

 <p:dataTable var="v" 
     value="#{myBean.getLazyList}" 
     scrollRows="1" 
     liveScroll="true" 
     rows="20" 
     scrollHeight="300" 
     lazy="true" 
     scrollable="true" 
     id="tsUpdates">
            <p:column>
                   <h:outputText value="#{v.fields1}" />
            </p:column>
</p:dataTable>
    public class LazyMyClassModel extends LazyDataModel<MyClass>{
    private Integer findAllCount;

    public LazyMyClassModel(){

    }

    @Override
    public List<MyClass> load(int first, int pageSize, String sortField, SortOrder sortOrder,Map<String, String> filters){
        List<MyClass> myList = //your live source of data
        List<MyClass> data = new ArrayList<MyClass>();
        data = getSubList(MyList, first, pageSize)

        if (findAllCount == null) {
           findAllCount = myList.size
           this.setRowCount(findAllCount);
       }
       return data
    }

    public List<MyClass> getSubList(List<MyClass> list, int fromIndex, int toIndex) {
        int size = list.size();
        if (fromIndex >= size || toIndex <= 0 || fromIndex >= toIndex) {
            return Collections.emptyList();
        }
        fromIndex = Math.max(0, fromIndex);
        toIndex = Math.min(size, toIndex);
        return list.subList(fromIndex, toIndex);
    }
}

Bean

public class Bean {
    private LazyDataModel<MyClass> lazyList;

    @Named("myBean")
    @ViewScoped

    @PostConstruct
        public void init() {
           lazyList = new LazyMyClassModel();  //where myList is your data source
        }

    //getters and setters    
}
公共类Bean{
私人懒散数据模型懒散列表;
@命名为(“myBean”)
@视域
@施工后
公共void init(){
lazyList=new LazyMyClassModel();//其中myList是您的数据源
}
//接球手和接球手
}
LazyModel

 <p:dataTable var="v" 
     value="#{myBean.getLazyList}" 
     scrollRows="1" 
     liveScroll="true" 
     rows="20" 
     scrollHeight="300" 
     lazy="true" 
     scrollable="true" 
     id="tsUpdates">
            <p:column>
                   <h:outputText value="#{v.fields1}" />
            </p:column>
</p:dataTable>
    public class LazyMyClassModel extends LazyDataModel<MyClass>{
    private Integer findAllCount;

    public LazyMyClassModel(){

    }

    @Override
    public List<MyClass> load(int first, int pageSize, String sortField, SortOrder sortOrder,Map<String, String> filters){
        List<MyClass> myList = //your live source of data
        List<MyClass> data = new ArrayList<MyClass>();
        data = getSubList(MyList, first, pageSize)

        if (findAllCount == null) {
           findAllCount = myList.size
           this.setRowCount(findAllCount);
       }
       return data
    }

    public List<MyClass> getSubList(List<MyClass> list, int fromIndex, int toIndex) {
        int size = list.size();
        if (fromIndex >= size || toIndex <= 0 || fromIndex >= toIndex) {
            return Collections.emptyList();
        }
        fromIndex = Math.max(0, fromIndex);
        toIndex = Math.min(size, toIndex);
        return list.subList(fromIndex, toIndex);
    }
}
公共类LazyMyClassModel扩展了LazyDataModel{
私有整数findAllCount;
公共LazyMyClassModel(){
}
@凌驾
公共列表加载(int-first、int-pageSize、字符串排序字段、排序器排序器、映射过滤器){
List myList=//您的实时数据源
列表数据=新的ArrayList();
数据=getSubList(MyList,first,pageSize)
if(findAllCount==null){
findAllCount=myList.size
这个.setRowCount(findAllCount);
}
返回数据
}
公共列表getSubList(列表列表、int-fromIndex、int-toIndex){
int size=list.size();
如果(从索引>=大小| |到索引=到索引){
返回集合。emptyList();
}
fromIndex=Math.max(0,fromIndex);
toIndex=数学最小值(大小,toIndex);
返回列表。子列表(从索引到索引);
}
}

但是每次ajax调用都会更新整个数据列表,对吗?这可能会严重影响数百个数据项的性能。如果需要添加任何新的outputlabel,则必须更新视图,对吗?。如果不是的话,在视图中添加任何新的东西都不需要fire update,为了提高性能,您可以只在需要时更新datalist,您可以检入back bean并在需要时从bean进行更新。如果您有任何解决方案,请告诉我我也需要解决方案。但是每次ajax调用都会更新整个数据列表,对吗?这可能会严重影响数百个数据项的性能。如果需要添加任何新的outputlabel,则必须更新视图,对吗?。如果不是的话,在视图中添加任何新的东西都不需要fire update,为了提高性能,您可以只在需要时更新datalist,您可以检入back bean并在需要时从bean进行更新。如果你有任何解决方案,请告诉我我也需要这个解决方案。你能给我一个如何做的概述吗?因为,我尝试了下面的方法,…我的支持bean的数据列表最初将是空的,过了一段时间,它将开始生成数据…因此使用上面的代码,当datalist具有某个值时,表根本不会自动加载。手动刷新网页后,似乎会在搜索时加载一些数据,但即使加载也会在某个点停止。。我不知道为什么,我也不明白