在<ui:include>中使用带有可变数量方法参数的参数化方法调用

5

我有一个模板,是表单的一部分,用于编辑某些元素。根据包含它的页面不同,执行的操作也不同。因此,我将action方法作为参数传递:

 <ui:param name="option" value="#{someOptionBean}" />
 ...
 <ui:include src="/WEB-INF/jsf/value-edit.xhtml">
    <ui:param name="controllerParam" value="#{optionController}" />
    <ui:param name="elementParam" value="#{option}" />
    <ui:param name="actionParam" value="updateOption" />
 </ui:include>

或者:

 <ui:param name="property" value="#{somePropertyBean}" />
 ...
 <ui:include src="/WEB-INF/jsf/value-edit.xhtml">
    <ui:param name="controllerParam" value="#{propertyController}" />
    <ui:param name="elementParam" value="#{property}" />
    <ui:param name="actionParam" value="updateProperty" />
 </ui:include>

value-edit.xhtml 中有一个命令按钮:

<p:commandButton value="Update" action="#{controllerParam[actionParam](elementParam)}" />

目前一切工作正常。

我的问题是现在动作方法的参数数量不同。它们是:

public void updateOption(Option option) { ... }
public void updateProperty(Item item, Prop property) { ... }

现在我希望还能定义操作参数,例如:

<ui:param name="actionParam" value="updateOption(option)" />
<ui:param name="actionParam" value="updateProperty(item, property)" />

或类似于:
<ui:param name="method" value="updateProperty" />
<ui:param name="parameters" value="item, property" />

我已经阅读了文档(值和方法表达式/参数化方法调用),但我不确定是否可能实现。
有没有办法实现这个?
1个回答

5
最后,我通过在控制器中创建一个MethodExpression来解决了这个问题。
现在,ui:include看起来像这样:
<ui:param name="option" value="#{someOptionBean}" />
...
<ui:include src="/WEB-INF/jsf/value-edit.xhtml">
    <ui:param name="actionParam" value="#{optionController.getUpdateAction()}" />
</ui:include>

并且

<ui:param name="item" value="#{someItemBean}" />
<ui:param name="property" value="#{somePropertyBean}" />
...
<ui:include src="/WEB-INF/jsf/value-edit.xhtml">
    <ui:param name="actionParam" value="#{propertyController.getUpdateAction()}" />
</ui:include>

value-edit.xhtml中,命令按钮是:
<p:commandButton value="Update" action="#{actionParam}" />
getUpdateAction 方法会为每个控制器创建相应参数的 MethodExpression
public class OptionController {
    ...
    public void updateOption(Option option) { ... } 

    public MethodExpression getUpdateAction() {
        return createMethodExpression("#{optionController.updateOption(option)}", String.class, Option.class);
    }
    ...
}

public class PropertyController {
    ...
    public void updateProperty(Item item, Prop property) { ... }

    public MethodExpression getUpdateAction() {
        return createMethodExpression("#{propertyController.updateProperty(item, property)}", String.class, Item.class, Prop.class);
    }
    ...
}

其中createMethodExpression是:

public static MethodExpression createMethodExpression(String expression, Class<?> expectedReturnType, Class<?>... expectedParameterTypes) {
    FacesContext facesContext = FacesContext.getCurrentInstance();
    return facesContext.getApplication().getExpressionFactory().createMethodExpression(
        facesContext.getELContext(), expression, expectedReturnType, expectedParameterTypes);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接