2011-08-31 111 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