首先你要用到select,可以只使用 <s:select>标签,解释下这个标签属性:
headerValue : 默认值value
headerKey : 默认name
list : 源数据 (可以在action方法里从数据库获取list)
name : 被选数据存放的位置(这里我方在对象obj的属性值userName中<需在action中定义该对象>)
listKey : 下拉选项的name
listValue : 下拉选项的value
value : 默认值
但是一个下拉列表往往是可以重复使用的,那么我们将它单独定义到一个action中,这里我的action的namespace是system,所以如我们上面定义的<s:action>标签:
name : 源数据名(对应get方法名)
namespace : 我们在struts.xml中定义的name
id : 相当于别名(在后面调用该actiond的时候直接用#号使用)
struts2的select标签中,常用的有以下几个属性:
(1)struts2中的select 标签中,必须设置的属性只有一个,即是list。
(2)select标签的list中必须有值,不然会报错。如果没有值,可以加上headerKey, headerValue,这样就可以通过了。如:
<s:select name="geElement.childType" list="childTypeList" listKey="key" listValue="value" headerKey="0" headerValue="--请选择子类型--"/>
其中,即使list中有值,我们也通常会加上headerKey, headerValue,即列表中显示的第一个选项。注意,headerKey不可以为空,不可以为-1。
(3)list属性:通常是在action中定义的,必须是一个可以迭代的源,如为一个List, Map, Set等。如果是一个Map,那么map的key就对应于select标签中的value,map中的value就对应于select标签中的option。而如果是一个List或者是一个Set,那么可以通过listKey和listValue指定。
(4)listKey和listValue:listKey即对应于select标签中的value, listValue即对应于select标签中的option。
(5)name属性:即是表单中select的名称。
list属性是必不可少的,其他两个属性是可选的。在select元素里,Listvalue属性是可选的,如果没有给出这个属性,在某个选项被选中时,该选项的行标将作为select元素的值被发送到服务器。在radio元素里,listValue的属性也是可选的,如果不给出value属性,radio按钮被选时的值将是on。
我们可以把一个String、一个数组、一个枚举java.util.Enumeration、一个java.util.Iterator、一个java.util.Map或一个java.util.Collection赋值给list属性。这个值对象既可以放在一个动作对象里,也可以放在当前会话对象或当前的ServletContext对象里。如果你动态赋值给list属性对象没有任何选项,你必须返回一个空的数组collectionMap,而不是返回一个空值。
1、赋值一个String
可以将一个数组赋值为String表示形式
<s:select list="{'Atlanta','Chicago','Detroit'}"/>
这个select标签将呈现为
- <select>
- <option value="Atlanta">Atlanta</option>
- <option value="Chicago">Chicago</option>
- <option value="Detroit">Detroit</option>
- <span style="font-size: small;"></select>
- </span>
请注意,每个选项的值的行标使用的是同一个字符元素。
在绝大多数Struts应用程序里,选项的值和行标应该是同,这需要使用如下所示的语法:
- #{'value-1':'label-1','value-2':'label-2','value-3':'label-3','value-4':'label-4'value-5':'label-5'}
将写成Map型的语法,特别注意在开始位置需要加一个井号“#” 。
例如 :
- <s:select name ='select1' list="#{'1':'A','2':'B','3':'C'}"/>
表现为
- <select>
- <option value="1">A</option>
- <option value="2">B</option>
- <option value="3">C</option>
- </select>
2、赋值一个Map
如果想让各个选项的值与它的行标不同,你可以使用一个Map作为选项的来源。使用Map作为选项的来源很简单:把选项的值作Map的key、把选项的行标作Map的value即可。
- Map<Integer,String> cities = new HashMap<Integer,String> ();
- cities.put("1","A");
- cities.put("2,"B");
- cities.put("3","C"");
- cities.put("4","D);
如果cities是一个动作属性,可以像下面这样把它赋值给list属性。
- <s:select list="cities"/>
或者,如果cities是一个应用程序属性,你可敬以使用如下所示代码:
- <s:select list="#application.cities"/>
3、赋值一个Collection
还可以使用一个对象数组或一个对象Collection来作为选项的来源。此时,将需要用到list、listKey、listValue属性。具体做法时把那个数组或Collection赋值给list属性,把用来提供给选项值的对象属性赋值给listKey属性,把用来提供选项行标的对象属性赋值给listValue属性。
- public class City {
-
- private Integer id;
-
- private String name;
-
- public Integer getId() {
- return id;
- }
-
- public City(Integer id, String name) {
- this.id = id;
- this.name = name;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
- }
集合的代码:
- Collection<City> c = new ArrayList<City>();
- c.add(new City(1,"A"));
- c.add(new City(2,"B"));
- c.add(new City(3,"C"));
- c.add(new City(4,"D"));
页面代码:
- <s:select list="cities" listKey="id" listValue="name"/>
4、在页面中自定义Map型数据:
- <s:iterator value="#{'10':'ff'}">
- <s:checkbox key="value" value='key'/>
- </s:iterator>
在此例中,它是使用key和value两个引用名称来对#{'10':'ff'}作引用的(写法:#{key:value})。
<s:radio list="#{'1':男,'0':女}" listKey="sex" liseValue="sexname" name="user.sex"/>
其中:
listKey的值可能为1或0,在点击提交表单后,其值会赋值给user.sex,
也就是说listKey的值是给服务器的。
listValue的值为男或女,因为它只是给用户显示的看的。
<s:select list=" " listKey=" " listValue=" " name=" "/>
其中:
listKey的值 比如:<option value="1">aaa</option>,其中1就是listKey的值。
该值也是传给服务器的
listValue的值,aaa 就是listValue的值,该值是显示在页面上给用户看的
获取<s:select>的listValue
在开发中我们常用到struts2的form表单组件,其中select最常用的写法如下:
<s:select label="对象类型" name="emp.deptId" list="listValues" listKey="oid" listValue="name" headerKey="" headerValue="--请选择--" οnchange="changeHidenValue(this)"></s:select>
当提交表单时,只能在后台获得listKey的值,而无法提交listValue的值。
现有需求同时提交listKey和listValue,解决方法如下:
1、在select的onchange事件函数中,获得option中的text,即listValue。
2、这时,写回到表单的一个隐藏域中。
首先,在<s:select>标签中添加 (οnchange="changeHidenValue(this)")。然后在表单中添加隐藏域<input type=hidden id="deptName" name="emp.deptName" value=""/>。最后写事件绑定函数,如下:
function changeHidenValue(elem){
var optionVal= $(elem).find("option:selected").text(); // 取到选中的listValue(Option)的值
$("#deptName").val(optionVal);
}