Как интегрировать JSF с пользовательскими сервлетами? - PullRequest
3 голосов
/ 26 февраля 2010

Я только начинаю работать с JavaServer Faces, и это выглядит очень привлекательно. Однако я бы хотел использовать свои собственные сервлеты в том же веб-приложении, что и JSF.

Это может быть действительно очевидным, но каковы лучшие практики для интеграции JSF с "нормальным" приложением на основе сервлетов? Это включает доступ к данным JSF из сервлетов (чтение и запись ).

Ответы [ 2 ]

8 голосов
/ 26 февраля 2010

Если ваши сервлеты хорошо написаны, они уже не должны иметь какую-либо бизнес-логику внутри, а просто логику управления запросом / ответом / предварительной обработкой / постобработкой. Бизнес-логика уже должна быть размещена в автономных javabean-подобных классах доменов / моделей. Логика базы данных уже должна быть помещена в отдельные классы DAO. И так далее. Вы можете просто повторно использовать их все в JSF.

Тем не менее, может быть полезно знать, что JSF (при работе поверх Servlet API - в общем случае) управляет компонентами, определяющими размер запроса, как атрибутами HttpServletRequest, а объектными компонентами - как атрибутами HttpSession. , приложение определяет область действия bean-компонентов как атрибуты ServletContext. Также может быть полезно знать, что все эти атрибуты запроса, сеанса и приложения доступны для ExternalContext#getRequestMap(), #getSessionMap() и #getApplicationMap(). Теперь вы должны понимать, что вы можете просто получить к ним доступ обычным способом из сервлета.

В любом случае, когда есть техническая необходимость , необходим для доступа к FacesContext внутри Servlet или Filter, затем немедленно прекратите его кодирование и переосмыслите свой подход на основе приведенных выше фактов. Не лучше ли это сделать в новом управляемом бобе? Или, может быть, PhaseListener?

1 голос
/ 26 февраля 2010

Вам не нужно интегрировать сервлеты с JSF. Это противоречит природе JSF, которая «основана на компонентах», а не «основана на действиях».

JSF управляет компонентами, методы которых вызываются при нажатии кнопки. У вас есть и запрос, и ответ (используя FacesContext.getCurrentContext().getExternalContext()), но они на самом деле не нужны - все данные автоматически заполняются JSF в полях управляемого компонента.

Если вы хотите, чтобы сервлеты не интегрировались с JSF, но работали в одном приложении, вам просто нужно сопоставить их с URL-адресом, который не конфликтует с URL-адресом сервлета JSF.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...