java - jsf 2在延迟+闪烁后从bean更新UI

标签 java jsf-2 facelets

我不确定我尝试完成的任务是否可行,所以我将不胜感激。 我基本上想做的是创建一款在线跳棋游戏,用户可以在其中相互竞争或与计算机竞争。游戏的逻辑位于 EJB 内部,到目前为止运行良好。到目前为止,我已经完成了玩家-计算机游戏,并且运行良好 - 玩家选择移动的起点和目的地(而逻辑决定它们是否有效),然后计算机使其移动,然后更新棋盘。 但是,目前我想解决两个问题: 1)我希望计算机的移动发生在玩家完成后大约一秒钟。它有效 - 但是董事会没有更新(我稍后会解释原因) 2)计算机让它移动后,我希望它影响的方 block 闪烁几次。

在我的板上,每个方 block 都是一个命令按钮,如下所示:

<h:commandButton id="B1" image="#{CodeBean.imgSrc}"  actionListener="#{CodeBean.clickImg()}" action="#{CodeBean.update}"  onmouseover="this.src='#{CodeBean.overImgSrc}'" onmouseout="this.src='/CheckersClientSide#{CodeBean.imgSrc}'">
    <f:ajax render="@form"   />
</h:commandButton>

在我的 bean 中,'imgSrc' getter 看起来像这样:

public String getImgSrc()
{
    FacesContext fc = FacesContext.getCurrentInstance();
    UIComponent c = UIComponent.getCurrentComponent(fc);
    String cID = c.getId();
    String output = "/resources/EMPTY_BOX.jpg";
    String currOption = gameBoard.get(cID);
    if (currOption != null)
    {
        output = "/resources/" + currOption + ".jpg";
    }
    return output;
  }

在 bean 内的“clickImg”函数中,我检查是否已选取任何方 block ,否则我知道该方 block 已被选取为移动的原点;否则,我调用 EJB 的 move 函数,它返回更新的棋盘 map ,之后我调用“getImgSrc”函数,它更新棋盘,然后我调用 EJB 的计算机 move 函数,它也返回更新的棋盘 map ,然后我再次调用“getImgSrc”,这会更新板本身。
但是,如果我尝试使用计时器调用计算机的移动功能,如下所示 -

Timer timer = new Timer();
timer.schedule(new TimerTask()
{
   @Override
   public void run()
   {
      getMachineMove();
   }
} , 1000);

一秒钟后调用“getMachineMove”函数,该函数调用“getImgSrc”,但板未更新。它不会更新,因为“FacesContext.getCurrentInstance()”返回 null。 我希望我足够清楚 - 如果我是,我将不胜感激任何形式的帮助(以及如何让某些命令按钮从 bean 中闪烁的想法)。

干杯, 电子报

最佳答案

存在几个严重的概念错误。

首先,您只能向 HTTP 请求发送 HTTP 响应。当没有 HTTP 请求时,您无法发送 HTTP 响应。 HTTP请求仅由客户端发起。 FacesContext存储在HTTP请求线程中。这就解释了为什么没有 FacesContext在你的计时器线程中。

您可以使用 websockets 引入 HTTP 推送,但这并不完全是微不足道的。 PrimeFaces 组件库有 a <p:push> component为了那个原因。但更简单的方法是直接计算下一步,让 JSF 打印一行 JavaScript 代码,该代码在客户端执行更新作业 setTimeout(callback, millis) .

其次,使用Timer/TimerTask对于一个被认为是终身运行的 Java EE Web 应用程序来说,这是一个极其糟糕的主意。永远不要想以后再做一次。您应该使用java.util.concurrent API或服务器提供的任务调度程序。这不是您问题的答案(您已经有了它;使用 HTTP 推送或 JS),但要了解更多信息,请查看 Spawning threads in a JSF managed bean for scheduled tasks using a timer

关于java - jsf 2在延迟+闪烁后从bean更新UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9762572/

相关文章:

java - 使用 JAVA 向 LDAP 中的现有用户添加属性

java - Eclipse 之外的 Tomcat 6 上的 JSF PropertyNotFound 异常

sorting - Primefaces "sortBy="不起作用

security - 在 JSF 组件中使用 rendered 是否足够安全以防止伪造的操作调用?

jsf - IntelliJ 对包含父页面中声明的 EL 变量发出 "Cannot resolve variable"警告

java - 在 OpenShift 上部署时出错

java - 泛型混淆 : deceiving the compiler

java - 在 HTML 标签中使用 Struts 标签来隐藏/显示表格

java - 将 jsf 项目转换为 Facelets 2.0 时出现的问题

tomcat - JSF 2 : Navigating from page in "x.WAR" to a page in "y.WAR"