为什么 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
.
0L
的 Long
值不等于 0
的 Integer
值。证据如下:
Long zeroL = 0L;
Integer zero = 0;
System.out.println(zeroL.equals(zero)); // false
所以它只是简单地插入一个新的映射条目,以 0L
作为键,而不是替换与键 0
关联的值。将其更改为 Map<Long, Boolean>
即可。此问题与 JSF 复选框无关。
我的 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
.
0L
的 Long
值不等于 0
的 Integer
值。证据如下:
Long zeroL = 0L;
Integer zero = 0;
System.out.println(zeroL.equals(zero)); // false
所以它只是简单地插入一个新的映射条目,以 0L
作为键,而不是替换与键 0
关联的值。将其更改为 Map<Long, Boolean>
即可。此问题与 JSF 复选框无关。