Java 向现有页面动态添加一个或多个outputText
我需要用managedbeans生成的新数据不断更新页面。Managedbean每隔几分钟创建一个新的值列表,UI必须为Managedbean新创建的列表中的每个值创建一个OutputText。关键是,UI应该保留OutputText并为每个请求添加新的OutputText,而不应该刷新/删除旧的OutputText 我的代码如下所示——为每个ajax调用更新相同的outputText字段,我需要像上面提到的那样进行更改Java 向现有页面动态添加一个或多个outputText,java,primefaces,Java,Primefaces,我需要用managedbeans生成的新数据不断更新页面。Managedbean每隔几分钟创建一个新的值列表,UI必须为Managedbean新创建的列表中的每个值创建一个OutputText。关键是,UI应该保留OutputText并为每个请求添加新的OutputText,而不应该刷新/删除旧的OutputText 我的代码如下所示——为每个ajax调用更新相同的outputText字段,我需要像上面提到的那样进行更改 <c:forEach var="data" items="#{myB
<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具有某个值时,表根本不会自动加载。手动刷新网页后,似乎会在搜索时加载一些数据,但即使加载也会在某个点停止。。我不知道为什么,我也不明白