Как поместить объект Java в HttpSession и использовать его во всех моих пакетах?

Я разрабатываю веб-приложение Java, которое состоит из множества JSP, JS, Servelts, а бизнес-логика обрабатывается в POJO.

Мне нужно инициировать класс внутри моего сервлета и установить его как глобальную переменную и использовать его во всех пакетах в моем приложении.

Теперь я определил несколько глобальных переменных, используя

request.getSession().setAttribute("<ATTR_NAME>", <MY_OBJECT>);

Но чего мне здесь не хватает, так это того, что я могу использовать значение этого атрибута только внутри сервлета или, другими словами, в тех местах, где у меня есть доступ к HttpServletRequest.

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

Я просмотрел несколько статей, в которых среди прочего говорилось о ServletContext, но я не получил ясной картины.

Любая небольшая помощь приветствуется.

Спасибо, Шрирам Шридхаран


person Sriram Sridharan    schedule 06.07.2015    source источник
comment
возможный дубликат Как вы храните объекты Java в HttpSession?   -  person Abhijeet Dhumal    schedule 06.07.2015
comment
@abhijeetdhumal Даже близко не дубликаты.   -  person Anthony Grist    schedule 06.07.2015
comment
возможный дубликат Получение веб-сеанса из POJO вне Интернета Контейнер   -  person Shekhar Khairnar    schedule 07.07.2015


Ответы (3)


Почему бы вам не инициировать Java Bean в базовом сервлете и не использовать его во время выполнения?

public class User implements java.io.Serializable {

private String name;
private Integer age;

public String getName(){
    return this.name;
}

public void setName(String name){
    this.name = name;
}

public Integer getAge(){
    return this.age;
}

public void setAge(Integer age){
    this.age = age;
}

}

person Jeeppp    schedule 06.07.2015
comment
Потому что не умеют? Похоже, в этом весь смысл их вопроса. - person Anthony Grist; 06.07.2015
comment
@AnthonyGrist Я согласен. Дело в том, что мне сделать, чтобы этот bean-компонент был виден даже там, где у меня нет доступа к HttpServletRequest/HttpServletResponse? - person Sriram Sridharan; 06.07.2015
comment
@sriramsridharan Следите за сериализацией - person Jeeppp; 06.07.2015

Одним из решений может быть создание сервлета загрузки при запуске, который устанавливает контекст, как в статье по ссылке контекст доступа в DAO/POJO или другое решение использует фильтр, как в ссылке сеанс из pojo

person Shekhar Khairnar    schedule 06.07.2015

Если вы хотите использовать какой-либо объект в контексте приложения, вы можете использовать некоторый держатель контекста (одноцветный) и сохранить объект в атрибутах ServletContext:

Держатель контекста:

public class CtxHolder {
    private static ServletContext ctx;
    private static Context nCtx;

    private DSHolder() {
    }

    public static void setCtx(ServletContext ctx) {
        DSHolder.ctx = ctx;
    }

    public static ServletContext getCtx() {
        if (ctx == null) {
            throw new RuntimeException("Need to set servlet context");
        }
        return ctx;
    }
}

Затем определите прослушиватель контекста сервлета и вызовите CtxHolder.setCtx() (из метода contextInitialized()) при запуске приложения.

Затем вы можете получить/установить "глобальные" (область приложения) атрибуты как:

CtxHolder.getCtx().setAttribute("key", new Object());

Но помните о синхронизации! Каждый запрос обрабатывается в собственном потоке.

person Constantine    schedule 06.07.2015