2009-11-23 63 views
2

由於其在它們的屬性期待一個bean名(而不是bean實例)一些自定義組件,我需要通過頁面之間的實際的bean名稱。由於豆本身也被非自定義組件,我想避免使用額外的ui:param(如這裏所描述Passing action in <rich:modalPanel>),因爲它基本上將指定同一個bean。小面:通過bean名字與用戶界面:參數去action屬性

是否有可能使用配備ui:param bean名稱指定組件的操作?

基本上我想要實現以下目標:

<ui:composition xmlns="http://www.w3.org/1999/xhtml" 
xmlns:ui="http://java.sun.com/jsf/facelets" 
template="/template.xhtml"> 

    <ui:param name="beanName" value="sessionBean"/> 
    ... 

</ui:composition> 

和的template.xhtml是

<ui:composition xmlns="http://www.w3.org/1999/xhtml" 
xmlns:ui="http://java.sun.com/jsf/facelets" 
xmlns:a4j="http://richfaces.org/a4j" 
template="/someothertemplate.xhtml"> 

    </ui:define name="somename"> 
    <h:form> 
     <a4j:commandButton value="test" action="#{beanName.delete}"/> 
    </h:form> 
    </ui:define> 
</ui:composition> 

雖然delete方法正確定義(與action="#{sessionBean.delete}"驗證)上面的代碼給我

javax.faces.FacesException:#{beanName.delete}:javax.el.MethodNotFoundException:/ TEMPL ate.xhtml @ 201,89行動= 「#{} beanName.delete」:未找到方法:sessionBean.delete()

回答

5

你應該能夠通過它的範圍,以引用的bean:

<a4j:commandButton value="test" 
     action="#{sessionScope[beanName].delete}"/> 
+0

一個警告在這裏:bean必須已經被實例化,並放置在範圍 - 這個表達不會創建一個託管bean。 – McDowell 2009-11-23 14:47:03

+0

謝謝,這解決了它! – orom 2009-11-23 15:21:36

+0

嗨:)非常有趣。但是,'刪除'不是一個標籤參數,而是一個常量?我的意思是它應該是表達式''#sessionScope [beanName]'。delete'}「'或者在這種情況下如何組合表達式? – user390525 2017-08-16 18:36:09

2
<a4j:commandButton value="test" action="#{bean[action]}" /> 

的PARAMS通過

<ui:param name="bean" value="#{sessionBean}" /> 
<ui:param name="action" value="delete" /> 

可以使用如果您的操作名稱已修復,則爲#{bean['delete']}

+0

這就是我想正是爲了避免 - 定義與bean實例附加PARAM。 的「未找到方法:sessionBean.delete()」給我的懷疑,它可能以某種方式使用bean的名字(不是實例!)以來的beanName在我的情況下的操作方法顯然是被正確解決。 – orom 2009-11-23 14:48:38