1

当我偶然发现这个问题时,我正在玩 primefaces 组件......

我有一个示例页面,其中包含以下内容,

<h:form>
  <p:panel id="p1">
  <p:commandButton value="display" actionListener="#{myTestBean.display}" update="p2">     </p:commandButton>

  </p:panel>

  <p:panel id="p2" rendered="#{myTestBean.show}">

  <p:inputText value="#{myTestBean.val1}" id="t1"></p:inputText>
  <p:inputText value="#{myTestBean.val2}" id="t2"></p:inputText>
  <p:commandButton value="click me" update="@form" action="#{myTestBean.disply}"></p:commandButton>

  </p:panel>
   </h:form>

我的支持 bean 包含以下内容,

 public class Testbean implements Serializable {
    private String val1;
  private String val2;

  private boolean show;

    //getters and setters for the above...

        public void display(){

    if(show == false){
        setShow(true);
    }

}

public void disply(){
    System.out.println("I am here");
    val1 = "hi";
    val2 = "hello";
    if(show == false){
        setShow(true);
    }

}
}

现在,这里的问题是,当我单击第一个按钮(显示)时,下面的面板(p2)会正确呈现。但是,当我单击第二个按钮(单击我)时,面板会被隐藏,并且单击第二个按钮时,它永远不会转到支持 bean 方法“disply()”。

我在第二个按钮中使用了动作监听器,但同样的行为。另外,我在第二个按钮中给出了 update = "p2" ,即使这并没有产生我想要的结果。

谁能帮我解决这个问题,让我知道我在哪里做错了什么?

谢谢你。

4

2 回答 2

4

需要将 bean 放置在视图范围内,以便记住同一视图上的所有先前 (ajax) 操作。

@ManagedBean
@ViewScoped
public class TestBean {
    // ...
}

当 bean 放置在请求范围内时,boolean show将重新初始化为默认值false,因此当 JSF 正在寻找要调用的操作方法时rendered属性将评估,因此永远不会找到和调用操作方法。false

也可以看看:

于 2012-06-16T13:46:25.970 回答
0

使用actionListener="#{myTestBean.display}"时,backinbean方法应为

public void display(**ActionEvent event**){

    if(show == false){
        setShow(true);
    }

}

并且必须声明一个 ActionEvent 参数。

于 2014-02-13T21:08:23.260 回答