FacesContext и контекст сервлета

есть ли эквивалент FacesContext, но в среде сервлета?

У меня есть некоторый DAOSessionManager, который обрабатывает транзакции в моей базе данных. Я могу использовать FacesContext для идентификации текущего HTTP-запроса, когда текущая страница написана с использованием JSF, но как насчет сервлетов?

Я не могу найти способ получить текущий контекст сервлета или httpRequest...

Спасибо.

PS: да, ссылка на FacesContext из моего слоя DAO — это позор, но это только начало.


person Francois    schedule 20.09.2010    source источник


Ответы (1)


Это ServletContext. Он доступен внутри классов сервлетов унаследованным getServletContext() метод.

protected void doGet(HttpServletRequest request, HttpServletResponse response) {
    ServletContext context = getServletContext();
    // ...
}

Основное отличие от FacesContext заключается в том, что ServletContext не является ThreadLocal, поэтому вы не можете получить его "статически" из текущего потока, например FacesContext#getCurrentInstance() делает. Вам действительно нужно передать ссылку ServletContext в методы DAO везде, где вам это нужно:

someDAO.doSomething(getServletContext());

Или еще лучше, чтобы избежать жесткой связи, просто извлеките из него нужную информацию и передайте ее:

Object interestingData = getServletContext().getAttribute("interestingData");
someDAO.doSomething(interestingData);
person BalusC    schedule 20.09.2010
comment
Я прекрасно понимаю ваш подход, но он не вписывается в мою архитектуру. У меня есть 3 уровня (дао, домен и графический интерфейс — нет необходимости в выделенном уровне управления, как в MVC/MVP). - person Francois; 20.09.2010
comment
Итак, мой уровень домена не знает и не может знать контекст сервлета. Я просто хочу вызвать свои репозитории, и какая-то техническая часть уровня dao будет иметь дело с транзакциями, менеджером постоянства (но это должно быть одинаковым в течение одного сеанса). На самом деле, я пытаюсь имитировать открытую сессию в представлении без весны: я не очень хорошо разбираюсь в java и использую движок приложения Google. - person Francois; 20.09.2010
comment
Для этого обычно используется комбинация Filter и ThreadLocal. Будьте осторожны. - person BalusC; 20.09.2010