我想在应用程序范围内设置一些值。
我通过使用拦截器init()
方法进行了尝试。但它null
在下面的代码中给出了指针:
ServletActionContext.getContext().getApplication().put("ApplicationName", applName);
希望在所有会话中访问此字段。
在应用程序启动时初始化数据的规范方法是使用ServletContextListener。
IMO 拦截器对此毫无意义:拦截器旨在在请求过程中实现跨应用程序的行为,而不是启动时的一次性功能。
你可以这样做:
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 方法的类型)的请求之前发出了对另一个 Servlet 的请求,您的数据库数据将不可用向您覆盖其 init 方法的 Servlet 发出请求。
官方文档在这里:
不要
ActionContext.getContext()
在 Action 类的构造函数中使用。这些值可能未设置,并且调用可能会为getSession()
.
https://struts.apache.org/docs/accessing-application-session-request-objects.html
它看起来与ServletActionContext.getContext()
.