2011-05-05 27 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 { 
... 
} 
相關問題