【问题标题】:How to pass bean object/value to a jsf(xhtml) page?如何将 bean 对象/值传递给 jsf(xhtml) 页面?
【发布时间】:2015-07-20 21:20:35
【问题描述】:

我在当前可用版本中使用 Tomcat 和 PrimeFaces。

我面临的问题是,我无法将值从托管 bean 异步发送到它的 xhtml 页面。
这是来自我的 xhtml 页面的代码片段:

<p:inputTextarea id="transcriptionResult" rows="4" cols="120"
                    value="#{transcriptionTabView.currentTranscritpion}" />

这是被异步调用以重新/设置托管bean“transcriptionTabView”中的对象/值的方法。其中包含一个名为 Transcription currentTranscription 的对象。

@Override
public void trascriptionReady(Transcription t) {
  this.currentTranscription = t;
}

我认为这足以重置视图,但什么也没发生。

【问题讨论】:

  • 您需要发布更多代码。您在哪里调用方法 trascriptionReady(Transcription t)?你在哪里更新 inputTextarea ?
  • @EmilKaminski transcriptionReady(Transcription t) 方法由异步事件处理程序调用。我想如果我的 bean 中有 getter 和 setter 方法,this.currentTranscription 上的每次修改都会触发我的 JSF 上的更新事件。但这不起作用。
  • @BalusC 感谢您的提示,但是否也可以调用此代码 EventBus eventBus = EventBusFactory.getDefault().eventBus(); eventBus.publish("/subscriber", htmlMessage); System.out.println("Message Sent at " + new Date());,例如不按 &lt;p:commandButton ...&gt; 但在 transcriptionReady(t) 中调用代码?
  • @BalusC 你的提示帮助我解决了这个问题。谢谢:)
  • @kami:请用你的所作所为创建一个答案。

标签: jsf primefaces managed-bean asynchronous


【解决方案1】:

我用 PrimeFaces 的 Push 功能解决了这个问题。 借助 BalusC 的提示,我阅读了 PrimeFaces 的 UserGuide Chapter 9. PrimeFaces Push PDF 并观看了这个 video 教程。 这些是我为解决问题所做的步骤。

第 1 步: 我在我的 TranscriptionTabView-Bean 中添加了以下方法:

public void pushMessage() {
    EventBus eventBus = EventBusFactory.getDefault().eventBus();
    eventBus.publish("/resultreceiver", result);
    System.out.println("Message Sent at " + new Date());
}

第 2 步。 我创建了一个 Receiver-Bean 来接收我推送的消息:

 @PushEndpoint(value = "/resultreceiver")
 public class TranscriptionResultReceiver {

    @OnMessage(encoders = { JSONEncoder.class })
    public String onMessage(String message) {
       return message;
    }
 }

第 3 步。 我在我的 JSF 中添加了一个 &lt;p:inputTextarea&gt;component 来显示消息: <p:inputTextarea rows="6" cols="60" id="transcriptionResult" value="#{transcriptionTabView.result}"> </p:inputTextarea>

第 4 步。 向等待传入消息的 jsf 添加一个套接字: <p:socket channel="/resultreceiver" onMessage="handleMessage"></p:socket>

确保 channel 与 Receiver-Bean 中提到的 @PushEndpoint 注释相同。

第 5 步。 当 TranscriptionTabView-Bean 推送消息时,将以下 javascript 方法添加到由 socket 标记调用的 JSF。

    <script type="text/javascript">
      function
        handleMessage(data){
            document.getElementById(<GENERATED_ID OF INPUTTEXTAREA>).value=data; 
        }

    </script>  

据我了解,通过阅读用户指南和观看 youtube 视频,TranscriptionTabView 中的 pushMessage 方法打开了一个到 JSF 的通道并使用 eventBus.publish("/resultreceiver", message); 发送消息在客户端,套接字标记等待给定的传入消息通道,如果发生onMessage事件,则调用javascript方法handleMessage来处理传入的数据。

如果我错了,请纠正我。我是新手。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-13
    • 1970-01-01
    • 2016-09-10
    • 1970-01-01
    • 2011-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多