Атрибут сеанса EL и доступ к управляемому компоненту

Меня смущает синтаксис связи bean-view на языке выражений 2. Прежде всего. Возможно ли иметь еще один управляемый bean-компонент с тем же именем, но с разными scobes. С другой стороны, если речь идет о доступе к ним через язык выражений; учтите, что в сеансе есть атрибут под названием DemoBean, а также есть управляемый bean-компонент Scobed сеанса под названием DemoBean, если я попытаюсь получить доступ к этому bean-компоненту через EL, например, # {DemoBean} // ссылается на bean-компонент или атрибут ? они говорят, что # {sessionScobe} - это способ доступа к атрибутам сеанса, но
допустим только # {sessionattributename}? и когда я помещаю объект на карту сеанса, он ссылается или копируется?


person daemonThread    schedule 07.04.2013    source источник


Ответы (1)


Цель JSF - управлять атрибутами сеанса за вас. Это означает, что вам следует забыть о сохранении / восстановлении атрибутов карты сеанса вручную, потому что вы сможете сделать это, используя механизмы JSF.

Если вы хотите сохранить некоторую информацию для всего приложения, используйте аннотацию @ApplicationScoped в управляемом компоненте. Вы можете сделать то же самое для сеансов, запросов или конкретных представлений, используя аннотации @SessionScoped, @RequestScoped и @ViewScoped.

Итак, если вы хотите сохранить какой-либо атрибут в сеансе:

@ManagedBean
@SessionScoped
public class SessionScopedBean{

    public String sessionAttribute;

    //Getter and setter

}

Вы можете восстановить / изменить значение атрибута bean-компонента с помощью FacesContext :

FacesContext context = FacesContext.getCurrentInstance();
SessionScopedBean bean = (SessionScopedBean) context.getApplication()
    .evaluateExpressionGet(context, "#{sessionScopedBean}", SessionScopedBean.class);
bean.setSessionAttribute("value");

Помните, что bean-компоненты JSF по умолчанию называются именем bean-компонента с первым символом в нижнем регистре. И помните также, что этот bean-компонент будет нулевым при первом обращении, если вы не инициализируете себя. Вы можете легко сделать это, используя PreRenderViewEvent в компоненте, который вы хотите инициализировать и выполнить его, например, на странице входа. Это гарантирует, что компонент будет работать до конца сеанса.

Наконец, таким образом вы получите доступ к атрибуту сеанса из вашего представления:

#{sessionScopedBean.sessionAttribute}

person Xtreme Biker    schedule 07.04.2013
comment
Спасибо за советы, но когда я помещаю объект на карту сеанса, он ссылается или копируется? - person daemonThread; 07.04.2013
comment
Поскольку java ссылается на свои объекты, на нее будут ссылаться. Таким образом, если вы измените значение объекта, оно также будет изменено на карту (в конце атрибуты сеанса также сохраняются в карте). Однако, как я уже сказал, избавьтесь от этого при использовании JSF. - person Xtreme Biker; 08.04.2013
comment
При создании нового управляемого bean-компонента с ограничением сеанса, он неявно добавляется в sessionmap? поэтому доступ к нему через req.getSession (). getAttribute (учетные данные); правда? Я спрашиваю об этом, потому что у меня есть фильтр входа в систему и управляемый бин с ограничением сеанса, называемый учетными данными. В фильтрах инъекция зависимостей не разрешена и FacesContext # getExternalContext (). GetSessionMap (). Get (credentials); возвращает null, мы не можем получить доступ к контексту лиц в фильтре, поэтому я думаю, что только атрибут сеанса швов. - person daemonThread; 08.04.2013
comment
Да, в фильтре, который должен выполнять эту работу, поскольку JSF-бины хранятся в карте сеанса в атрибуте с их именем. Помните, что если это возвращает null, вероятно, потому, что он не инициализирован. Просто вызовите какой-нибудь метод компонента или инициализируйте его вручную перед вызовом фильтра. - person Xtreme Biker; 08.04.2013