当我偶然发现这个问题时,我正在摆弄 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”,即使这样也没有产生我想要的结果。
有人可以帮我解决这个问题并让我知道我做错了什么地方吗?
谢谢你。
需要将 bean 放置在视图范围中,以便记住同一视图上所有先前的 (ajax) 操作。
@ManagedBean
@ViewScoped
public class TestBean {
// ...
}
当 bean 被放置在请求作用域中时,
boolean show
将被重新初始化为默认的 false
,因此 rendered
属性将在 JSF 寻找要调用的操作方法时评估 false
,因此永远不会找到并调用操作方法。
我将按钮包围起来,如下图所示
<h:form>
<h:commandButton styleClass="toggle_btn" action="#{buttonNavBean.show()}" style=" font-family: sans-serif; color: black;" value="Sign In/Sign Up"></h:commandButton>
</h:form>
我也面临着同样的挑战。我试图在网上搜索,但一切都是徒劳。但经过几次尝试,我发现,由于我使用
commandButton
来设置渲染面板的值,因此无法计算出UIForm
,因此,我用包围了
commandButton
UIForm
并且它按照我想要的方式正常工作。
当使用actionListener =“#{myTestBean.display}”时,backinbean方法应该是
公共无效显示(ActionEvent事件){
if(show == false){
setShow(true);
}
}
必须声明 ActionEvent 参数