2010-01-24 49 views

回答

11

有幾種方法。如果託管的bean彼此相關,最簡潔的方式將是託管屬性注入。假設Bean1具有與Bean2相同的範圍或更廣的範圍。先舉一個Bean2財產Bean1:

public class Bean2 { 
    private Bean1 bean1; // +getter +setter. 
} 

然後在faces-config.xml聲明Bean1是Bean2的託管屬性:

<managed-bean> 
    <managed-bean-name>bean1</managed-bean-name> 
    <managed-bean-class>com.example.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>com.example.Bean2</managed-bean-class> 
    <managed-bean-scope>request</managed-bean-scope> 
    <managed-property> 
     <property-name>bean1</property-name> 
     <value>#{bean1}</value> 
    </managed-property> 
</managed-bean> 

這樣的bean2實例具有的bean1實例的即時訪問。

如果由於某些原因不想使用託管屬性注入,那麼您還可以通過編程方式獲取Application#evaluateExpressionGet()。這裏的檢索Bean1內Bean2的例子:

FacesContext context = FacesContext.getCurrentInstance(); 
Bean1 bean1 = (Bean1) context.getApplication().evaluateExpressionGet(context, "#{bean1}", Bean1.class); 

的Bean1必須在faces-config.xml託管bean bean1但是已經聲明。

有關在JSF內部傳遞數據的更多信息和提示,您可能會發現this article有用。

4

爲了增加BalusC的答案,如果您使用的是依賴注入框架(春,吉斯等),或者如果使用JSF 2.0,你可以有一個託管bean設置成其他只使用:

@Inject 
private Bean2 bean2; 

(或根據您的DI框架相應的註釋)

+0

這個工作在JSF 2.0關於Java EE 6爲好。 – BalusC 2010-01-25 12:28:25

+0

應該是@Inject private Bean1 bean1;如果這在Bean2中被引用。 (與BalusC的例子同步) – 2012-02-23 14:51:55