带有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通过轮询获取动态值的主要内容,如果未能解决你的问题,请参考以下文章

Flask框架:运用Ajax轮询动态绘图

如何通过导航菜单 ajax-refresh 动态包含内容? (JSF SPA)

JSF 1.1-不刷新页面调用backing bean的动作方法(通过ajax/javascript)

通过JSF中的JavaScript从bean获取更新值

ajax轮询

将带有 Ajax4jsf 1.x 的 JSF 1.1 迁移到 JSF 2