Primefaces Datatable воссоздает bean-компонент viewScoped

У меня есть таблица данных с 5 столбцами. Первый столбец содержит:

<p:column headerText="Ordine" filterBy="#{item.numeroOrdineLavoro}"
          sortBy="#{item.numeroOrdineLavoro}">

    <p:commandLink value="#{item.numeroOrdineLavoro}"
                   process="@this"
                   action="#{Bean_OrdiniLavoro.cmdSeleziona_Ordine}">

        <f:setPropertyActionListener target="#{Bean_OrdiniLavoro.sel_OrdineLavoro}" 
                                     value="#{item}" />
    </p:commandLink>
</p:column>

Bean_OrdiniLavoro имеет ViewScoped. Bean_OrdiniLavoro.cmdSeleziona_Ordine перенаправляет на новую страницу.

Каждый раз, когда я нажимаю на командную ссылку Bean_OrdiniLavoro, создается заново. Это проблема.

<context-param>
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
    <param-value>server</param-value>
</context-param>
<context-param>
    <param-name>javax.faces.PARTIAL_STATE_SAVING</param-name>
    <param-value>false</param-value>
</context-param>

Primefaces 3.5 и JSF 2.1.22.

Я прочитал много сообщений, в которых говорилось, что PARTIAL_STATE_SAVING = false достаточно, но в этом случае это не работает.

Если я использую a вместо этого, это работает.

большое спасибо. Давиде


person Davide Lo Giudice    schedule 21.05.2013    source источник
comment
Что возвращает эта функция: Bean_OrdiniLavoro.cmdSeleziona_Ordine?   -  person Alexandre Lavoie    schedule 21.05.2013
comment
если я использую Page_EditOrdine.xhtml?faces-redirect=true, он пересоздает компонент. С return = null и //FacesContext.getCurrentInstance().getExternalContext().redirect(Page_EditOrdine.xhtml); оно работает   -  person Davide Lo Giudice    schedule 21.05.2013
comment
Это решает вашу проблему?   -  person Alexandre Lavoie    schedule 21.05.2013
comment
да, но я не знаю, почему :-)   -  person Davide Lo Giudice    schedule 21.05.2013


Ответы (1)


При использовании свойства action элемента p:commandButton возвращаемое значение — это то место, куда вы хотите перейти. Если вы возвращаете ненулевое значение, ваше текущее представление прекратится в пользу нового.

Если вы хотите остаться в том же представлении, вы должны вернуть значение null или void.

public String cmdSeleziona_Ordine()
{
    return null;
}

or

public void cmdSeleziona_Ordine()
{

}
person Alexandre Lavoie    schedule 21.05.2013
comment
Я хочу перенаправить на другую страницу. если действие возвращает Page_EditOrdine.xhtml?faces-redirect=true, bean-компонент viewScoped создается заново. только для теста я вернул null и использовал FacesContext.getCurrentInstance().getExternalContext().redirect(Page_EditOrdi‌​ne.xhtml);. Так это работает.. это странно для меня! - person Davide Lo Giudice; 21.05.2013
comment
Насколько я понимаю, у вас есть два представления, использующие один и тот же компонент? - person Alexandre Lavoie; 21.05.2013
comment
Я бы хотел, чтобы он был прекращен в пользу нового, но перед тем, как изменить страницу, он повторно создает компонент ViewScoped (Bean_OrdiniLavoro), а затем меняет страницу. Извините за мой английский - person Davide Lo Giudice; 21.05.2013
comment
нет, у меня есть 2 представления и два боба. Когда я выбираю элемент в таблице первого представления, я перехожу к другому представлению. это простой CRUD, список и редактирование. Оба bean-компонента ViewScoped. - person Davide Lo Giudice; 21.05.2013
comment
Хорошо, я понимаю, я думаю, что это нормальное поведение JSF, которое я никогда не исследовал на данный момент. - person Alexandre Lavoie; 21.05.2013
comment
Я прочитал много сообщений, в которых говорилось, что PARTIAL_STATE_SAVING = false достаточно, но в этом случае это не работает. - person Davide Lo Giudice; 21.05.2013
comment
(что является лучшей практикой для управления crud. Что вы используете для выбора и редактирования элемента на другой странице?) Я думал, что это лучшее решение, но... если первый компонент пересоздается каждый раз, когда я не могу его использовать . - person Davide Lo Giudice; 21.05.2013
comment
Лучше всего просто не хранить в памяти ничего, что вам не нужно, сокращая возможный объем. Область действия ViewScoped является хорошим улучшением по сравнению с JSF 2.0, поскольку в JSF 1.2 область действия SessionScoped неправильно использовалась для упрощения приложений. - person Alexandre Lavoie; 21.05.2013
comment
очевидно, что с sessionScope это работает, но я хотел бы использовать bean-компонент ViewScoped. Надеюсь, вы сможете мне помочь. Спасибо - person Davide Lo Giudice; 21.05.2013
comment
Ну, вы получаете новый ViewScoped для редактирования объекта, а после того, как вы получаете еще один новый ViewScoped (другой компонент) для просмотра списка ваших объектов. Это то, что вы испытываете? Что-то не так с этим? Вы можете передать идентификатор объекта, который хотите отредактировать, непосредственно в URL-адресе, как я часто делаю с помощью простого <a href="edit-item.jsf?id=#{object.id}>#{object.name}</a>. После этого вы проверяете параметры запроса в своем компоненте редактирования! - person Alexandre Lavoie; 21.05.2013
comment
конечно, это хорошее решение, например (я так думаю) FacesContext.getCurrentInstance().getExternalContext().redirect(Page_EditOrdi‌​‌​ne.xhtml); но я хотел бы выяснить, почему страница возврата...?faces-redirect=true не работает. может я что-то не так делаю - person Davide Lo Giudice; 21.05.2013
comment
первый компонент содержит список, когда я нажимаю на элемент списка, я перехожу ко второму компоненту для редактирования. Тогда я возвращаюсь. - person Davide Lo Giudice; 21.05.2013
comment
для передачи элемента на другую страницу я использую ‹f:setPropertyActionListener target=#{Bean_OrdiniLavoro.sel_OrdineLavoro} value=#{item} /› или ‹p:datatable selection=xx /› + ‹p:ajax event=rowSelect process=@this listener=#{Bean_OrdiniLavoro.cmdSeleziona_Ordine}/›. Оба способа работают с FacesContext.getCurrentInstance().getExternalContext().redirect(Page_EditOrdi‌​ne.xhtml) - person Davide Lo Giudice; 21.05.2013
comment
Вот хороший пример CRUD: stackoverflow.com/a/3180885/354831 - person Alexandre Lavoie; 21.05.2013
comment
все на странице :-) идеально. - person Davide Lo Giudice; 21.05.2013
comment
но почему RETURN не работает? В чем разница с FacesContext.getCurrentInstance().getExternalContext().redirect(xx) :-( Я бы хотел выяснить.. - person Davide Lo Giudice; 21.05.2013