【问题标题】:How to read a parameter passed to a facelet from a backing bean如何读取从支持 bean 传递给 facelet 的参数
【发布时间】:2010-03-15 16:48:10
【问题描述】:

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

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

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;
}

点击事件处理程序应如下所示:

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?

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

【问题讨论】:

    标签: jsf facelets


    【解决方案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>
    

    【讨论】:

    • 这似乎不能解决我的问题。我已经可以从 facelet jsf 代码访问支持 bean,但不能从 facelet 支持 bean 访问。顺便说一句,我尝试了您的代码,输出文本工作正常,但是当我尝试使用 MethodExpression.invoke() 时却没有 - 同样的错误
    猜你喜欢
    • 1970-01-01
    • 2016-07-07
    • 1970-01-01
    • 2016-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多