2012-12-06 30 views
0

嘗試使用jsf2.0(Mojarra)開發一個複合組件,它應該基於bean的列表動態地呈現命令按鈕。我能夠呈現按鈕,但行動沒有得到觸發。請任何人請幫我解決這個問題?jsf2中的複合構件按鈕操作問題mojarra

這裏緊跟這是作爲

<utils:buttonGroup buttonList="#{testButtonBean.buttonList}" 
beanName="#{testButtonBean}" /> 

豆子看起來像

public class TestButtonBean { 

public List<ButtonPOJO> buttonList = new ArrayList<ButtonPOJO>(); 
public List<ButtonPOJO> getButtonList() { 
    return buttonList; 
} 

public void setButtonList(List<ButtonPOJO> buttonList) { 
this.buttonList = buttonList; 
} 

public void preProcess() { 
if (null != buttonList && buttonList.size() == 0) { 
ButtonPOJO ob1 = new ButtonPOJO("Continue", "next"); 
ButtonPOJO ob2 = new ButtonPOJO("Back", "prev"); 
buttonList.add(ob1); 
buttonList.add(ob2); 
} 

} 

public String next() { 
return "page1"; 
} 

public String prev() { 
return "page2"; 
} 
} 

回答

0
action="#{cc.attrs.beanName.listItem.buttonAction}" 

這是不正確的代碼

<composite:interface> 
<composite:attribute name="buttonList" required="true" 
type="java.util.List" /> 
<composite:attribute name="beanName" required="true" 
    type="java.lang.Object" /> 
</composite:interface> 
<composite:implementation> 

<ui:repeat var="listItem" value="#{cc.attrs.buttonList}"> 
<h:commandButton value="#{listItem.buttonName}" 
action="#{cc.attrs.beanName.listItem.buttonAction}"> 
</h:commandButton> 
</ui:repeat> 
</composite:implementation> 

。該語法基本上尋找beanName上的listItem屬性,然後嘗試調用其上的文字操作buttonAction()

如果要將操作方法​​名稱指定爲來自另一個bean屬性的字符串,則需要使用大括號action="#{bean[methodName]}"

action="#{cc.attrs.beanName[listItem.buttonAction]}" 

無關到混凝土問題,如果上述解決方案仍然失敗,那麼只能意味着value="#{cc.attrs.buttonList}"已形式中變得不兼容提交請求。您需要確保在回發過程中準備了與最初請求期間完全相同的列表。另請參閱commandButton/commandLink/ajax action/listener method not invoked or input value not updated的第4點。

+0

非常感謝您的快速響應。添加括號符號後不會觸發行動如下 action =「#{cc.attrs.beanName [listItem.buttonAction]} Aldo My Bean在視圖範圍內,並且buttonList在構建期間postconstruct.please提醒 –

+0

我在我的動作中犯了一個錯誤。它按照你的建議正常工作。而且這是創建複合組件的正確方法嗎?請指教。 –