4

我想在应用程序范围内设置一些值。

我通过使用拦截器init()方法进行了尝试。但它null在下面的代码中给出了指针:

ServletActionContext.getContext().getApplication().put("ApplicationName", applName);

希望在所有会话中访问此字段。

4

3 回答 3

5

在应用程序启动时初始化数据的规范方法是使用ServletContextListener

IMO 拦截器对此毫无意义:拦截器旨在在请求过程中实现跨应用程序的行为,而不是启动时的一次性功能。

于 2013-01-12T06:13:32.200 回答
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 方法的类型)的请求之前发出了对另一个 Servlet 的请求,您的数据库数据将不可用向您覆盖其 init 方法的 Servlet 发出请求。

于 2013-01-13T18:55:20.020 回答
0

官方文档在这里:

不要ActionContext.getContext()在 Action 类的构造函数中使用。这些值可能未设置,并且调用可能会为getSession().

https://struts.apache.org/docs/accessing-application-session-request-objects.html

它看起来与ServletActionContext.getContext().

于 2017-02-05T02:54:09.103 回答