如何读取从辅助bean传递给facelet的参数

时间:2010-03-15 16:48:11

标签: jsf facelets

我编写了一个facelet和一个相应的支持bean,它实现了用户管理(添加,删除等)。

  

我希望能够执行一些   自定义处理,例如,a   新用户已添加。

facelet中有一个“创建”按钮,其click事件由其支持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支持bean中检索已传递给facelet的参数值?在我的例子中,backingBean的值,应该是myBackingBean?

我已经搜索并尝试了不同的解决方案,但还没有运气。

1 个答案:

答案 0 :(得分: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>