【问题标题】:Start class right after deployment, not at session start for JSF在部署后立即开始课程,而不是在 JSF 的会话开始时
【发布时间】:2010-02-15 09:54:02
【问题描述】:

对于 Web 应用程序,我使用 JSF 1.2 和 Facelets。

问题是我们现在通过单例模式进行初始化,这大约需要 5-15 秒,因为它会读取数据文件(我们没有使用数据库)。当第一个用户浏览到相应的网页时会发生这种情况(第二个和其他用户没有这个延迟)。

我想在部署后立即初始化这个单例。我怎样才能做到这一点?我试图添加一个应用程序 bean,但它没有被调用。我还尝试添加一个 servlet,如下所示:

  <servlet>
    <description>MyApplicationContextListener Servlet</description>
    <display-name>MyApplicationContextListener Servlet</display-name>
    <servlet-name>MyApplicationContextListener</servlet-name>
    <servlet-class>mydomain.beans.MyApplicationContextListener</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <listener>
    <listener-class>mydomain.beans.MyApplicationContextListener</listener-class>
  </listener>

使用以下代码:

package mydomain.beans;
import javax.servlet.ServletContextEvent;

public class MyApplicationContextListener {


    public void contextInitialized(ServletContextEvent event) {
        System.out.println("MyApplicationContextListener.contextInitialized started");
    }

    public void contextDestroyed(ServletContextEvent event) {
        System.out.println("MyApplicationContextListener.contextInitialized stopped");
    }

}

一个包含 web.xml 和/或 faces-config.xml 中所需更改的示例会很好!

【问题讨论】:

  • 这个监听器在什么方面没有工作?什么都没有打印?
  • 我使用的是tomcat,catalina.out输出中没有打印出文字。
  • 那么应该还有更多的东西 - 它不能没有任何通知就无法工作。
  • 它确实说“com.sun.faces.config.ConfigureListener contextInitialized”,但对于上面添加的组件却没有。没有错误,最后只是“INFO:服务器在 5477 毫秒内启动”。
  • 我从未见过监听器无法运行。您可能在控制台中遗漏了一些东西(在“5477 中的服务器启动”之上)

标签: java jsf web-applications facelets


【解决方案1】:

使用ServletContextListener 怎么样?它的contextInitialized(..) 方法将在上下文初始化时被调用。它在web.xml 中映射如下:

<listener>
    <listener-class>com.example.MyServletContextListener</listener-class>
</listener>

另外,(不确定这是否可行),您可以将 faces-servlet 配置为在启动时加载。:

<load-on-startup>1</load-on-startup>

澄清:对于监听器方法,你的监听器必须实现ServletContextListener

public class MyServletContextListener implements ServletContextListener { .. }

【讨论】:

  • 我已经尝试过类似的事情(我尝试扩展了上面的问题)。但是,它似乎不起作用。我假设 load-on-startup 元素应该出现在 web.xml 而不是 faces-config.xml 中?
  • 我设法让它工作,你不需要 faces-servlet.xml 更改,但你确实需要 "public class MyApplicationContextListener implements ServletContextListener" ,实现......不见了!您的回答接近实际解决方案
  • @Roalt: 是的,我认为这是暗示,当我提供接口链接时,它应该由你的类实现;)我更新了答案更明确地说。
  • 是的,没错,现在你的答案是完全正确的!感谢您的努力!
猜你喜欢
  • 2011-06-16
  • 1970-01-01
  • 2011-12-19
  • 1970-01-01
  • 1970-01-01
  • 2021-05-17
  • 1970-01-01
  • 1970-01-01
  • 2010-10-10
相关资源
最近更新 更多