如何将GET参数传递给复合组件?

时间:2014-01-28 11:42:21

标签: jsf jsf-2 composite-component

我构建了一个复合组件,它获取输入id并生成一个表。然后我创建一个使用<f:viewParam>接受GET参数的页面,如下所示:

<f:metadata>
        <f:viewParam name="id" value="#{aBean.id}" />
</f:metadata>
<util:aCompositeComponent inputId="#{aBean.id}" />

复合组件的标记是:

<cc:interface componentType="compositeComponentBacking">
    <cc:attribute name="inputId" type="java.lang.Integer"  />
</cc:interface>

<cc:implementation>         
        /**
          Use #{cc.result} to build a HTML table to present a result
        **/
</cc:implementation>

复合组件的支持bean是:

@FacesComponent("compositeComponentBacking")
public class CompositeComponentBacking extends UINamingContainer {

    private Integer inputId;

    public List<Result> getResult() {

        //Use inputId to query service to return result
        return result;
    }

    public Integer getInputId() {
        return inputId;
    }

    public void getInputId(Integer inputId) {
        this.inputId = inputId;
    }

}

GET参数可以绑定到#{aBean.id},但#{aBean.id}无法传递到复合组件中,并且它始终在复合组件内保持为null。如何将GET参数传递给复合组件?


更新:

我终于解决了这个问题。我发现在使用复合组件时,如果输入属性是常量(例如<util:aCompositeComponent inputId="1"/>),则此常量可以设置为CompositeComponentBacking的{​​{1} }字段。但是如果我使用带有input属性的复合是EL表达式(例如inputId),则EL表达式的值不能设置为<util:aCompositeComponent inputId="#{aBean.id}"/>的{​​{1}}字段。我必须以编程方式通过评估CompositeComponentBacking内的inputId来获取价值。这是正常行为吗?

2 个答案:

答案 0 :(得分:3)

表示值表达式的属性值是通过setValueExpression("attributeName", valueExpression)设置的,而不是通过setAttributeName(evaluatedValue)设置的。你知道,JSF / Facelets EL是延迟的,而不是隐含的。

您应该getResult()基本上通过getAttributes()地图获取评估值:

public List<Result> getResult() {
    Integer inputId = (Integer) getAttributes().get("inputId");
    // ...
}

如果你真的想添加一个getter和setter,那么委托给getStateHelper()

public Integer getInputId() {
    return (Integer) getStateHelper().eval("inputId");
}

public void setInputId(Integer inputId) {
    getStateHelper().put("inputId", inputId);
}

(注意:不要混用它们; getAttributes().get()会首先扫描一个getter然后调用它;如果你在getter本身内部使用getAttributes().get(),它会调用它自己导致由此站点名称表示的错误的无限循环

答案 1 :(得分:0)

如果您确定该值存在,则可以使用

<util:aComposite inputId="#{param.id}" />

访问请求参数id。它不会被验证,转换或其他。