Обновить управляемый сеансовый компонент в JSF 2.0

После того, как я передам некоторые данные в базу данных, я хочу, чтобы мои сеансовые компоненты автоматически обновлялись, чтобы отражать недавно зафиксированные данные. Как этого добиться при использовании управляемых сеансовых компонентов в JSF 2.0?

В настоящее время мне нужно перезапустить веб-сервер, чтобы сеансы очищались и снова загружались.


person D. Bermudez    schedule 11.10.2011    source источник


Ответы (1)


2 способа:

  1. Вместо этого поместите их в область просмотра. Хранение данных, специфичных для представления, во всем сеансе — пустая трата времени. Если у вас есть проблемы с производительностью, вам следует сосредоточиться на реализации пула соединений, разбиения на страницы на уровне БД и/или кэширования на уровне сохраняемости (например, JPA2 поддерживает кэширование второго уровня).

    @ManagedBean
    @ViewScoped
    public class FooBean {
        // ...
    }
    

  2. Добавьте общедоступный метод load(), чтобы его можно было вызывать из метода действия (при необходимости из другого компонента).

    @ManagedBean
    @SessionScoped
    public class FooBean {
    
        private List<Foo> foos;
    
        @EJB
        private FooService fooService;
    
        @PostConstruct
        public void load() {
            foos = fooService.list();
        }
    
        // ...
    }
    

    который можно вызвать в методе действия внутри одного и того же компонента (если вы, конечно, отправляете форму в тот же управляемый компонент):

        public void submit() {
            fooService.save(foos);
            load();
        }
    

    или из метода действия в другом bean-компоненте (в случае, если ваш дизайн управляемого bean-компонента немного отличается от обычного):

        @ManagedProperty("#{fooBean}")
        private FooBean fooBean;
    
        public void submit() {
            fooService.save(foos);
            fooBean.load();
        }
    

    Это, конечно, влияет только на текущий сеанс. Если вы хотите воздействовать и на другие сеансы, вам действительно следует подумать о том, чтобы вместо этого поместить их в область представления, как это предлагается в первом способе.

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

person BalusC    schedule 11.10.2011
comment
На самом деле это решение будет работать, но я обнаружил, что когда вы используете один и тот же компонент для 3 разных страниц JSF, значения компонента теряются между страницами. Мне нужно сохранить эти значения. - person D. Bermudez; 13.10.2011
comment
Затем сделайте представление bean-компонента ограниченным, как было предложено 1-м способом. Очевидно, что это вообще не должен быть bean-компонент с областью действия сеанса. См. также: Области управляемого компонента - person BalusC; 13.10.2011
comment
Я понимаю... все мои управляемые компоненты должны иметь ViewScoped, если я хочу, чтобы они сохраняли значения в сеансе и использовали их на других страницах. - person D. Bermudez; 13.10.2011
comment
Нет. Они должны иметь область просмотра, если вы хотите использовать один и тот же компонент для каждого представления. Таким образом, каждая вкладка/окно браузера будет иметь свой собственный экземпляр компонента. Они НЕ передаются друг другу на протяжении всего сеанса. Для этого вам понадобится bean-компонент сеанса. - person BalusC; 13.10.2011
comment
О, хорошо. Спасибо, Balus C... Думаю, теперь я разбираюсь в различных типах прицелов. - person D. Bermudez; 13.10.2011
comment
@BalusC, ты мужчина! Почему вы так хороши в JSF? Куда бы я ни пошел, я нахожу твое имя... - person stuckedoverflow; 23.01.2015