如何使 Struts 单选标签创建单选按钮的垂直列表

Posted

技术标签:

【中文标题】如何使 Struts 单选标签创建单选按钮的垂直列表【英文标题】:How to make Struts radio tag create a vertical list of radio buttons 【发布时间】:2011-08-14 03:09:44 【问题描述】:

我正在使用一个 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>

但这会导致标签和单选按钮也显示在不同的行上,而不是单选按钮和标签显示在同一行:

第一个对象 第二个对象 第三个对象

我想要的是:

第一个对象 第二个对象 第三个对象

【问题讨论】:

【参考方案1】:

其实很简单,我的意思是使用主题simple :)

<s:iterator value="myList"> 
  <s:radio theme="simple" name="someNameToSubmit" list="#id:name"/><br>
</s:iterator> 

这将使name 作为标签,id 作为要提交的属性

【讨论】:

看起来几乎像我的解决方案。几个问题(我是新来的struts)......“简单”主题有什么作用?列表属性中的“#”有什么作用。我想我理解“”运算符。 @James Reed :简单的主题将删除 struts2 标签的布局,它的行为就像一个简单的 html 标签,例如当您使用
标记时,struts2 会在表单周围添加一个带有“wwFormTable”类的表格。您可以通过查看 jsp 页面的源代码来看到这一点。将简单主题应用于此表单将删除该表格代码。在在我们的例子中,由 struts2 完成的单选分组将被删除,单选标记将表现为简单的 HTML 单选。“#”将使 id 和 name 成为有点类似于哈希表的键值对
【参考方案2】:

经过一番谷歌搜索...我找到了一些解决方案:

    修改扩展主题并修改单选按钮的 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

【讨论】:

【参考方案3】:

我有一个简单的解决方案。在列表中,将&lt;br&gt; 添加到每个项目,例如,

first object <br> 

虽然看起来像 hack。

【讨论】:

【参考方案4】:

您也可以只在 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
     // ...

【讨论】:

以上是关于如何使 Struts 单选标签创建单选按钮的垂直列表的主要内容,如果未能解决你的问题,请参考以下文章

在动态创建单选按钮方面需要帮助

水平居中单选按钮标签

垂直对齐单选按钮旁边的文本

在其线性布局垂直父Android中将以编程方式创建的单选按钮居中

如何从插入到 innerHtml 的单选按钮中获取值

html中<radio>单选按钮控件标签用法解析及如何设置默认选中