Настройка параметра разрешения экрана, сессионный компонент и JSF Phase Listener

В настоящее время я столкнулся со следующей проблемой, и я был бы признателен, если бы кто-нибудь мог мне помочь здесь. Я новичок в JSF...

У меня есть приложение JSF со следующей архитектурой: основной сайт index.html содержит Javascript, который открывает XMLHttpRequest для сервлета с параметрами разрешения экрана пользователя. Сервлет получает запрос, извлекает параметры разрешения экрана и отправляет их объекту сеансового компонента:

String wth = request.getParameter("width");
String hgt = request.getParameter("heigh");
HttpSession session = request.getSession(true);
Object o = session.getAttribute("mainSessionBean");
MainSessionBean mainSessionBean = (MainSessionBean) o;
mainSessionBean.setScreenWidth(wth);
mainSessionBean.setScreenHeight(hgt);

Теперь это работает по-своему, проблема в том, что на самой первой странице (index.html) объект сеансового компонента не имеет параметра, но если мы перейдем на другой сайт, сеансовый компонент имеет параметр. Я считаю, что это означает, что index.html отображается/создается до создания объекта сеансового компонента. Если мы перейдем на другой сайт, объект сеансового компонента имеет необходимые значения размера экрана. Итак, где я сейчас, так это в том, что я могу динамически настраивать элементы JSF в соответствии с разрешением экрана пользователя, но только со второй посещенной страницы и далее.

Чего я хотел бы добиться, так это того, что Javascript инициирует свой XMLHttpRequest к сервлету, затем сервлет вызывает сеансовый компонент, передает необходимое разрешение размера экрана, и когда создается первая страница, необходимые параметры уже на месте.

Я не совсем уверен, что делаю это правильно, но буду признателен за любой совет, ссылку на нужный ресурс.


person Balazs Tamas    schedule 03.11.2012    source источник


Ответы (1)


Процесс:

  1. Ваш браузер отправляет HTTP-запрос на ваш сервер

  2. Ваш сервер инициализирует сеанс и отвечает страницей index.html

  3. Ваш javascript отправляет обратно размеры экрана

Как вы хотите, чтобы размеры экрана были доступны в точке 2? Лучшее, что вы можете сделать, это после пункта 3 автоматически перезагрузить страницу index.html (сделайте проверку, если это первый запрос в сеансе, просто отправьте JS и перенаправление, если он не отправляет фактический html для входа)

person SJuan76    schedule 03.11.2012
comment
SJuan, Спасибо за ответ, я думал о опции перезагрузки, которая затем гарантирует, что поддерживающий компонент имеет необходимые параметры со стороны клиента, таким образом создавая элементы JSF с правильными размерами, но я попытался избежать ненужной перезагрузки. - person Balazs Tamas; 04.11.2012
comment
Если я реализую это решение, как мне проверить, является ли сеанс новым, достаточно ли метода isNew() для этой цели? - person Balazs Tamas; 04.11.2012
comment
Вы можете просто проверить, установлены ли атрибуты экрана. Проблема с этим подходом заключается в том, что если чей-то браузер не отправит JS, он сломается. - person SJuan76; 04.11.2012
comment
Спасибо, попробую еще раз. - person Balazs Tamas; 05.11.2012