私はJSF 2.3の新機能を味わってみました。魅力的なのはwebsocketです。JSF 2.3 websocketがf:ajax actionlisenterでAjaxとどのように動作するのですか?
私はmojarraテストとJSF 2.3固有の@Push
javadocからいくつかのサンプルコードを読みました。
f:websocket
とf:ajax
を使用すると問題が発生しました。
のFaceletsテンプレートは次のとおりです。
<h:panelGroup id="messagePanel" layout="block">
<ul>
<ui:repeat value="#{ajaxBean.messages}" var="m">
<li>#{m}</li>
</ui:repeat>
</ul>
</h:panelGroup>
<h:form id="form">
<h:commandButton
id="sendMessage"
action="#{ajaxBean.sendMessage()}"
value="Send Ajax Message">
<f:ajax/>
</h:commandButton>
</h:form>
<h:form>
<f:websocket channel="ajaxChannel" scope="view">
<f:ajax event="ajaxEvent" render=":messagePanel" />
</f:websocket>
</h:form>
<h:form>
<f:websocket channel="ajaxListenerChannel" scope="view">
<f:ajax event="ajaxListenerEvent" listener="#{ajaxBean.ajaxPushed}" render=":messagePanel" />
</f:websocket>
</h:form>
<f:websocket channel="commandScriptChannel" scope="view" onmessage="onCommandScript"/>
<h:form>
<h:commandScript name="onCommandScript" action="#{ajaxBean.commandScriptExecuted()}" render=":messagePanel"/>
</h:form>
とバックエンドBeanは次のとおりです。
@ViewScoped
@Named("ajaxBean")
public class AjaxBean implements Serializable {
private static final Logger LOG = Logger.getLogger(AjaxBean.class.getName());
@Inject
@Push
PushContext ajaxChannel;
@Inject
@Push
PushContext ajaxListenerChannel;
@Inject
@Push
PushContext commandScriptChannel;
private List<String> messages = new ArrayList<>();
public void ajaxPushed(AjaxBehaviorEvent e) throws AbortProcessingException{
LOG.log(Level.INFO, "ajax pushed: " + e.toString());
messages.add("ajaxListenerEvent is sent at: " + LocalDateTime.now());
ajaxListenerChannel.send("ajaxListenerEvent");
}
public void commandScriptExecuted() {
LOG.log(Level.INFO, "commandScriptExecuted pushed.");
messages.add("commandScriptExecuted message is sent at: " + LocalDateTime.now());
commandScriptChannel.send("onCommandScript");
}
public void sendMessage() {
// LOG.log(Level.INFO, "ajax pushed by button: " + e.toString());
messages.add("ajaxEvent is sent at: " + LocalDateTime.now());
ajaxChannel.send("ajaxEvent");
}
public List<String> getMessages() {
return messages;
}
public void setMessages(List<String> messages) {
this.messages = messages;
}
}
結果は、必要に応じて最初のボタンは、Ajaxの出力をトリガすることができます。しかし、f:リスナーとのajaxは動作しません.h:commandScriptもここでは動作しません。
これを修正するにはどうすればよいですか?
あなたのコードでは、明示的にそれらのチャンネルにプッシュしているところはありませんか?さらに、それらのチャンネルは、独自のajax /コマンドリスナーによってのみプッシュされます!私はあなたが達成しようとしていることを理解していません。 – BalusC
@BalusC f:ajax 'listener'に** push **アクションを追加し、h:commandScript' action'を追加しました。 '@ Push' javadocは複雑なUIを扱うためにf:ajaxを使ったf:websocketの使い方を説明しています。私はf:webocketとf:ajaxまたはh:commandScriptを使用して、バックエンドアクションを実行してコンテンツを自動的に追加します。この目的をアーカイブすることはできますか?または私はf:webscoket/f:ajaxの使い方を誤解しています。 – Hantsy
@BalusC [コード](https://github.com/hantsy/ee8-sandbox/tree/master/jsf-websocket)を更新しました。余分なボタンを使用してajax信号をチャンネルにプッシュすると動作します。 – Hantsy