我正在开发一个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
答案 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());
但请记住同步!每个请求都在自己的线程中处理。