Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / jsf: доступ к bean объекту не из jsp страницы. / 18 сообщений из 18, страница 1 из 1
07.04.2006, 09:52
    #33650952
Michael Ponomarev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
jsf: доступ к bean объекту не из jsp страницы.
Допустим есть следующий объект
Код: 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
07.04.2006, 12:08
    #33651598
wessen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
jsf: доступ к bean объекту не из jsp страницы.
можно так например:

Код: 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
07.04.2006, 12:18
    #33651639
Michael Ponomarev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
jsf: доступ к bean объекту не из jsp страницы.
А как правильнее/удобнее/стандартнее? Есть какие-то уже сложившиеся, хотя-бы неявные стандарты
...
Рейтинг: 0 / 0
07.04.2006, 12:58
    #33651850
Hoha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
jsf: доступ к bean объекту не из jsp страницы.
Инъектить

Код: 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
07.04.2006, 13:08
    #33651900
Michael Ponomarev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
jsf: доступ к bean объекту не из jsp страницы.
Т.е. все-таки создавать 2 класса "рабочий" и "для отображения", причем оба описывать в faces-config? Тогда для доступа к "рабочему" из других участков кода надо писать как wessen , я правильно понял?
Кстати, а когда происходит создание класса, описанного в faces-config, в момент 1-го обращения к его свойству?
...
Рейтинг: 0 / 0
07.04.2006, 13:26
    #33651973
Hoha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
jsf: доступ к bean объекту не из jsp страницы.
Ничего не понимаю - какой "рабочий", какой для "отображения"?
К вышенаписанному участку:

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

Код: 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
07.04.2006, 13:57
    #33652104
Michael Ponomarev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
jsf: доступ к bean объекту не из jsp страницы.
Спасибо, ясно, только я спрашивал несколько другое :) Попробую на примере объяснить:
Есть окно с пользователем и паролем. Пользователь нажимает кнопку "вход". На обработчике события этой кнопки(надеюсь понятно) я чего-то там проверяю и если удачно, то кладу в сессию руками 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
07.04.2006, 14:39
    #33652279
Hoha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
jsf: доступ к bean объекту не из jsp страницы.
Не ругаюсь я, просто не понял что требовалось.Теперь, похоже, доходит :).
Итак, задача: хранить в сессии свой объект и обращатся к нему со страницы.
Знаю два решения (может, их больше):

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
07.04.2006, 14:57
    #33652352
Michael Ponomarev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
jsf: доступ к bean объекту не из jsp страницы.
Читаю, думаю, спасибо. Что-то интуиция предлагает выбрать способ 2 :)
И все-таки, чтобы небыло неясности по 1 способу: если я положу в сессию объект (пусть все тот же infoUser), но на этот момент к нему небыло ни одного обращения из jsp, то при первом обращении к какому либо св-ву этого объекта из jsp файсы поместят в сессию свой объект. Откуда им знать что я создал переменную класса InfoUser и поместил ее в сесию. Я правильно рассуждаю или нет? (по крайне мере у меня не получалось (MyFaces))
...
Рейтинг: 0 / 0
07.04.2006, 15:05
    #33652394
wessen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
jsf: доступ к bean объекту не из jsp страницы.
2) создать infoUser, описать его в faces-config, и каким-либо способом обращаться к нему (например как написал wessen) из других объектов, для доступа из jsp - стандартным способом.


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

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

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

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

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

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

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

И зачем нужен метод addInfoUser() тоже не понимаю.
...
Рейтинг: 0 / 0
07.04.2006, 15:51
    #33652600
Michael Ponomarev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
jsf: доступ к bean объекту не из jsp страницы.
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
07.04.2006, 16:01
    #33652638
wessen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
jsf: доступ к bean объекту не из jsp страницы.
2Michael Ponomarev
покажи код
...
Рейтинг: 0 / 0
07.04.2006, 16:28
    #33652777
Michael Ponomarev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
jsf: доступ к bean объекту не из jsp страницы.
немного упростил, но смысл такой
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
07.04.2006, 17:39
    #33653036
Hoha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
jsf: доступ к bean объекту не из jsp страницы.
wessenНе совсем понимаю. Мой метод getInfoUser() можно поместить куда угодно.
И зачем нужен метод addInfoUser() тоже не понимаю.

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

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

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

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


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