【问题标题】:How to make Struts radio tag create a vertical list of radio buttons如何使 Struts 单选标记创建单选按钮的垂直列表
【发布时间】:2012-10-26 18:54:52
【问题描述】:

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

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

  • 第一个对象
  • 第二个对象
  • 第三个对象
  • 我想要的是:

  • 第一个对象
  • 第二个对象
  • 第三个对象
  • 【问题讨论】:

      标签: java html css jsp struts2


      【解决方案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】:

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

      1. 修改扩展主题并修改单选按钮的 struts FTL:Instructions here。这对我来说似乎有点矫枉过正——或者至少我对此太懒了:)

      2. 使用迭代器标签,迭代每个列表项,并为每个列表元素输出一个单选按钮和换行符。回复来自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
               // ...
          }
          

          【讨论】:

            猜你喜欢
            • 2011-08-14
            • 2016-07-29
            • 1970-01-01
            • 2017-02-01
            • 2011-06-05
            • 2015-05-11
            • 2018-01-16
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多