根据 JavaScript 填充作为 JSF 复合接口属性的列表

Populate list that is an attribute of a JSF composite interface per JavaScript

我有一个现有的 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}" ... />

如果列表已预先填充,那么我将呈现这些值。但是用户应该能够通过拖放来更改浏览器中的呈现值。当 he/she 提交表单时,更新值或新值应位于列表 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;
    }
    ...
}

当我使用另一个隐藏输入字段提交新头寸时,我可以在组件实现中使用从隐藏输入字段获得的值填充列表。