У меня есть приложение, созданное JSF с использованием шаблонов Primefaces в Netbeans. Одна из страниц - Create.xhtml для вставки новой записи в базу данных mysql. Эта страница вызывается кнопкой в нижнем колонтитуле списка записей. Проблема в том, что когда я выбираю эту страницу, форма пуста, есть только заголовок и кнопки. OutputLabel и inputText «скрыты» (проверка страницы в браузере). Но если я выберу сначала запись в списке, а затем страницу создания, outputLabel и inputText уже будут видны, но со значениями. Я хочу, чтобы при выборе страницы «Создать» она появлялась в пустой форме, и когда я хочу вставить нужные мне значения в базу данных. Код List.xhtml:
<h:form id = "DistritoCreateForm">
<p:panel header = "#{bundle.CreateDistritoTitle}">
<h:panelGroup id = "display">
<p:panelGrid columns = "2" rendered = "#{distritoController.selected != null}">
<p:outputLabel value = "#{bundle.CreateDistritoLabel_nomeDistrito}" for = "nomeDistrito" />
<p:inputText id = "nomeDistrito" value = "#{distritoController.selected.nomeDistrito}" title = "#{bundle.CreateDistritoTitle_nomeDistrito}" required = "true" />
</p:panelGrid>
<p:commandButton actionListener = "#{distritoController.create}" value = "#{bundle.Save}" update = "display,:growl" oncomplete = "handleSubmit(args,'DistritoCreateForm');" action = "List.xhtml"/>
<p:commandButton value = "#{bundle.Cancel}" action = "List.xhtml"/>
</h:panelGroup>
</p:panel>
</h:form>
Код Create.xhtml:
<h:form id = "DistritoListForm">
<p:panel header = "#{bundle.ListDistritoTitle}">
<p:dataTable id = "datalist" value = "#{distritoController.items}" var = "item" style = "width:50%;"
selectionMode = "single" selection = "#{distritoController.selected}"
paginator = "true"
paginatorPosition = "bottom"
rowKey = "#{item.id}"
rows = "10">
<p:ajax event = "rowSelect" update = "createButton viewButton editButton deleteButton"/>
<p:column filterBy = "#{item.nomeDistrito}" filterMatchMode = "contains">
<f:facet name = "header">
<h:outputText value = "#{bundle.ListDistritoTitle_nomeDistrito}"/>
</f:facet>
<h:outputText value = "#{item.nomeDistrito}"/>
</p:column>
<f:facet name = "footer">
<p:commandButton id = "createButton" icon = "ui-icon-plus" actionListener = "#{distritoController.prepareCreate}" action = "Create.xhtml"/>
<p:commandButton id = "viewButton" icon = "ui-icon-search" action = "View.xhtml"/>
<p:commandButton id = "editButton" icon = "ui-icon-pencil" action = "Edit.xhtml"/>
<p:commandButton id = "deleteButton" icon = "ui-icon-trash" actionListener = "#{distritoController.destroy}" update = ":growl,datalist" disabled = "#{empty distritoController.selected}"/>
</f:facet>
</p:dataTable>
</p:panel>
</h:form>
Так эффективно (это не видно в вашем коде, поскольку это не mcve)
Тогда простой вывод состоит в том, что переменная selected не очищается в методе, который вызывается при нажатии кнопки создания (#{distritoController.prepareCreate}
).
Решение:
Очистите переменную (например, создав новый пустой экземпляр объекта ...
По сути, это не проблема PrimeFaces (то же самое могло бы произойти и с простым jsf), и это вроде как проблема не с java, а с простой проблемой кодирования.