我使用 JSF-Compnents 构建了一个短页面,该页面显示并增加了来自 @ConversationScoped Bean 的值。此页面能够结束对话,并在结束旧对话后得到一个新的 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然后每次单击“增量”按钮都会抓取一个新的 Bean 实例,因为 cid 参数没有传递给服务器。有人说这不是primefaces问题。但是为什么它使用标准组件而不是 primefaces 呢?我已经能够通过将f:param组件显式嵌入到 commandButton 组件中来传递 cid 参数,但是在销毁 Conversation 后,发送的参数没有产生错误的值。但它甚至应该在没有f:param组件的情况下工作。
是否有一个简短的教程如何使用 Primefaces 和对话范围的 bean(没有显式传递 cid 参数)?