Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Взаимодействие двух JSF-приложений


Автор: Maverick 28.5.2007, 14:59
Уважаемые, помогите советом...

Существуют два отдельных приложения JSF+EJB3... Для примера, БАНКИ и АДРЕСА... В одном существует сущность Банкир, в котором используется сущность Адрес... И так есть JSF- форма для редактирования данных по Банкиру, в котром есть поле с демонстрацией текущего Адреса банкира... поле снабжено кнопкой для редактирования Адреса, которое должно переводить нас на форму редактирования Адреса...

Каким образом организовать взаимодействие? Необходимо:
1) Передавать в форму Адресов идентификатор текущего адреса..
2) В случае отсутствия Адреса - передавать сигнал об этом и впоследствии предать форме Банкира идентификатор нового адреса... 
3) Осуществлять слежение за маневрами пользователя для корректного возвращения в исходную страницу... 

    Я пошел простым путем - формирую URL с параметрами http://бла-бла?parameter=1... но это меня пока не вполне устраивает... 

возникают вопросы:
каким образом, можно установить с какой страницы я пришел на эту JSF-страницу?  
каким наиболее простым образом можно эти параметры вытащить из URL текущей страницы?
каким образом можно указать правильный контекстный URL? поскольку абсолютные адреса слишком неудобны... 

И вообще правильно ли я поступаю...?? smile 

Автор: AntonSaburov 28.5.2007, 17:12
Я честно говоря не сталкивался с такой ситуацией - запоминать страницу, на которую надо вернуться.
Варинатов я виже несколько:
1. Можно сделать нечто вроде параметра BACK на странице, который будет представлять из себя просто URL. Каждый сервлет, который будет вызывать какую-то страницу фомирует также и такую ссылку.
2. Запоминать URL в сессии для пользователя и делать специальную команду BACK на нужной странице. При вызове команды извлекать необходимую информацию из сессии и отправляться туда, куда сказано smile

Наверняка можно придумать что-то еще.

Автор: ekr 28.5.2007, 17:31
Цитата

каким образом, можно установить с какой страницы я пришел на эту JSF-страницу?

можно проанализировать http-заголовок http-referer

Цитата

каким образом можно указать правильный контекстный URL? поскольку абсолютные адреса слишком неудобны...
И вообще правильно ли я поступаю...?? 

организация взаимодействия независимых приложений - всегда геморрой, т.к. они не разделяют общие серверные ресурсы (jsf backing beans, http sessions, etc).
мораль - связать их можно или как ты делаешь, по клиентскому слою (параметры), или по общему серверному ресурсу (т.к. приложения разные, они ничего не разделяют, в т.ч. ServletContext), например, данным в БД. 
FYI: Для асинхронных веб-сервисов часто применяется хранение состояния клиента в БД.

Автор: batigoal 28.5.2007, 19:00
Цитата(ekr @  28.5.2007,  18:31 Найти цитируемый пост)
можно проанализировать http-заголовок http-referer

Этот метод не дает полной гарантии.

Автор: Maverick 29.5.2007, 08:59
Цитата(ekr @  28.5.2007,  17:31 Найти цитируемый пост)
организация взаимодействия независимых приложений - всегда геморрой

Это я уже понял...  smile 


Цитата(AntonSaburov @  28.5.2007,  17:12 Найти цитируемый пост)
Я честно говоря не сталкивался с такой ситуацией - запоминать страницу, на которую надо вернуться.

Дело в том, что Адрес есть не только у Банкира, но и у Банка, и у Клиента... Таким образом, нужно всегда знать - откуда пришел редактировать Адрес, чтобы вернуться назад, к нужной форме.... 

И все-таки, каким наиболее простым образом можно эти параметры вытащить из URL текущей страницы?

Дело в том, что в сервлете вроде понятно как это сделать.. а в JSF-странице? Куда тыкаться? Как проанализировать - какой URL у страницы?

Добавлено через 6 минут и 50 секунд
Цитата(ekr @  28.5.2007,  17:31 Найти цитируемый пост)
по общему серверному ресурсу (т.к. приложения разные, они ничего не разделяют, в т.ч. ServletContext), например, данным в БД. 


Пришла в голову шальная мысль - если создать EJB для связи.. подрубить его в оба проекта... и в нем хранить необходимые данные?? не слишком ли?

Автор: YuG 29.5.2007, 09:34
Мысли вслух:
всю дополнительную информацию (URL и проч.) сохранять в каком-нибудь Map'e.
А сам Map хранить в application scope.
Ну а в request'e передавать параметром key нашего Map'a.

(понятно, что нужен дополнительный класс-manager для работы с этой табличкой - добавлять данные, очищать мусор и проч.)

Автор: Maverick 29.5.2007, 10:00
Цитата(YuG @  29.5.2007,  09:34 Найти цитируемый пост)
понятно, что нужен дополнительный класс-manager для работы с этой табличкой - добавлять данные, очищать мусор и проч.


ну так этот класс-manager - это ведь EJB? Более легкого способа работы с таблицей я не знаю... 

Автор: YuG 29.5.2007, 13:59
Maverick, нет, под таблицей я имел ввиду Map )
И EJB в моем простейшем варианте не нужны.

