【问题标题】:Parameterized method call in <ui:include> with variable number of method parameters<ui:include> 中的参数化方法调用,方法参数数量可变
【发布时间】:2015-02-09 12:27:57
【问题描述】:

我有一个模板,它是编辑某些元素的表单的一部分。要执行的操作因包含它的页面而异。所以我将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" />

我已阅读文档 (Value and Method Expressions / Parameterized Method Calls),但不确定这是否可行。

有什么方法可以实现吗?

【问题讨论】:

    标签: jsf-2 el facelets param uiinclude


    【解决方案1】:

    最后我解决了这个问题,在控制器中创建了一个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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-09
      • 2011-03-18
      • 1970-01-01
      • 2011-04-21
      • 2020-06-30
      相关资源
      最近更新 更多