Вопрос о дизайне JSP / сервлета - Сделать запрос / ответ глобально доступным через JNDI - PullRequest
3 голосов
/ 25 августа 2011

В PHP всегда можно получить доступ к текущему запросу или ответу из любой части своего кода. Эта концепция является фундаментальной для программирования PHP. Всегда есть данные запроса, данные ответа, данные сеанса (и т. Д.) !

Этого не происходит в сервлетах Java! Чтобы иметь доступ к HttpServletRequest, HttpServletResponse, HttpSession (и т. Д.) В вашем коде, вам нужно передать их как переменные функции. Это означает, что вы не можете кодировать веб-фреймворк, который по своей природе «знает» обо всех этих проблемах и устраняет сложность их передачи.

Итак, я разработал это решение:

  1. Создать и зарегистрировать ServletRequestListener.
  2. При событии requestInitialized связать текущий запрос HttpServletRequest с контекстом JNI, указав имя текущего потока (Thread.currentThread (). GetName ());
  3. После события requestDestroyed отсоедините вышеуказанный ресурс JNI для очистки.

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

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

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

Какая-то скрученная, но приятная и простая ...

Что вы думаете?

Ответы [ 2 ]

3 голосов
/ 25 августа 2011

Я думаю, что некоторые веб-фреймворки (GWT, Axis) уже делают это, но гораздо более простым способом: с помощью статической переменной ThreadLocal (или доступной из единственного объекта). Spring также имеет такую ​​возможность.

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

См. Получите объект HttpServletRequest (запрос) из кода Java для аналогичного вопроса (и его ответов).

0 голосов
/ 25 августа 2011

Если вы беспокоитесь о том, что разные запросы могут испортиться (а затем думаете о «подзапросах», как окошко модели), возможно, вы предпочтете использовать Seam ?Они используют абстракцию, называемую «Сессия», для обработки МНОГО того, что мы, разработчики, пытаемся взломать с помощью других традиционных стеков веб-технологий.Шов построен на JSF так же, как к вашему сведению.Вам не нужно использовать EJB 3 или Hibernate с ним, но он прекрасно интегрируется с обоими из них.О чем подумать.

...