2011-08-31 99 views
5

我正在使用JSF 1.1。我在我的faces-config.xml文件中的以下內容:如何從支持bean中獲取託管bean名稱?

<managed-bean> 
    <managed-bean-name>beanInstance1</managed-bean-name> 
    <managed-bean-class>com.paquete.BeanMyBean</managed-bean-class> 
    <managed-bean-scope>request</managed-bean-scope> 
</managed-bean> 

我希望得到我的bean中的託管bean名稱beanInstance1。這是我的豆:

package com.paquete; 

public class BeanMyBean { 
    String atribute1; 

    public BeanMyBean() { 
     System.out.println("managed-bean-class="+this.getClass().getName()); 
     System.out.println("managed-bean-name="+????????????????????????); 
     // How Can I get the "beanInstance1" literal from here?? 
    } 

    // setters and getters 
} 

我知道如何讓com.paquete.BeanMyBean文字(this.getClass().getName())和BeanMyBeanthis.getClass().getSimpleName()),但我不知道怎麼弄託管名稱(Bean的實例)。

如何獲得beanInstance1值?

回答

4

標準JSF API不提供此信息。最好你能得到的是通過所有的請求,會走路,應用範圍自己以下方式(代碼從this blog複製):

public static String lookupManagedBeanName(Object bean) { 
    ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext(); 
    Map<String, Object> requestMap = externalContext.getRequestMap(); 

    for (String key : requestMap.keySet()) { 
     if (bean.equals(requestMap.get(key))) { 
      return key; 
     } 
    } 

    Map<String, Object> sessionMap = externalContext.getSessionMap(); 
    for (String key : sessionMap.keySet()) { 
     if (bean.equals(sessionMap.get(key))) { 
      return key; 
     } 
    } 

    Map<String, Object> applicationMap = externalContext.getApplicationMap(); 
    for (String key : applicationMap.keySet()) { 
     if (bean.equals(applicationMap.get(key))) { 
      return key; 
     } 
    } 

    return null; 
} 

然而,有一個大的,這是行不通只是因爲JSF還沒有將它放在任何範圍內!您需要稍後確定它,例如在一個行動方法。

public void submit() { 
    String name = lookupManagedBeanName(this); 
    // ... 
} 

無關到具體的問題,這是一個設計的氣味。您認爲這是解決方案的具體功能要求必須以不同的方式解決。

+2

不客氣。既然你是新來的,請不要忘記標記接受的答案,這有助於解決問題(大部分),另見http://meta.stackexchange.com/questions/5234/how-does-accepting-an -answer工作/ 5235#5235 – BalusC