Jsf 如何将GET参数传递给复合组件?
我构建了一个复合组件,它接受一个输入id并生成一个表。然后,我使用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}" /> 复合组件的标
创建了一个接受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);
}