我有以下示例代码。 最初,只有commandButton 两个可见。单击此按钮时,commandButton One 也可见。但是当我点击 One 时,后备bean方法 click1 不会被触发。
以下是我的代码:
XHTML
<h:form id="form1">
<h:inputHidden id="show" value="#{bean.show1}" />
<h:commandButton id="button1" value="One" action="#{bean.click1}"
rendered="#{bean.show1}" />
</h:form>
<h:form id="form2">
<h:inputHidden id="show" value="#{bean.show1}" />
<h:commandButton id="button2" value="Two" action="#{bean.click2}" />
</h:form>
支持bean
@RequestScoped
@Named("bean")
public class JsfTrial implements Serializable {
private static final long serialVersionUID = 2784462583813130092L;
private boolean show1; // + getter, setter
public String click1() {
System.out.println("Click1()");
return null;
}
public String click2() {
System.out.println("Click2()");
setShow1(true);
return null;
}
}
我找到了BalusC的一个非常翔实的答案。
如果我理解正确,我的问题是由于这个答案的第5点。
这是否也意味着我们不能将隐藏的commandButton与 @RequestScoped 支持bean一起使用?
答案 0 :(得分:6)
您可以使用请求范围,您应该仅通过<f:param>
而不是JSF隐藏输入字段<h:inputHidden>
将条件作为请求参数传递给后续请求。隐藏输入字段的值仅在“更新模型值”阶段期间在模型中设置,而rendered
属性的条件已在“应用请求值”阶段中进行评估。
因此,请使用<f:param>
代替<h:inputHidden>
:
<h:form id="form1">
<h:commandButton id="button1" value="One" action="#{bean.click1}"
rendered="#{bean.show1}">
<f:param name="show1" value="#{bean.show1}" />
</h:commandButton>
</h:form>
<h:form id="form2">
<h:commandButton id="button2" value="Two" action="#{bean.click2}">
<f:param name="show1" value="#{bean.show1}" />
</h:commandButton>
</h:form>
这样你可以在bean的(post)构造函数中将它们作为请求参数提取出来。
public JsfTrial() {
String show1 = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("show1");
this.show1 = (show1 != null) && Boolean.valueOf(show1);
}
丑陋,但CDI没有提供内置注释,而JSF的@ManagedProperty("#{param.show1}")
替代。但是你可以homegrow这样的注释。