我正在使用一个struts无线电标签,该标签正在填充一个包含两个字段的对象列表:
class MyAction {
List<MyObject> myList;
String selectedId
public String execute() {
...
myList = new ArrayList<MyObject>();
myList.add(new MyObject("1","first object");
myList.add(new MyObject("2","second object");
myList.add(new MyObject("3","second object");
...
}
// Getters and Setters for myList & selectedId
...
}
class MyObject {
String id;
String name;
MyObject(String id, String name) {
this.id = id;
this.name = name;
}
// Getters and Setters for id & name
...
}
这是我在页面上用来显示单选按钮列表的内容
<s:radio key="selectedId" list="myList" listKey="id" listValue="name"/>
然而,这会产生单选按钮的水平列表。我尝试为他们添加一个CSS样式:
<style>
.vertical input { display: block; }
</style>
但这会导致标签和单选按钮显示在不同的行上,而不是同一行上的单选按钮和标签:
第一个对象 第二个对象 第三个对象
我想要的是:
第一个对象 第二个对象 第三个对象
答案 0 :(得分:12)
它实际上很简单,我的意思是使用主题simple
:)
<s:iterator value="myList">
<s:radio theme="simple" name="someNameToSubmit" list="#{id:name}"/><br>
</s:iterator>
这会将name
作为标签,id
作为要提交的媒体
答案 1 :(得分:4)
修改扩展主题并修改单选按钮的struts FTL:Instructions here。这对我来说似乎有些过分 - 或者至少我太懒了:)
使用迭代器标记,遍历每个列表项,并为每个列表元素输出一个单选按钮和换行符。答案来自here
我选择了第二种选择(因为我主要是懒惰的),虽然选项一会很好。
以下是我的struts标签现在的样子:
<s:iterator value="myList">
<s:radio key="selectedId" list="{myObject}" listKey="id" listValue="name"/><br/>
</s:iterator>
因此迭代器在List上工作,因此您将radio标签的list属性设置为仅包含当前myObject的列表。 listKey和listValue则是myObject.id和myObject.name
答案 2 :(得分:3)
我有一个简单的解决方案。在列表中,将<br>
添加到每个项目,例如
first object <br>
虽然它看起来像黑客。
答案 3 :(得分:0)
您也可以在Java代码中使用地图。这也有摆脱MyObject
类的好处。类似的东西:
class MyAction {
Map<String, String> myMap;
String selectedId;
public String execute() {
// ...
myMap = new HashMap<String, String>();
myMap.put("1","first object");
myMap.put("2","second object");
myMap.put("3","second object");
// ...
}
// Getters and Setters for myMap & selectedId
// ...
}