为什么 JSF checkBox 输入新值来映射

Why JSF checkBox inputs new value to map

我的 JSF 页面中的 dataTable 中有一个 checkBox 具有值,它是从 bean 中的映射中获取的。

<h:selectBooleanCheckbox id="rowChecked"
    value="#{messagesListBean.selectedRowIndexesMap[rowIndex]}">
        <a4j:ajax event="click" execute="@this" render="@none"
            limitRender="true"
            listener="#{messagesListBean.rowChecked(rowIndex, rec)}">
        </a4j:ajax>
    </h:selectBooleanCheckbox>
<h:outputLabel for="rowChecked" class="checkbox-style" />

地图在页面加载时初始化,并且初始化得很好 - 有 4 个值,所有值都是 false。地图本身看起来像这样:

public Map<Integer, Boolean> selectedRowIndexesMap = new HashMap<Integer, Boolean>();

问题出在我按下其中一个 checkBoxes 时。它应该根据 rowNumber 编辑地图内部的值。它所做的是向地图添加全新的元素,而不是对其进行编辑。

例如,如果在单击 checkbox 地图之前看起来像这样:0-false; 1-假; 2-假; 3-假;

点击checkbox后,看起来是这样的:0-true; 0-假; 1-假; 2-假; 3-假;

为什么会这样?

因为 EL 中的数字默认计算为 Long。 IE。 #{rowIndex} 实际上是 Long.

0LLong 值不等于 0Integer 值。证据如下:

Long zeroL = 0L;
Integer zero = 0;
System.out.println(zeroL.equals(zero)); // false

所以它只是简单地插入一个新的映射条目,以 0L 作为键,而不是替换与键 0 关联的值。将其更改为 Map<Long, Boolean> 即可。此问题与 JSF 复选框无关。