2011-05-05 13 views
0

如果我在JSF页面中有一个泛型bean。就像这样:如何在应用程序开始时将一些托管bean作为默认值启动`genericBean`?

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

和这个bean不是一个管理的bean,即在脸上,配置有只有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> 

,如果这两种豆类有方法的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

谢谢。

回答

0

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

0

您可以使用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 { 
... 
} 
相关问题