带有ajax调用的jsf通过轮询获取动态值
Posted
技术标签:
【中文标题】带有ajax调用的jsf通过轮询获取动态值【英文标题】:Jsf with ajax call to get dynamic values with polling 【发布时间】:2018-04-29 17:16:38 【问题描述】:我的 ajax 按钮的 Onclick 正在调用托管 bean yourFileData 方法。在 yourFileData() 我从主线程创建了一个新线程。所以我想在第一次尝试时执行主线程,新线程将运行并刷新我的行数,以便我可以动态更新我的模态计数。
我还创建了一个虚拟按钮来刷新 hiddenCurrentRowCount 但这对我没有帮助,而且我也每 5 秒刷新一次。
sn-p 中的代码仅用于您的查看目的,那里没有任何作用。
function ajaxValidateFile(data)
var status = data.status;
switch (status)
case "begin":
refreshRowCount();
break;
case "complete":
break;
case "success":
openModalWindow();
break;
var refreshRowTimer;
function refreshRowCount()
refreshRowTimer = setInterval(refreshRowCount, 5000);
$("#dummyHiddenBtn").click();
currentCount = $("#hiddenCurrentRowCount").val();
$("#validateMsg").html('<p>Validating ' + currentCount + ' of '+ totalCount + ' records </p>');
if($("#hiddenTotalRowCount").val() === $("#hiddenCurrentRowCount").val())
clearInterval(refreshRowTimer);
$( '#dialog' ).modal( 'close' );
console.log('Here you go');
openModalWindow = function()
totalCount = $("#hiddenTotalRowCount").val();
currentCount = $("#hiddenCurrentRowCount").val();
$("#validateMsg").html('<p> Validating ' + currentCount + ' of '+ totalCount + ' records </p>');
$( '#dialog' ).modal( 'open' );
;
I have jsf code below :
<div>
<h:commandButton id="validateFileBtn" value="Validate File" >
<f:ajax execute="uploadCsvFile" event="click" listener="#formManagedBean.yourFileData" render="validateFileBtn hiddenTotalRowCount dummyHiddenBtn hiddenCurrentRowCount messagesDiv :csvFilesForm" onevent="ajaxValidateFile" onerror="ajaxOnError"/>
</h:commandButton>
</div>
<h:commandButton id="formManagedBean" styleClass="dol-hide" >
<f:ajax listener="#formManagedBean.dummyCallRefreshData" render="hiddenCurrentRowCount"/>
</h:commandButton>
<h:inputHidden id="hiddenTotalRowCount" value="#formManagedBean.lineCount" rendered="#not empty formManagedBean.lineCount"></h:inputHidden>
<h:inputHidden id="hiddenCurrentRowCount" value="#formManagedBean.rowNum" rendered="#not empty formManagedBean.rowNum"></h:inputHidden>
public List<String> yourFileData(AjaxBehaviorEvent event)
try
// code running for LineCount before new thread and it works fine
Thread one = new Thread()
public void run()
try
String input;
while((input = bfReaderCount.readLine()) != null)
rowNum++;
catch(Exception e)
e.printStackTrace();
;
one.start();
System.out.println("Does it work NOOOOOOO?");
catch (Exception e)
e.printStackTrace();
return someList;
【问题讨论】:
【参考方案1】:-
通过将模型对象引用传递给执行程序,创建一个 ScheduledExecutorService 以在服务器端定期刷新模型值。
使用 primefaces 轮询组件在客户端定期刷新数据。
https://www.primefaces.org/showcase/ui/ajax/poll.xhtml
你也可以使用 websocket。
【讨论】:
感谢您的回答,但我们不使用任何 primefaces。 @Nain:然后使用 OmniFaces 或 JSF2.3...创建自己的“轮询”是一个糟糕的选择 @KukeltjeThanku 但你能告诉我为什么我的代码不起作用以及我哪里出错了。 我知道问题出在哪里:我的私有变量 rowNum 已在新线程中更新,但并未从该线程中更新。我不知道如何解决它。以上是关于带有ajax调用的jsf通过轮询获取动态值的主要内容,如果未能解决你的问题,请参考以下文章
如何通过导航菜单 ajax-refresh 动态包含内容? (JSF SPA)