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

Jsf 如何将GET参数传递给复合组件?,jsf,jsf-2,composite-component,Jsf,Jsf 2,Composite Component,我构建了一个复合组件,它接受一个输入id并生成一个表。然后,我使用创建了一个接受GET参数的页面,如下所示: <f:metadata> <f:viewParam name="id" value="#{aBean.id}" /> </f:metadata> <util:aCompositeComponent inputId="#{aBean.id}" /> 复合组件的标

我构建了一个复合组件,它接受一个输入id并生成一个表。然后,我使用
创建了一个接受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>

/**
使用#{cc.result}构建HTML表以显示结果
**/
复合组件的支持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;
    }

}
@FacesComponent(“compositeComponentBacking”)
公共类CompositeComponentBacking扩展了UINamingContainer{
私有整数输入;
公共列表getResult(){
//使用inputId查询服务以返回结果
返回结果;
}
公共整数getInputId(){
返回输入;
}
public void getInputId(整数inputId){
this.inputId=inputId;
}
}
GET参数可以绑定到
{aBean.id}
,但是
{aBean.id}
不能传递到复合组件中,并且它在复合组件中始终保持为null。如何将GET参数传递给复合组件


更新:


我终于解决了这个问题。我发现在使用复合组件时,如果输入属性是常量(例如
),则可以将该常量设置为
CompositeComponentBacking
inputId
字段。但是如果我使用的复合输入属性是EL表达式(例如
),EL表达式的值不能设置为
CompositeComponentBacking
inputId
字段。我必须通过计算
{cc.attrs.inputId}以编程方式获得值
内部
CompositeComponentBacking
。这是正常行为吗?

如果确定值在那里,可以使用

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


访问请求参数
id
。它不会被验证、转换或其他任何操作。

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

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


访问请求参数
id
。它不会被验证、转换或其他任何东西。

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

您应该在
getResult()
中通过映射基本上获得评估值:


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

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

您应该在
getResult()
中通过映射基本上获得评估值:


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

当您在页面上输出
{aBean.id}
时(组件外部)是否设置了值?是。#{aBean.id}如果我将其放在组件旁边,则显示正确,但在复合组件内部,则显示为空。显然,您在复合组件内部以错误的方式访问/显示了它。很难说您是否在问题中没有显示该部分。@BalusC。请参阅我的更新。在使用复合组件时,如果输入属性是EL expre,则似乎session,它不能设置为组件的支持bean的字段。(即#{cc.inputId}为null),我必须通过计算#{cc.attrs.inputId}来获取值。它不是
{cc.attrs.xxx}
在复合实现中访问参数的方法是什么?仍然不明白您是如何尝试访问它的…您是否试图将它绑定到组件类型的某个属性?当您在页面(组件外部)上输出
{aBean.id}
时,是否设置了值?是。{aBean.id}如果我将其放在组件旁边,则显示正确,但在复合组件内部,则显示为空。显然,您在复合组件内部以错误的方式访问/显示了它。很难说您是否在问题中没有显示该部分。@BalusC。请参阅我的更新。在使用复合组件时,如果输入属性是EL expre,则似乎session,它不能设置为组件的支持bean的字段。(即#{cc.inputId}为null),我必须通过计算#{cc.attrs.inputId}来获取值。它不是
{cc.attrs.xxx}
在复合实现中访问参数的方法是什么?仍然不明白您是如何尝试访问它的…您是否试图将其绑定到组件类型的某个属性?已尝试但仍然相同。GET参数无法传递到复合组件已尝试但仍然相同。GET参数无法传递到复合组件
public Integer getInputId() {
    return (Integer) getStateHelper().eval("inputId");
}

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