2010-03-15 83 views
1

我寫了一個facelet和一個相應的支持bean,用於實現用戶管理(添加,刪除等)。如何讀取從支持bean傳遞給facelet的參數

I'd want to be able to perform some custom processing when, for instance, a new user is added.

有一個「創建」按鈕,在facelet裏,它的點擊事件是由它的後臺bean處理。在事件處理程序結束時,我希望能夠調用另一個後臺bean的方法,這是未知的,因爲最理想的情況是facelet可以在多個頁面中使用,並具有不同的自定義處理。

我想通過提供給的facelet輔助bean名稱和方法名,這樣來實現此功能:

<myfacelet:subaccounts 
    backingBean="myBackingBean" 
    createListener="createListener" /> 

,並在事件處理程序調用#{} myBackingBean.createListener好歹結束。

我用這個方法(有一些重載一起)獲得MethodExpression的:

protected MethodExpression getMethodExpression(String beanName, String methodName, Class<?> expectedReturnType, Class<?>[] expectedParamTypes) 
{ 
    ExpressionFactory expressionFactory; 
    MethodExpression method; 
    ELContext elContext; 
    String el; 

    el = String.format("#{%s['%s']}", beanName, methodName); 
    expressionFactory = getApplication().getExpressionFactory(); 
    elContext = getFacesContext().getELContext(); 
    method = expressionFactory.createMethodExpression(elContext, el, expectedReturnType, expectedParamTypes); 

    return method; 
} 

和Click事件處理程序應該是這樣的:

public void saveSubaccountListener(ActionEvent event) 
{ 
    MethodExpression method; 

    ... 

    method = getMethodExpression(
      "backingBean", 
      "createSubaccountListener", 
      SubuserBean.class); 
    if (method != null) 
     method.invoke(
      getFacesContext().getELContext(), 
      new Object[] { _editedSubuser }); 
} 

認爲只要工作正常我提供了一個現有的bean名稱(myBackingBean),但是如果使用backingBean,invoke()不起作用,因爲有以下錯誤:

javax.el.PropertyNotFoundException: Target Unreachable, 
identifier 'backingBean' resolved to null 

有沒有一種方法可以從facelet backing bean中檢索已傳遞給facelet的參數的值?在我的例子中,backingBean的值應該是myBackingBean?

我搜索了並嘗試了不同的解決方案,但沒有運氣。

回答

1

這是通用模板。稍後我們將通過參數來此模板:

<ui:composition> 
    <!-- param: reportsBean, type: ReportsController, required --> 
    <h:outputText value="#{reportsBean.report}"/> 
</ui:composition> 

在這裏,我們傳遞的參數:

<ui:include src="/WEB-INF/template/reports/lineChart.xhtml"> 
    <ui:param name="reportsBean" value="#{categoryReports}"/> 
</ui:include> 
+0

這似乎並沒有解決我的問題。我已經可以從facelet jsf代碼訪問backing bean,但不能從facelet backing bean訪問。 順便說一句我試過你的代碼,輸出文本工作正常,但是當我嘗試使用MethodExpression.invoke()它不 - 相同的錯誤 – Antonio 2010-03-15 17:14:10

相關問題