Перейти к другому представлению, передав параметр

Моя текущая среда - JRE 1.7, JSF 2.2, Eclipse Luna. На определенной странице (entity_index.xhtml) моего приложения у меня есть следующая кнопка (PrimeFaces):

<p:commandButton value="Details" action="entity_details"
                 ajax="false" onclick="this.form.target='_blank'">
    <f:param name="id" value="#{entity.id}" />
</p:commandButton>

Идея состоит в том, чтобы предоставить кнопку, чтобы пользователь мог щелкнуть ее, и некоторые сведения о текущем объекте будут отображаться на другой вкладке браузера (страница entity_details.xhtml). Это одна из многих кнопок, поэтому на странице entity_index.xhtml показано множество экземпляров Entity, каждый из которых имеет кнопку сведений.

Кнопка работает в том смысле, что открывается новая вкладка и отображается правильная страница (entity_details.xhtml), но идентификатор объекта никогда не попадает в компонент, который обрабатывает страницу сведений (EntityDetailsMB). Страница сведений выглядит следующим образом:

<ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:f="http://java.sun.com/jsf/core"
    xmlns:p="http://primefaces.org/ui" xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:dsi="http://www.cce.ufpr.br"
    template="/private/template/sbadmin.xhtml">
<f:metadata>
    <f:viewParam name="id" value="#{entityDetailsMB.id}"/>
</f:metadata>

<ui:define name="content">
<h2 class="page-header">#{entityDetailsMB.entity.name}</h2>
<h:form id="form">
...
</ui:composition>

Обратите внимание, что есть элемент <f:metadata/>, предназначенный для захвата параметра, отправленного со страницы индекса, и его пересылки в свойство id в EntityDetailsMB, где есть следующее:

public Entity getEntity() {
    return entityById(id);
}

public Long getId() {
    return id;
}

public void setId(Long value) {
    id = value;
}

Поскольку метод setId() никогда не вызывается, getEntity() всегда возвращает null.

Чего не хватает, чтобы он заработал?


person AlexSC    schedule 17.08.2016    source источник
comment
вы пытались добиться результата и добавить параметр для получения данных с первой страницы JSF   -  person Yagami Light    schedule 17.08.2016


Ответы (1)


p:commandButton выполняет запрос POST. Вы хотите просто ПОЛУЧИТЬ представление с подробностями вашей сущности, а не POST на сервере, поэтому вам понадобится h:link:

<h:link value="Details" outcome="entity_details" target="_blank">
    <f:param name="id" value="#{entity.id}" />
</h:link>

Затем f:viewParam на целевой странице сможет обработать параметр url:

<f:metadata>
    <f:viewParam name="id" value="#{entityDetailsMB.id}"/>
    <f:viewAction action="#{entityDetailsMB.init}" />
</f:metadata>

Используйте f:viewAction для инициализации своей сущности вместо того, чтобы делать это в геттере, что не рекомендуется :

public void init(){
    entity = entityById(id);
}

См. также:

person Xtreme Biker    schedule 17.08.2016