@ConversationScoped Beanから値を表示およびインクリメントする、JSF-Compnentsを使用して短いページを作成します。このページは会話を終了することができ、古い会話を終了した後に新しいBeanを取得しています。これがどのように見えるかです:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.org/ui">
<h:head />
<h:body>
<h:form>
<h:outputText id="i" value="#{test.i}" />
<h:commandButton value="increment"
actionListener="#{test.increment}"
update="i cid" />
<h:outputText id="cid"
value="#{javax.enterprise.context.conversation.id}" />
<h:commandButton value="end"
actionListener="#{test.endConversation}"
update="i cid" />
</h:form>
</h:body>
</html>
Beanのコードは非常に単純です。
package de.burghard.britzke.test.beans;
import java.io.Serializable;
import javax.annotation.PostConstruct;
import javax.enterprise.context.Conversation;
import javax.enterprise.context.ConversationScoped;
import javax.inject.Inject;
import javax.inject.Named;
@Named
@ConversationScoped
public class Test implements Serializable {
@Inject Conversation conversation;
private int i;
@PostConstruct
public void init() {
conversation.begin();
System.out.println("init conversation"+conversation.getId());
}
public int getI() { return i; }
public void setI(int i) { this.i = i; }
public void increment() { i++;System.out.println(i); }
public void endConversation() {
System.out.println("ending conversation "+conversation.getId());
conversation.end();
}
}
標準のh:commandButtonコンポーネントを使用すると、すべてがうまく機能します。ただし、Primefacesコンポーネントのp:commandButtonを使用すると、cid-Parameterがサーバーに渡されないため、「インクリメント」ボタンをクリックするたびに新しいBeanインスタンスが取得されます。これは素顔の問題ではないと言われています。しかし、なぜそれがprimefacesのコンポーネントではなく、標準のコンポーネントで機能するのでしょうか。f:paramコンポーネントをcommandButtonコンポーネントに明示的に埋め込むことで、cid-Parameterを渡すことができましたが、会話を破棄した後、パラメーターは値なしで送信され、エラーが発生します。ただし、 f:paramコンポーネントがなくても機能するはずです。
PrimefacesおよびConversationスコープのBeanを(明示的にcid-Parameterを渡さずに)操作する方法の短いチュートリアルはありますか?