powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / jsf: доступ к bean объекту не из jsp страницы.
18 сообщений из 18, страница 1 из 1
jsf: доступ к bean объекту не из jsp страницы.
    #33650952
Michael Ponomarev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Допустим есть следующий объект
Код: plaintext
1.
2.
3.
4.
5.
<managed-bean>
    <managed-bean-name>infoUser</managed-bean-name>
    <managed-bean- class >kis2.InfoUser</managed-bean- class >
    <managed-bean-scope>session</managed-bean-scope>
</managed-bean>
Вопрос, а как собственно достучаться до этого объекта, например, из другого объекта? Пока решил сделать свой(назовем его "внутренний"), помещяемый в сессию руками объект, а infoUser лишь оболочка для доступа из jsp страницы, т.е. если мне нужен доступ из другого класса, то я обращаюсь к "внутреннему" объекту, читая его из сессии. Это правильный способ?
...
Рейтинг: 0 / 0
jsf: доступ к bean объекту не из jsp страницы.
    #33651598
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можно так например:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
   
     protected  kis2.InfoUser getInfoUser() {
        FacesContext context = context();
        ValueBinding vb =
                context.getApplication()
                .createValueBinding("#{infoUser}");
        
         return  ((kis2.InfoUser) vb.getValue(context));
    }
    
    /**
     * <p>Return the <code>FacesContext</code> instance for the
     * current request.
     */
     protected  FacesContext context() {
         return  (FacesContext.getCurrentInstance());
    }
...
Рейтинг: 0 / 0
jsf: доступ к bean объекту не из jsp страницы.
    #33651639
Michael Ponomarev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А как правильнее/удобнее/стандартнее? Есть какие-то уже сложившиеся, хотя-бы неявные стандарты
...
Рейтинг: 0 / 0
jsf: доступ к bean объекту не из jsp страницы.
    #33651850
Hoha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Инъектить

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
<managed-bean>
    <managed-bean-name>infoUser</managed-bean-name>
    <managed-bean- class >kis2.InfoUser</managed-bean- class >
    <managed-bean-scope>session</managed-bean-scope>
</managed-bean>

<managed-bean>
    <managed-bean-name>infoUserDependent</managed-bean-name>
    <managed-bean- class >kis2.InfoUDependent</managed-bean- class >
    <managed-bean-scope>session</managed-bean-scope>

    <managed-property>
        <property-name>infoUser</property-name>
        <property- class >kis2.InfoUserInterface</property- class >
        <value>#{infoUser}</value>
    </managed-property>
</managed-bean>
...
Рейтинг: 0 / 0
jsf: доступ к bean объекту не из jsp страницы.
    #33651900
Michael Ponomarev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т.е. все-таки создавать 2 класса "рабочий" и "для отображения", причем оба описывать в faces-config? Тогда для доступа к "рабочему" из других участков кода надо писать как wessen , я правильно понял?
Кстати, а когда происходит создание класса, описанного в faces-config, в момент 1-го обращения к его свойству?
...
Рейтинг: 0 / 0
jsf: доступ к bean объекту не из jsp страницы.
    #33651973
Hoha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ничего не понимаю - какой "рабочий", какой для "отображения"?
К вышенаписанному участку:

на страницах:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
...

<h:outputText value="#{infoUser.someInfo}"/>

...

<h:inputText value="#{infoUserDependent.anotherImportantField}"/>
...

и т.п. В коде:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
 package  kas2;

...

 public   class  InfoUserDependent{
     private  InfoUserInterface infoUser;

...

     public   void  myVeryUsefulMethod(){
          ...

          getInfoUser().reallyCoolMethod();

          ...
    }

...

     private  InfoUserInterface getInfoUser() {
         return  infoUser;
    }

     public   void  setInfoUser(InfoUserInterface infoUser) {
         this .infoUser = infoUser;
    }
}


Как работает:
фэйсы перехватывают обращения к infoUserDependent - если он уже есть, возвращает.
Если его еще нет - он создается в сессии и ему делается setInfoUser(infoUser). infoUser, опять же, либо уже есть в сессии, либо будет по такому случаю там создан.
...
Рейтинг: 0 / 0
jsf: доступ к bean объекту не из jsp страницы.
    #33652104
