我有一个现有的JSF复合组件,它现在应该获得一个新属性。这个新属性应该是一个列表,其中填充了用户在浏览器中选择的每个鼠标的x/y坐标。
<composite:interface componentType="myComponent">
...
<composite:attribute name="selectedPositions" type="java.util.ArrayList" />
</composite:interface>
<composite:implementation>
//TODO: fill selectedPositions with values
</composite:implementation>
使用此组件的开发人员应该在其支持bean中提供预填充列表或空列表:
<myns:mycomponent id="myComponent" selectedPositions="#{backingBean.prefilledList}" ... />
如果列表是预填充的,那么我将呈现这些值。但是用户应该能够通过每次拖放来改变浏览器中呈现的值。当他/她提交表单时,更新的或新的值应该驻留在列表selectedPositions
中。
目前我不知道如何从我的JavaScript代码到列表的值?
同时我也找到了答案。在组件实现的decode()
中,我可以访问作为属性传入的列表:
@Override
public void decode(FacesContext facesContext) {
...
ELContext elContext = facesContext.getELContext();
ExpressionFactory expressionFactory = facesContext.getApplication().getExpressionFactory();
ValueExpression valueExpLandmarks = expressionFactory.createValueExpression(elContext, "#{cc.attrs.selectedPositions}", List.class);
Object value = valueExpLandmarks.getValue(elContext);
if (value instanceof List) {
this.selectedPositions = (List) value;
}
...
}
当我使用另一个隐藏输入字段提交新的位置时,然后我可以在组件实现中使用从隐藏输入字段获得的值填充列表。