好吧,那变得复杂了。是否
UICommand将调用该操作还取决于
rendered组件或其父项之一的属性的结果。由于Bean在请求范围内,因此
profilePage默认值返回到
main下一个请求,因此
renderededit部分的属性为
false,因此edit部分中的按钮将不会调用任何操作。您先前的问题已经回答了。
从理论上讲,标记Bean
@ViewScoped应该可以解决此问题,因为在后续视图中它将保留Bean状态。但是,在您的特定情况下,有两个问题使其无法正常工作。
首先,您使用的是
@ManagedProperty,它指的是范围较短的值(
#{param}基本上是请求范围内的值)。您将需要将其拆分profilePage为另一个bean并进行标记
@ViewScoped。
其次,由于JSF2(问题1718)中当前仍存在一个打开的错误,您的特定情况仍然无法正常工作,因为您有多个
<h:form>处于不同
rendered条件的条件都被附加到同一bean。这种特定情况将导致
javax.faces.ViewState返回的响应中完全丢失。这将导致视图作用域的bean被垃圾回收并重新创建(
profilePage默认值为
main再次)。作为临时的解决方法,您需要将表单提取并合并为其中的一个表单
profile.xhtml,作为first的直接子代
<h:panelGroup>。
更新 :如果您唯一要考虑的是要相互连接bean,则可以按以下方式拆分bean:
@ManagedBean@RequestScopedpublic class Selector { @ManagedProperty(value="#{param.page}") private String page; @ManagedProperty(value="#{profileSelector}") private ProfileSelector profileSelector; // ...}@ManagedBean@ViewScopedpublic class ProfileSelector { private String profilePage; // ...}然后,可以通过这种方式在请求范围的Bean中访问视图范围的Bean。
或者,如果您 确实 希望拥有一个bean,则可以作为一种解决方法将其替换
@ManagedProperty为:
@ManagedBean@ViewScopedpublic class Selector { private String page; private String profilePage; @PostConstruct public void init() { page = FacesContext.getCurrentInstance().getRequestParameterMap().get("page"); } // ...}


