当我偶然发现这个问题时,我正在玩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”,即使没有达到我想要的效果。
任何人都可以帮我解决这个问题,让我知道我在做错的地方和地点吗?
谢谢。
答案 0 :(得分:4)
需要将bean放在视图范围中,以便记住同一视图上的所有先前(ajax)操作。
@ManagedBean
@ViewScoped
public class TestBean {
// ...
}
当bean被放置在请求范围内时,boolean show
将重新初始化为默认false
,因此rendered
属性将评估false
,而JSF正在寻找对于要调用的action方法,因此永远不会找到并调用action方法。
答案 1 :(得分:0)
使用actionListener="#{myTestBean.display}"
时,backinbean
方法应为
public void display(**ActionEvent event**){
if(show == false){
setShow(true);
}
}
并且必须声明一个ActionEvent参数。