Используйте атрибут rendered
:
<h:outputText value="#{bean.entity.property}" rendered="#{not bean.editmode}" />
<h:inputText value="#{bean.entity.property}" rendered="#{bean.editmode}" />
...
<h:commandButton value="Edit" action="#{bean.edit}" rendered="#{not bean.editmode}" />
<h:commandButton value="Save" action="#{bean.save}" rendered="#{bean.editmode}" />
При этом в bean-объекте области видимости:
private boolean editmode;
public void edit() {
editmode = true;
}
public void save() {
entityService.save(entity);
editmode = false;
}
public boolean isEditmode() {
return editmode;
}
// ...
Обратите внимание, что область видимости bean-компонента важна по причинеупоминается в пункте 5 этого ответа: commandButton / commandLink / ajax действие / метод слушателя не вызывается или входное значение не обновляется .
В качестве альтернативы вы можете использовать атрибут disabled
на входном компоненте в сочетании с фрагментом CSS, который в основном делает его похожим на выходной компонент (удаляя границу).
<h:inputText value="#{bean.entity.property}" disabled="#{not bean.editmode}" />
...
<h:commandButton value="Edit" action="#{bean.edit}" rendered="#{not bean.editmode}" />
<h:commandButton value="Save" action="#{bean.save}" rendered="#{bean.editmode}" />
с, например,
input[disabled] {
border: 0;
}
Также здесь,боб должен быть рассмотренным.См. Также Как правильно выбрать область применения бобов?