Инициализация данных SessionBean в JSF с использованием параметра GET

Мой навигационный случай выглядит следующим образом. У меня есть целевая страница, с которой я могу перейти на страницу магазина. Эта страница магазина может работать с двумя разными каталогами товаров. Это контролируется данным объектом Retailer.

Начиная со страницы магазина, есть несколько bean-компонентов и страниц, которые будут полагаться на Retailer в сеансе. Событие, которое переключает продавца, — это новый выбор на целевой странице. Я мог управлять розничным продавцом в сеансе, просто запуская действие в выборе, а затем переходя на страницу магазина. Но это нужно контролировать при действии в бине.

Моя проблема связана с прямой навигацией с панели навигации на страницу магазина. Поэтому мне нужен какой-то механизм, который инициализирует данного продавца на странице магазина. И это должно быть выполнено для каждого компонента, от которого зависит эта страница. И это должно быть сделано через параметр GET. У меня может быть такое поведение со сложным решением в прослушивателе preRenderView, но я не чувствую, что это более элегантный способ.

Таким образом, основная проблема заключается в том, как перехватить прямой переход на страницу, данные которой управляются несколькими bean-компонентами (независимо от их области действия), и ввести в сеанс что-то, что будет использоваться. этими бобами в своих действиях.

Я пробовал это (в компонентах SessionScoped):

1) Если я использую @PostConstruct + @ManagedProperty (с параметром), я получаю сообщение об ошибке при создании bean-компонента, потому что bean-компонент SessionScoped

2) Если я использую событие viewParam + preRenderView, параметр вводится перед событием, и я получаю желаемое поведение, НО это происходит каждый раз при загрузке страницы.

Я хочу, чтобы эта инициализация происходила один раз и только один раз, и я хочу использовать параметры GET.

Как мне это сделать?


person Carlos    schedule 04.01.2013    source источник
comment
Это определенно не обычный случай, учитывая, что вы делаете это в bean-компоненте с областью действия сеанса, а не с областью действия запроса или представления. Когда вы сказали, что это происходит каждый раз, когда страница загружается, вы на самом деле не имеете в виду обратные передачи (т.е. при каждой отправке формы (ajax)). Если да, то почему компонент не имеет области видимости? Что именно является конкретным функциональным требованием?   -  person BalusC    schedule 04.01.2013
comment
Ты прав. Я хотел бы преобразовать его как ViewScoped, но я использую Primefaces, а динамическая загрузка графического изображения не работает с компонентами ViewScoped.   -  person Carlos    schedule 04.01.2013
comment
Вместо этого вы можете задать вопрос об этом, чтобы вам не нужно было предлагать другие обходные пути для существующего обходного пути, потому что вы сделали обходной путь вместо решения.   -  person BalusC    schedule 04.01.2013
comment
Это нормальное поведение в ПФ. Поэтому я просто предполагаю, что мне нужно использовать SessionScoped. Я думаю, что это может быть элегантный способ реализовать дело в JSF, а не обходной путь. Если вы скажете, что это действительно необычный случай, я попробую сделать это по-другому.   -  person Carlos    schedule 04.01.2013
comment
Есть ли у вас какие-либо авторитетные ссылки на это нормальное поведение? Это было бы огромной ошибкой или просто неверной интерпретацией с вашей стороны. До сих пор неясно, о какой именно проблеме вы говорите, но если я догадываюсь правильно, этот ответ может уже объяснить и ответить на нее: stackoverflow.com/questions/10073905/ и stackoverflow.com/questions/8207325/   -  person BalusC    schedule 04.01.2013
comment
Привет BalusC. В руководстве пользователя PF указано, что graphicImage не работает в ViewScoped. Тогда предполагается, что он будет работать и с другими прицелами. С SessionScope это работает, с RequestScope — нет (по крайней мере, я не мог заставить его работать). В любом случае, чтобы сохранить этот вопрос по теме, я переориентировал его и обновил исходный вопрос.   -  person Carlos    schedule 05.01.2013
comment
Так ты говоришь о <p:graphicImage> с StreamedContent? Вы читали приведенные ссылки? Вы можете идеально хранить идентификаторы динамического изображения в bean-компоненте с областью видимости, но потоковая передача должна выполняться в отдельном приложении или bean-компоненте с областью запроса.   -  person BalusC    schedule 05.01.2013
comment
в порядке. Помимо проблем с графическим изображением PF, я хотел бы знать, существует ли более элегантный способ выполнения описанного мной случая. Вот почему я обновил вопрос   -  person Carlos    schedule 05.01.2013
comment
Это уже ответили. При прямом переходе (в основном, запрос GET) isPostback() вернет false. Проблема <p:graphicImage> легко разрешима. Вы действительно внимательно прочитали и поняли приведенные ссылки?   -  person BalusC    schedule 05.01.2013


Ответы (1)


Один из способов — просто выполнить задание, только если значение f:viewParam по-прежнему равно null.

public void init() {
    if (value == null) {
        // ...
    }
}

Альтернативой является выполнение задания только для не-постбэков:

public void init() {
    if (!FacesContext.getCurrentInstance().isPostback()) {
        // ...
    }
}

Обратите внимание, что это все равно будет выполняться, когда новый запрос GET запускается в том же сеансе, и что вы обычно хотели бы использовать для этого bean-компонент @ViewScoped, чтобы предотвратить несколько вкладок/окон браузера, мешающих друг другу.

Смотрите также:

person BalusC    schedule 04.01.2013