Michael Ponomarev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, ясно, только я спрашивал несколько другое :) Попробую на примере объяснить:
Есть окно с пользователем и паролем. Пользователь нажимает кнопку "вход". На обработчике события этой кнопки(надеюсь понятно) я чего-то там проверяю и если удачно, то кладу в сессию руками infoUser. Это я подразумевал под "рабочим" либо "внутренним" объектом, но, если я опишу infoUser в faces-config, то файсы создадут свою версию infoUser ведь так? Откуда им знать, что в сессии уже есть объект infoUser, поэтому я и хотел узнать каким путем идти. А именно
1) создать infoUserWrapper, который будет описан в faces-config и будет лишь враппером над infoUser. Т.о. для доступа из jsp - infoUserWrapper, для доступа из других объектов infoUser.
либо
2) создать infoUser, описать его в faces-config, и каким-либо способом обращаться к нему (например как написал wessen ) из других объектов, для доступа из jsp - стандартным способом.

Вы (ты, как обращаться), рассказали как поле объектного типа объявить в faces-config.

P.S. не надо сильно ругаться, я только начинаю разбираться
...
Рейтинг: 0 / 0
jsf: доступ к bean объекту не из jsp страницы.
    #33652279
Hoha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не ругаюсь я, просто не понял что требовалось.Теперь, похоже, доходит :).
Итак, задача: хранить в сессии свой объект и обращатся к нему со страницы.
Знаю два решения (может, их больше):

1) "Быстро и грязно", то что предложил wessen.

на страницах:

Код: plaintext
<h:outputText value="#{infoUser}"/>

в коде:

Код: plaintext
1.
2.
3.
(InfoUser) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("infoUser");
...
FacesContext.getCurrentInstance().getExternalContext().getSessionMap().set("infoUser",  new  InfoUserImpl(...));

я против такого подхода - классы что-то знают о JSF, а зачем?

2) Создаем отдельный объект для доступа, который похож на wrapper, о котором ты (мы на форуме, а не в салоне :) ) говорил. Я бы воспользовался таким решением:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
//UserSession.java
 public   interface  UserSession {
...
    public  InfoUser getInfoUser(); //InfoUser - интерфейс
    public   void  setInfoUser(InfoUser infoUser);
...
}

//FacesUserSession.java
 public   class  FacesUserSession.java  implements  UserSession{
    private   static   final  String INFO_USER_KEY = "userInfo";

    public  InfoUser getInfoUser(){
       return  (InfoUser) getSessionMap().get(INFO_USER_KEY);
   }

    public   void  setInfoUser(InfoUser infoUser){
      getSessionMap().set(INFO_USER_KEY, infoUser);
   }

    private  getSessionMap(){
       return  FacesContext.getCurrentInstance().getExternalContext().getSessionMap();
   }
}


В конфиге проставляем FacesUserSession в UserOfInfoUser.

в коде используем:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
//UserOfInfoUser.java :)
 public   class  UserOfInfoUser {
   UserSession userSession;

...

     public   void  myUsefulMethod(){
         getUserSession().getInfoUser().someCoolMethod(); 
...
         getUserSession().setInfoUser( new  InfoUserImpl(...)); 
    }

...

    private  UserSession getUserSession() {
       if (userSession ==  null ){
            throw   new  MissingResourceException("use setUserSession() .. blah-blah");
      }

       return  userSession;
   }; 

    public   void  setUserSession(UserSession userSession){ //здесь инъектится фэйсами
       if (userSession ==  null ){
           throw   new  IllegalArgumentException("blah-blah");
      }

       this .userSession = userSession;                 
   }
...
}


теперь в страницах:

Код: plaintext
1.
<h:outputText value="#{userSession.infoUser.someField}"/>
...
Рейтинг: 0 / 0
jsf: доступ к bean объекту не из jsp страницы.
    #33652352
