在jsp页面中经常会有关于下拉框选项的查询,一般我会用<c:forEach></c:forEach>标签去循环从后台传来的对象或者集合数组。然后在下拉框中加载出数据库中的数据。一般的格式是这样的:
<select class="percentText" id="operatorId" name="operatorId">
<option value="">--Select All--</option>
<c:forEach items="${operators }" var="oper" varStatus="step">
<option value = "${oper.operatorId }" ${oper.operatorName }</option>
</c:forEach>
</select>
其中<select></select>标签中的第一个<option></option>是要在文本框中显示的(如果没有设置默认选项的话)
那么这就牵涉到一个小问题了,如何设置默认选项?
一般情况会是在写死的<select></select>中使用,也就是说<select></select>中的数据不是从数据库中加载出来的,而是直接写死在jsp里面的,比如:
<select class="percentText" id="operatorId" name="operatorId">
<option value="">请选择</option>
<option value="1">宝马</option> <option value="2">奔驰</option> <option value="3">奥迪</option>
</select>
如果是这样的话,文本框中依然是"请选择"(即第一个<option></option>),如果想让文本框中默认为“宝马”,则需要在<option value="1">宝马</option>中加上selected = "selected"即<option value="1" selected = "selected">宝马</option>。
还是回到我原来的问题,首先补充说明一下我第一段代码的意思,operators是我从控制器(controller、action)中传过来的对象集合,用${operators }来获取。var="oper"是要在option中来调用这个对象的属性。
其中的问题就是,当我选择其中一个值然后查询会刷新出来一个页面,但是select文本框中的值又变回--Select All--,没有保留原来的值,这就给用户不好的体验,这种情况会导致用户可能忘记根据哪个条件来查询的了。所以必须点击刷新显示列表页面是保留select的值。
用上面的selected="seleced"肯定是行不通的
那么这就要结合<select></select>的name属性以及<option></option>的value值了
在<option></option>中加上${oper.operatorId == param['operatorId']?'selected':''}即:
<option value = "${oper.operatorId }" ${oper.operatorId == param['operatorId']?'selected':''}>${oper.operatorName }</option>
其中oper.operatorId 是来自<option value = "${oper.operatorId }">, param['operatorId']中的operatorId是来自<select name="operatorId"
这样再次查询刷新页面后,文本框的值将会保留选择的条件!