我有页面我的.xhtml:
<f:metadata>
<f:viewParam name="id"/>
</f:metadata>
...
<h:form>
Current id is: "#{id}"
<h:commandButton action="#{bean.doSomething}" value="Do some logic..">
<f:param name="id" value="#{id}"/>
</h:commandButton>
</h:form>
和豆.java:
@ManagedBean
@ViewScoped
public class Bean {
....
public void doSomething(){
//do some logick, don't use id parameter
}
}
当我第一次进入 id=10 的页面时,我可以在第 Current id is: "10".
页上看到.当我单击按钮页面时,页面会重新加载,我可以再次看到第 Current id is: "10".
页。
但是当我第三次单击按钮时,我可以在第 Current id is: "".
页上看到,我丢失了id
参数,我不明白为什么?
我知道我可以在 bean 中保存参数值来做到这一点(通过添加到f:viewParam
:
<f:metadata>
<f:viewParam name="id" value="#{bean.value}/>
</f:metadata>
),但是我可以在不将参数值保存在 Bean 中的情况下执行此操作吗?
h:button
适用于f:param
,但h:commandButton
不适用于。在这种情况下,最好是将 view 参数绑定到 bean 属性,如上一个解释的那样。只要您调用void
操作方法,@ViewScoped
Bean 就会保持其状态。
您也可以将其作为参数传递给操作方法(有几种方法可以做到这一点),但这对于与该值无关的方法没有意义。
另请参阅:
- 将参数传递给 JSF 中的操作方法
- JSF 中的通信