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