2017-07-30 21 views
1

要在支柱2工厂类访问ServletContext(例如StrutsTextProviderFactory的Struts 2:获取在工厂类ServletContext的

我用下面的代码:

public class CustomStrutsTextProviderFactory extends 
     StrutsTextProviderFactory implements ServletContextListener{ 


private static String myConfig; 

@Override 
protected TextProvider getTextProvider(Class clazz) { 
    // I can read myConfig here ! 

} 

@Override 
    public void contextInitialized(ServletContextEvent event) { 
     myconfig = event.getServletContext().getInitParameter("config"); 

    } 
} 

它的工作原理,但我觉得定义一个static财产,并以这种方式设置它并不是最好的方法。

有没有更好的方法?

+0

为什么你甚至把它定义为一个静态变量?如果我从'myConfig'中删除静态,'getTextProvider'方法中的'null'将被删除。 – home

+0

使它成为静态是我发现将此参数传递给'getTextProvider'的唯一方式。在servelt开始时调用'contextInitialized',在struts开始时调用'SabaStrutsTextProviderFactory'。每次创建'CustomStrutsTextProviderFactory'的新实例。 –

回答

1

这不是最好的,它是错误的,因为如果你尝试在struts2配置中使用这样的工厂,你可能会遇到问题。在初始化struts2之前,servlet上下文是独立启动的,因此您不能使用需要启动框架的struts2 api。

如果您在struts2启动时需要初始化应用程序,最好的方法就是调度程序初始化事件。请检查this回答你应该如何实现调度员监听器。

下面的顺序调度初始化事件收听时构造对象:

15:27:50 INFO (org.apache.struts2.spring.StrutsSpringObjectFactory:42) - ... initialized Struts-Spring integration successfully 
!!! MyBean !!! 
!!! init !!! 
jul 18, 2013 3:27:51 PM org.apache.catalina.startup.HostConfig deployDirectory 
!!! dispatcherInitialized !!! 
+0

我试着'实现DispatcherListener',但1)我找不到'dispatcherInitialized'中的'ServletContext' 2)我的'dispatcherInitialized'永远不会被调用 –