【问题标题】:How can I initiate `genericBean` with some managed bean as a default value at the beginning of an application?如何在应用程序开始时使用一些托管 bean 作为默认值来启动 `genericBean`?
【发布时间】:2011-08-19 05:38:24
【问题描述】:

如果我在 JSF 页面中有一个通用 bean。像这样:

<h:outputLabel value="#{genericBean.content}"/>

而且这个 bean 不是托管 bean,即在 faces-config 中只有 2 个托管 bean:

<managed-bean>
        <managed-bean-name>bean1</managed-bean-name>
        <managed-bean-class>mb.Bean1</managed-bean-class>
        <managed-bean-scope>session</managed-bean-scope>
</managed-bean>

<managed-bean>
        <managed-bean-name>bean2</managed-bean-name>
        <managed-bean-class>mb.Bean2</managed-bean-class>
        <managed-bean-scope>session</managed-bean-scope>
</managed-bean>

如果这两个 bean 都有 getContent() 方法:

public class Bean1{
  public String getContent(){
       return "Content of Bean 1";
  }
}

public class Bean2{
  public String getContent(){
       return "Content of Bean 2";
  }
}

然后我可以用其中之一更改 genericBean:

Bean1 bean1 = new Bean1();
FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("genericBean", bean1);

Bean2 bean2 = new Bean2();
FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("genericBean", bean2);

根据一些业务逻辑。

如您所见,我使用genericBean 只是作为面孔上下文中的标签。现在我的问题是:如何在应用程序开始时使用bean1 作为默认值来启动genericBean

谢谢。

【问题讨论】:

    标签: java jsf


    【解决方案1】:

    您可以使用应用程序范围(托管)bean 并在构造函数中为您的通用 bean 设置默认值。

    【讨论】:

      【解决方案2】:

      你可以使用ServletContextListener来实现这个

      public class CustomApplicationContextListener implements ServletContextListener {
      
          private static final String FOO = "foo";
      
          public void contextInitialized(ServletContextEvent event) {
              Bean1 bean1 = new Bean1();
              event.getServletContext().setAttribute("genericBean", bean1 );
          }
      
          public void contextDestroyed(ServletContextEvent event) {
      
                      event.getServletContext().removeAttribute("genericBean");
      
          }
      
      }
      

      web.xml

      <listener>
          <listener-class>com.yourpackage.CustomApplicationContextListener</listener-class>
      </listener>
      

      您应该使用 jsf 2.0 样式的应用程序范围 bean 并将其标记为 eager

      @ManagedBean(name="genericBean", eager=true)
      @ApplicationScoped
      public class GenericBean {
       ...
      }
      

      【讨论】:

        猜你喜欢
        • 2014-09-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-02
        • 2021-06-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多