如何将Java对象放入HttpSession并在我的所有包中使用它?

时间:2015-07-06 09:50:28

标签: java servlets global-variables httpsession

我正在开发一个Java Web应用程序,它包含许多JSP,JS,Servelts,而业务逻辑则在POJO中处理。

我需要在我的Servlet中启动一个类,并将set设置为全局变量,并在我的应用程序的所有包中使用它。

现在,我已经使用

定义了一些全局变量
request.getSession().setAttribute("<ATTR_NAME>", <MY_OBJECT>);

但我在这里缺少的是我只能在Servlet中使用this属性的值,换句话说,我可以访问HttpServletRequest的地方。

我需要一个定义全局变量的解决方案,并且能够在包含我的业务逻辑的所有POJO中使用它,在那里我可能无法访问HttpServletRequest。我也不想通过Constructors或方法参数将我的这个全局变量从Servlet传递给所有这些POJO。

我已经阅读了一些文章,其中介绍了ServletContext等,但我没有得到清晰的图片。

任何小小的帮助都是非常有用的。

谢谢, Sriram Sridharan

3 个答案:

答案 0 :(得分:-1)

为什么不在基本servlet中启动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;
}

}

答案 1 :(得分:-1)

一个解决方案可以创建一个load-on-startup servlet,用于设置链接fiddle中文章中的上下文或 另一种解决方案是在链接access context in DAO/POJO

中使用过滤器

答案 2 :(得分:-1)

如果要在应用程序上下文中使用某个对象,可以在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;
    }
}

然后定义Servlet Context Listener并在应用程序启动时调用CtxHolder.setCtx()(来自contextInitialized()方法)。

然后您可以将“global”(应用程序的范围)属性设置为:

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

但请记住同步!每个请求都在自己的线程中处理。