2013-12-18 39 views
0

下面的代码不会重新呈现形式:JSF呈现不起作用

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

虽然'render =“form”'应该可以工作,尽管只有RichFaces,因为它使用'UIComponent#findComponent()'方法来定位组件,所以它显然是低效的,并且'render =“@form”'应该总是用于重新渲染当前表单。 – skuntsel

+0

显示您的“/WEB-INF/templates/default.xhtml”,它是否可能包含的附加h:表单。 – Andrey

+0

感谢您的提示。 “来自”的“render =”@没有帮助。而default.xhtml非常简单。没有形式或任何特别的东西 – Dave

回答

-1

@Named是CDI注释,@ViewScoped来自JSF。因此,您有CDI和JSF都试图管理这个bean,所以当然这不会起作用,并且如果它的工作完成,结果bean范围可以是单例。

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

或者迁移到JSF及其@ManagedBeans,但这些都是depotated。

+0

OP使用的ViewScoped声明应该没有问题。有两个ViewScoped注释 - 一个属于javax.faces.bean(旧)和javax.faces.view(新和CDI兼容)。 –

+1

首先,'@ ViewScoped'面临的注释只有在与@ @ ManagedBean'一起使用时才能与JSF一起使用,但情况并非如此(JSF范围也可以与CDI注释一起使用)。除此之外,还有Omnifaces自己的['@ ViewScoped'](http://wiki.omnifaces.googlecode.com/hg/javadoc/org/omnifaces/cdi/ViewScoped.html)注释,它应该与CDI(甚至在OP的情况下也不需要,因为他使用的是JSF 2.2)。而且,对于最后一句,关于计划弃用的JSF托管bean,您缺少实际确认的链接。无用的答案恕我直言:-1。 –