JSF渲染不起作用

时间:2013-12-18 22:46:18

标签: java jsf jboss jsf-2.2 wildfly

以下代码不会重新呈现表单:

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。每次单击按钮时都会调用toggleMode方法。在IE 11中,它永远不会重新呈现表单。在Chrome中,它可以工作两次但不会更多次。

我错过了什么?

1 个答案:

答案 0 :(得分:-1)

@Named是CDI注释,@ViewScoped来自JSF。所以你有CDI和JSF试图管理bean,所以当然这不会工作,结果bean范围可以是单例,如果它可以工作。

@ViewScoped替换为例如@javax.enterprise.context.RequestScoped并尝试运行代码。如果您需要使用视图范围,请查看CDI实现或conversationscope。即使CDI不直接支持viewscope,也可以某种方式完成。

或者迁移到JSF及其@ManagedBeans,但这些都是为了被剥离而被删除。