Michael Ponomarev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Читаю, думаю, спасибо. Что-то интуиция предлагает выбрать способ 2 :)
И все-таки, чтобы небыло неясности по 1 способу: если я положу в сессию объект (пусть все тот же infoUser), но на этот момент к нему небыло ни одного обращения из jsp, то при первом обращении к какому либо св-ву этого объекта из jsp файсы поместят в сессию свой объект. Откуда им знать что я создал переменную класса InfoUser и поместил ее в сесию. Я правильно рассуждаю или нет? (по крайне мере у меня не получалось (MyFaces))
...
Рейтинг: 0 / 0
jsf: доступ к bean объекту не из jsp страницы.
    #33652394
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2) создать infoUser, описать его в faces-config, и каким-либо способом обращаться к нему (например как написал wessen) из других объектов, для доступа из jsp - стандартным способом.


Ты правильно все понял. Так и делай. То, что предлагает сделать Хоха, я, по правде сказать не понимаю, к чему все это???:) И более того, использование вот такого:

Код: plaintext
1.
2.
3.
...
FacesContext.getCurrentInstance().getExternalContext().getSessionMap();
...

не рекомендуется. Тут действительно можно наломать дров. Используй метод, который предложил я, т.е. работа с объектами описанными в faces-config.xml ведется через EL (ExpresionLanguage). При обращении к методу getInfoUser(), если объекта(InfoUser) еще нет в сессии, то он создается, если есть, то он просто возвращается.
...
Рейтинг: 0 / 0
jsf: доступ к bean объекту не из jsp страницы.
    #33652412
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторОткуда им знать что я создал переменную класса InfoUser и поместил ее в сесию.

как откуда? :) Имя то известно и почему бы не проверить, есть такое в сессии или нет?

Если ты правда на прямую будешь писать в сессию -getSessionMap()... То можешь просто затереть старое значение.
...
Рейтинг: 0 / 0
jsf: доступ к bean объекту не из jsp страницы.
    #33652492
Hoha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wessen - про использование getExternal.... вполне поверю, честное слово, проморгал как было написано у тебя. Заменяем содержимое getInfoUser и setInfoUser(InfoUser)

Зачем нужно все остальное я написал - классы, отвечающие за поведение не должны знать о реализации сессии. Внешний контекст (в данном случае - то, где лежат общие данные) им стОит инъектить.
...
Рейтинг: 0 / 0
jsf: доступ к bean объекту не из jsp страницы.
    #33652564
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЗачем нужно все остальное я написал - классы, отвечающие за поведение не должны знать о реализации сессии.

Не совсем понимаю. Мой метод getInfoUser() можно поместить куда угодно.

И зачем нужен метод addInfoUser() тоже не понимаю.
...
Рейтинг: 0 / 0
jsf: доступ к bean объекту не из jsp страницы.
    #33652600
Michael Ponomarev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 wessen
Может конечно и я где ошибся. Но простейший пример страница, кнопка, обработчик события, в нем создаем объект и кладем его в сессию. Описываем <managed-bean> и <navigation-rule> переходим на новую страницу, обращаемся к свойству этого объекта(это первое обращение) получаем засаду. По крайне мере у меня (Tomcat 5.5.16 + JDK 1.4.2_10 + MyFaces)
2 wessen, Hoha
а чем чревато
Код: plaintext
FacesContext.getCurrentInstance().getExternalContext().getSessionMap()
...
Рейтинг: 0 / 0
jsf: доступ к bean объекту не из jsp страницы.
    #33652638
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Michael Ponomarev
покажи код
...
Рейтинг: 0 / 0
jsf: доступ к bean объекту не из jsp страницы.
    #33652777
Michael Ponomarev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
немного упростил, но смысл такой
faces-config
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
<faces-config>
    <managed-bean>
        <managed-bean-name>beanAuthorization</managed-bean-name>
	<managed-bean- class >kis2.BeanAuthorization</managed-bean- class >
	<managed-bean-scope>request</managed-bean-scope>
    </managed-bean>
    
    <managed-bean>
        <managed-bean-name>beanInfoUser</managed-bean-name>
	<managed-bean- class >kis2.BeanInfoUser</managed-bean- class >
	<managed-bean-scope>session</managed-bean-scope>
    </managed-bean>
    
    <navigation-rule>
        <from-view-id>/login.jsp</from-view-id>
	<navigation- case >
            <from-outcome> 1 </from-outcome>
            <to-view-id>/find.jsp</to-view-id>
	</navigation- case >
        <navigation- case >
            <from-outcome> 0 </from-outcome>
            <to-view-id>/index.jsp</to-view-id>
	</navigation- case >
    </navigation-rule>
