#java #jsf #ejb-3.0 #primefaces #ejb-3.1
#java #jsf #ejb-3.0 #primefaces #ejb-3.1
Вопрос:
Я использую JSF 2 и EJB 3.1 для создания формы.
Я использую эту часть страницы, чтобы получить некоторые данные, поэтому я могу передать их своему компоненту, используя confirmDialog чуть ниже
<p:column headerText="#{bundle.edit}" style="width:10px; overflow:visible;">
<p:rowEditor/>
</p:column>
<p:column headerText="#{bundle.delete}" style="width:10px; overflow:visible;">
<p:commandButton update=":form" oncomplete="confirmation.show()"
image="ui-icon ui-icon-close" title="Delete">
<f:param value="#{user}" name="userAction" />
</p:commandButton>
</p:column>
</p:dataTable>
<p:confirmDialog message="Are you sure? user:#{param['userAction']} " width="500"
header="Confirm" severity="alert" widgetVar="confirmation">
<p:commandButton value="Yes sure" update=":form"
actionListener="#{userController.deleteAction(param['userAction'])}"
oncomplete="confirmation.hide()" />
<p:commandButton value="Not yet" onclick="confirmation.hide()" type="button" />
</p:confirmDialog>
</h:form>
И это компонент, который должен его получить
@Named(value = "userController")
@Stateful
@RequestScoped
@TransactionManagement(TransactionManagementType.CONTAINER)
public class UserController implements Serializable {
private User current;
@Inject
private br.com.cflex.itm.dataaccess.UserFacade userFacade;
public UserController() {
}
public void deleteAction(User user) {
userFacade.remove(user);
}
Но мой компонент получает null только как User, и в диалоговом окне я печатаю данные, чтобы я мог видеть, что там выбран объект User.
Почему я получаю null в своем компоненте?
Что не так в передаче подобных параметров?Потому что они теряются при обмене данными между клиентом и сервером…
Ответ №1:
<p:commandButton action="#{userController.deleteAction(param['userAction'])}" />
Значение EL action
(и actionListener
) вычисляется при отправке формы, а не при отображении формы. Параметры запроса ограничены областью запроса и отсутствуют в последующем запросе формы отправки. Вам нужно передать его вместе:
<p:commandButton action="#{userController.deleteAction(param['userAction'])}">
<f:param name="userAction" value="#{param['userAction']}" />
</p:commandButton>
Значение EL <f:param>
вычисляется при отображении формы. Таким образом, он будет присутствовать в сгенерированном HTML, и JavaScript позаботится о том, чтобы он был передан.
Обратите внимание, что параметры запроса имеют String
тип. Ожидание, что они будут User
, вообще не будет работать. По сути, он содержит значение User#toString()
. Вам нужно будет принять String
в качестве аргумента действия и преобразовать его в User
себя. Или лучше, используйте <f:viewParam>
, в котором вы можете явно указать конвертер.
Комментарии:
1. Спасибо, не знал, что мне также нужно отправить параметр.