我编写了一个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?
我已经搜索并尝试了不同的解决方案,但还没有运气。
答案 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>