</faces-config>

BeanAuthorization
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
 package  kis2;

 import  java.sql.SQLException;
 import  javax.faces.context.FacesContext;

 public   class  BeanAuthorization {
    
     private  String login = "";
     private  String password = "";
    
     public  String getLogin() {
         return  login;
    }

     public   void  setLogin(String login) {
         this .login = login;
    }

     public  String getPassword() {
         return  password;
    }

     public   void  setPassword(String password) {
         this .password = password;
    }
    
     public  String doAuthorization() {
         int  result =  0 ;
        login = "mylogin"; // ВРЕМЕННО !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
        result =  1 ; // ВРЕМЕННО !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
        
        // если авторизация успешна
        // здесь естественно предварительно чтение beanInfoUser и проверка на null
        // только потом new
         if  (result ==  1 ) {
            BeanInfoUser beanInfoUser =  new  BeanInfoUser(login);
            FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("beanInfoUser", beanInfoUser);
        }
         return  Integer.toString(result);
    }

BeanInfoUser
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
 package  ic.kis2;

 import  javax.faces.context.FacesContext;

 public   class  BeanInfoUser {
    
     private  login = "";
    
     public  BeanInfoUser(String login) {
         this .login = login
    }
    
     public  String getLogin() {
         return  login;
    }
    
     public  String setLogin(String login) {
         this .login = login;
    }
    
}

login.jsp
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
<%@ page contentType="text/html;charset=windows-1251" pageEncoding="windows-1251" %>

<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>

<f:view>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
    </head>
    <body>
    <div align="center">
    <h:form>
        <table>
            <tbody>
                <tr>
                    <td>Пользователь:</td>
                    <td><h:inputText value="#{beanAuthorization.login}"/></td>
                </tr>
                <tr>
                    <td>Пароль:</td>
                    <td><h:inputSecret value="#{beanAuthorization.password}"/></td>
                </tr>
            </tbody>
        </table>
        <h:commandButton value="Вход" action="#{beanAuthorization.doAuthorization}"/>
    </h:form>
    </div>
    </body>
</html>
</f:view>

find.jsp
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
<%@ page contentType="text/html;charset=windows-1251" pageEncoding="windows-1251" %>

<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<f:view>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
        <title></title>
    </head>
    <body>
         Вы авторизованы как '<h:outputText value="#{beanInfoUser.login}"/>'
    </body>
</html>
</f:view>
...
Рейтинг: 0 / 0
jsf: доступ к bean объекту не из jsp страницы.
    #33653036
Hoha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wessenНе совсем понимаю. Мой метод getInfoUser() можно поместить куда угодно.
И зачем нужен метод addInfoUser() тоже не понимаю.

Понятно, что можно поместить. Но я предпочитаю кода типа FacesContext.getCurrentInstance()... в классах, реализующих логику, не видеть - привередливый :). Пусть за это отвечает другой объект, которому занятся нечем. + инкапсуляция. Пример: ты сейчас про sessionMap сказал - я поменял два метода в одном классе и все операции с общими данными теперь проходят через ValueBinding. Представляю себе правку тех же 2х методов в 10 классах.
setInfoUser(...) нужен для установки в сессию своего объекта.

Michael Ponomarev, про sessionMap не знаю. У wessen, похоже, больше опыта - я тоже с удовольствием узнал бы объяснение. Насчет твоего кода - выложи текст исключения, так проще.
...
Рейтинг: 0 / 0
jsf: доступ к bean объекту не из jsp страницы.
    #33653060
Michael Ponomarev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По поводу текста исключения выложу попозже, сейчас лень окатывать все.

Все-таки мне тоже кажется, что логика в одних классах, а за отображение пусть отвечают другие, bean - классы. Я так понял это вопрос вкуса и стиля программирования, о них как известно спорить тяжело :)

2wessen можно поподробнее чем чревато
FacesContext.getCurrentInstance().getExternalContext().getSessionMap()
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / jsf: доступ к bean объекту не из jsp страницы.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]