Jsf 如何初始化Java FacesServlet

Jsf 如何初始化Java FacesServlet,jsf,jakarta-ee,jsf-2,Jsf,Jakarta Ee,Jsf 2,当FacesServlet启动时,我需要运行一些代码,但是由于FacesServlet被声明为final,我无法扩展它并覆盖init()方法 特别是,我想在hibernate删除并创建数据模型之后,在开发和测试期间向数据库写入一些数据 是否有办法配置面以运行某些方法,例如在Faces-config.xml中? 还是最好创建一个进行初始化的单例bean?您可以实现自己的单例bean,在web应用程序启动时收到通知。由于它是一个容器管理的,您可以在其中注入资源,您可以做任何您想做的事情。另一个选项是

当FacesServlet启动时,我需要运行一些代码,但是由于FacesServlet被声明为final,我无法扩展它并覆盖init()方法

特别是,我想在hibernate删除并创建数据模型之后,在开发和测试期间向数据库写入一些数据

是否有办法配置面以运行某些方法,例如在Faces-config.xml中?
还是最好创建一个进行初始化的单例bean?

您可以实现自己的单例bean,在web应用程序启动时收到通知。由于它是一个容器管理的,您可以在其中注入资源,您可以做任何您想做的事情。另一个选项是使用@Startup创建一个@singletonejb,并在它的@PostCreate方法中完成这项工作。通常ServelCutExtListEnter工作得很好,但是如果你在一个耳朵里有不止一个Web应用程序,它们都共享相同的持久性上下文,你可以考虑使用@ SuntLon bean。

嘿,你可能想在这里使用一些方面。只需将其设置为在之前运行即可

     void   init(ServletConfig servletConfig) 
      //Acquire the factory instances we will 
//这是从

也许会对你有所帮助。

使用一个

(类和方法名称实际上并不重要,由您自由选择,都与注释有关)


这保证在启动
FacesServlet
后构建,因此
FacesContext
将在必要时可用。这与另一个答案所建议的
ServletContextListener
相反。

出于某种原因,这不起作用。只有当我在Bean中放入一个方法并从JSF页面调用它时,它才会被实例化。我使用Glassfish 3.1.2.2和JSF 2.1。是否从正确的包导入了
@ApplicationScoped
?CDI的另一个版本无法与JSF
@ManagedBean
结合使用。JSF托管bean的行为将类似于
@NoneScoped
。谢谢!这就是问题所在。我修复了javax.faces.bean.ApplicationScoped的导入。
@ManagedBean(eager=true)
@ApplicationScoped
public class App {

    @PostConstruct
    public void startup() {
        // ...
    }

    @PreDestroy
    public void shutdown() {
        // ...
    }

}