Ну, это сложно. То, будет ли вызвано действие UICommand
, также зависит от результата атрибута rendered
компонента или одного из его родителей. Поскольку компонент находится в области запроса, profilePage
по умолчанию возвращается к main
в следующем запросе, поэтому атрибут rendered
раздела редактирования оценивает false
, поэтому кнопки в разделе редактирования не будут вызывать никаких действий. , Ответ на ваш предыдущий вопрос .
Теоретически, маркировка компонента @ViewScoped
должна исправить это, потому что он сохраняет состояние компонента в последующих представлениях. Однако в вашем конкретном случае есть две проблемы, которые мешают ему работать должным образом.
Во-первых, вы используете @ManagedProperty
, который относится к значению, которое находится в более короткой области (#{param}
в основном находится в области запроса). Вам нужно будет разделить profilePage
на другой компонент и пометить это @ViewScoped
.
Во-вторых, из-за все еще открытой ошибки в JSF2 ( выпуск 1718 ) ваш конкретный случай все равно не будет работать, потому что у вас есть несколько <h:form>
в другом состоянии rendered
, которые все присоединены к тому же бобу. Эта конкретная ситуация может привести к тому, что javax.faces.ViewState
будет полностью отсутствовать в возвращенном ответе. Это приведет к тому, что bean-объект области видимости будет выделен и воссоздан (и profilePage
по умолчанию снова будет main
). В качестве временного обходного пути, вам нужно извлечь и объединить формы в одну форму в profile.xhtml
, как прямой потомок первого <h:panelGroup>
.
Обновление : Если ваша единственная задача - соединить компоненты друг с другом, вы можете разделить компоненты следующим образом:
@ManagedBean
@RequestScoped
public class Selector {
@ManagedProperty(value="#{param.page}")
private String page;
@ManagedProperty(value="#{profileSelector}")
private ProfileSelector profileSelector;
// ...
}
@ManagedBean
@ViewScoped
public class ProfileSelector {
private String profilePage;
// ...
}
Таким образом, bean-объект области видимости становится доступным в bean-объекте области видимости запроса.
Или, если вы действительно хотите иметь один компонент, вы можете в качестве обходного пути также заменить @ManagedProperty
следующим образом:
@ManagedBean
@ViewScoped
public class Selector {
private String page;
private String profilePage;
@PostConstruct
public void init() {
page = FacesContext.getCurrentInstance().getRequestParameterMap().get("page");
}
// ...
}