Автор: Maverick 29.5.2007, 15:15
При переходе из приложения в приложение - идентификатор сессии измениться? И вообще - как правильно работать в JSF с сессией... ну хотя бы получить ее идентификатор??

Автор: ekr 29.5.2007, 16:09
Цитата

А сам Map хранить в application scope

насколько я понял из постановки задачи, приложения разворачиваются как или независимые war или  ear.  в этом случае они не разделяют servletcontext.

Цитата

 если создать EJB для связи.. подрубить его в оба проекта... и в нем хранить необходимые данные?? не слишком ли?

ejb для связи.... попробуй создать на базе одного ejb- или web-приложения фасад поверх всех твоих банкиров и пр. думается, это будет крайне неплохой путь.

Автор: Maverick 29.5.2007, 16:40
Цитата(ekr @  29.5.2007,  16:09 Найти цитируемый пост)

насколько я понял из постановки задачи, приложения разворачиваются как или независимые war или  ear.  в этом случае они не разделяют servletcontext.


абсолютно верно... отдельные ear...
Цитата(ekr @  29.5.2007,  16:09 Найти цитируемый пост)
ejb для связи.... попробуй создать на базе одного ejb- или web-приложения фасад поверх всех твоих банкиров и пр. думается, это будет крайне неплохой путь.


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

Автор: ekr 29.5.2007, 16:53
Цитата

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

не волнуйся, и это пройдет ))

смотри: вместо сцепки (не смейся, есть такой термин в теории языков программирования) двух приложений по внешним данным (вншн БД) или по параметрам (как ты вначале хотел) можно использовать design pattern фасад.

что это значит: ты имеешь два независимых ejb-приложения (банкиры и чего-то там), и к ним у тебя два независимых клиента (web-apps). вместо двух этих независимых ты делаешь одно, которое будет взаимодействовать с обоими бинами. это и будет фасадом )
в нем у тебя уже таких проблем описанных тобой. не будет )

Автор: Maverick 29.5.2007, 16:58
неа... так не прокатит... дело в том, что адрес используется очень много где (около 20 приложений)... система общая из модульной превратиться в единую... будет одно гигантское приложение... тоже будет нерадостно....  smile     мы уже думали об этом.... но слишком уж годзильно получается... лучше все-таки механизм взаимодействия продумать единый... 

Автор: ekr 29.5.2007, 17:05
Цитата

система общая из модульной превратиться в единую... будет одно гигантское приложение... 

отнюдь. ты деплоишь бин адреса как независимый jar-модуль и к нему останется доступ из остальных приложений. абсолютно независимых )

Цитата

лучше все-таки механизм взаимодействия продумать единый... 

ок, смотрите сами ) фишка паттерна фасад как раз в том, что приложения так и остаются независимыми, а эта надстройка - фасад - только как точка входа для клиентов. там изнес-логику сложную вообще можно не внедрять, только интерфейсную, для людишек )))

Автор: Maverick 29.5.2007, 17:07
Цитата(ekr @  29.5.2007,  17:05 Найти цитируемый пост)
Цитата

система общая из модульной превратиться в единую... будет одно гигантское приложение... 

отнюдь. ты деплоишь бин адреса как независимый jar-модуль и к нему останется доступ из остальных приложений. абсолютно независимых )


да... все EJB будут отдельными jar... но web-приложение-то будет одно?

Автор: ekr 29.5.2007, 17:11
Цитата

но web-приложение-то будет одно?

да. а что вас смущает? вынесите оттуда всю серьезную логику на слой бинов, и пусть их хоть 23 будет )

если так сделать, то можно будет это приложение как перчатки менять )

Автор: COVD 29.5.2007, 17:18
Типичный пример сервиса - сервис по обработке платежей через кредитную карту. Это как правило сервис, предоставляемый третьей стороной. Когда клиент должен оплатить услугу, он идет по ссылке на  сайт сервиса. В ссылку в виде параметра вставляются 2 адреса, на которые сервис по завершению процедуры перенаправит клиента - один адрес для успешного завершения, другой - для сообщения об ошибке. Наверное, JSF компоненты тоже могут реализовать такой подход.  

Автор: ekr 29.5.2007, 17:20
COVD, все абсолютно верно )
как раз этот подход в самом начале форума и обсуждался (параметры).

PS занимаешься online-платежами?

Автор: COVD 29.5.2007, 17:29
Цитата

PS занимаешься online-платежами?


занимался когда-то


Автор: Zamuta 29.5.2007, 17:34
Maverick, может это тебе поможет http://www.ibm.com/developerworks/ru/library/j-jtp07294/index.html# 

Автор: ekr 29.5.2007, 17:46
Zamuta, это немного не про обсуждаемую тему....
в статье описывается методики репликации сессии в кластерном решении между узлами кластера, чень специфическая шняга...

Автор: Maverick 4.6.2007, 13:09
Короче тихий ужас... реализовал я EJB с полями типа "текущая страница", "предыдущая страница", "список параметров" по ключу "принципал"... подрубил его к готовым проектам...  на выходе из страницы записываем параметры и откуда ушли... на другой странице записываем, где находимся и считываем параметры... Только, блин, JSF при выполнении правил навигации как-то странно это все отрабатывает....

Добавлено через 1 минуту и 7 секунд
Если будут еще какие предложения - напишите, плиз... Любые идеи...  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)