我构建了一个复合组件,它获取输入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
来获取价值。这是正常行为吗?
答案 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
。它不会被验证,转换或其他。