【发布时间】: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?
我已经搜索并尝试了不同的解决方案,但还没有成功。
【问题讨论】: