2011-08-28 45 views
1

我嘗試解決這樣unmanagable代碼:編碼JSF,的commandButton的導航行動的成果由代碼

<a4j:commandButton action="dia_ok" actionListener="#{...}" ajaxSingle="true" .../> 

我通過綁定修復它的按鈕將ManagedBean和交換所有屬性的Java代碼,所以生病只有:

<a4j:commandButton binding="#{...}"/> 

我成功地編碼setAjaxSingle(真)和ActionListener的屬性,但我對代碼失敗動作屬性。

我的問題是:我怎麼能指定的方法button.setActionExpression()所做的方法button.setActionExpression()只允許MethodExpression而不是String的參數?

+1

你爲什麼認爲你的修復改進了? (我聽到的關於組件綁定的最常見的建議是不惜一切代價避免它們) – meriton

+0

體系結構評論的敏捷編程代碼飲食不是一個目標嗎? commandButton使用8-12個更多屬性,即其imo unmanageamble。 –

回答

1

您可以創建一個值爲"dia_ok"且返回類型爲StringMethodExpression。這個表達式不一定是指"#{bean.action}"什麼的。

E.g.

button.setActionExpression(createMethodExpression("dia_ok", String.class)); 

private static MethodExpression createMethodExpression(String expression, Class<?> returnType) { 
    FacesContext facesContext = FacesContext.getCurrentInstance(); 
    return facesContext.getApplication().getExpressionFactory().createMethodExpression(
     facesContext.getELContext(), expression, returnType, new Class[0]); 
} 

我只是看不到它是如何使代碼更易於管理作爲你的交融視圖到模型這種方式。也許你需要編寫一些常規約定,應該如何排序/組織這些屬性,以便更好地管理它們?例如。首先是id,然後是value等,然後符合這個約定。

+0

我不使用mvc模式,我寫了一個通用的CRUD-curator-class,而我的hibernate-entitybeans(事務性的長壽命hibernatesession)繼承了jsf-selectitem。它是一個棘手的原型,並拋出所有重要的經典設計。 –