如何在struts2中启动时将一些数据库值设置为应用程序范围?

时间:2013-01-12 05:58:27

标签: java jsp struts2 ognl

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

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

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

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

3 个答案:

答案 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()   动作类。可能未设置值,并且可能会返回呼叫   null ServletActionContext.getContext()

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

它看起来与Validator::extendImplicit('foo', function ($attribute, $value, $parameters, $validator) { return $value == 'foo'; }); 相同。