我想在应用程序范围设置一些值。
我是通过使用拦截器init()
方法尝试的。但它在下面的代码中给出了null
指针:
ServletActionContext.getContext().getApplication().put("ApplicationName", applName);
希望在所有会话中访问此字段。
答案 0 :(得分:5)
在应用启动时初始化数据的规范方法是使用ServletContextListener。
IMO拦截器对此没有多大意义:拦截器用于在请求过程中实现应用程序中的行为,而不是启动时的一次性功能。
答案 1 :(得分:4)
你可以这样做:
public class ContextListenerOne implements ServletContextListener {
ServletContext context;
@Override
public void contextInitialized(ServletContextEvent sce) {
context = sce.getServletContext();
try {
//Create a database connection here and run queries to retrieve data.
context.setAttribute("data", data); //Use setAttribute method to make this data available to everyone.
} catch(Exception e {
}
}
}
请注意,您也可以通过以下非常规方法进行此操作。
由于在整个过程中只创建了一个Servlet对象实例,因此可以覆盖init方法,如下所示:
@Override
public void init(ServletConfig config) throws ServletException {
super.init();
//Do all your database transactions here.
ServletContext c = config.getServletContext(); //Get the ServletContext.
c.setAttribute("data", data); //Make data available to all.
}
无论在servlet的生命周期中发出多少请求,init方法都只被调用一次。
但是,请注意,如果覆盖特定类型Servlet的init方法,则在以前发出对另一个Servlet(不是您重写init方法的类型)的请求时,您的数据库数据将不可用第一个请求您转发init方法的Servlet的请求。
答案 2 :(得分:0)
官方文件在这里:
不要在你的构造函数中使用
getSession()
动作类。可能未设置值,并且可能会返回呼叫 nullServletActionContext.getContext()
。
https://struts.apache.org/docs/accessing-application-session-request-objects.html
它看起来与Validator::extendImplicit('foo', function ($attribute, $value, $parameters, $validator) {
return $value == 'foo';
});
相同。