以下代码不会重新呈现表单:
.xhtml:
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:a4j="http://richfaces.org/a4j"
xmlns:rich="http://richfaces.org/rich"
template="/WEB-INF/templates/default.xhtml">
<ui:define name="content">
<h:form id="form">
<rich:panel header="My Header">
<h2>
<h:outputLabel value="#{tournamentBean.mode}" />
</h2>
<a4j:commandButton value="Toggle"
action="#{tournamentBean.toggleMode()}" render="form" />
</rich:panel>
</h:form>
</ui:define>
</ui:composition>
豆:
import java.io.Serializable;
import javax.faces.view.ViewScoped;
import javax.inject.Named;
@SuppressWarnings("serial")
@Named("tournamentBean")
@ViewScoped
public class TournamentBean implements Serializable {
private String mode = "A";
public String getMode() {
return mode;
}
public void toggleMode() {
if (this.mode.equals("A"))
this.mode = "B";
else
this.mode = "A";
}
}
我正在使用Wildfly 8.0,因此使用JSF 2.2。每次单击按钮时都会调用方法切换模式。在IE 11中,它从不重新呈现表单。在Chrome中,它可以工作两次,但不会更多次。
我错过了什么?
@Named
是CDI注解,@ViewScoped
来自JSF。所以你让 CDI 和 JSF 都尝试管理 bean,所以这当然行不通,结果 bean 范围可以是单例的,如果它真的可以工作的话。
@ViewScoped
替换为@javax.enterprise.context.RequestScoped
并尝试运行代码。如果需要使用视图范围,请四处查找 CDI 实现或conversationscope
。即使 CDI 不直接支持 viewscope
,也可以以某种方式完成。
或者迁移到JSF及其@ManagedBeans
,但这些都被淘汰了。