如何将多个对象从模板映射到控制器

时间:2012-01-22 05:44:47

标签: java templates groovy playframework

我有一个带有输入框表的模板,每行代表一个模型对象。 我无法弄清楚在我的控制器中映射它的最佳方法是什么。

  #{form id:'targetsForm', method:'POST', action:@createTargets()}
      <table  id="targetsTable">
      <tr>
        <th>Name</th>
        <th>January</th>
        <th>February</th>
        <th>March</th>
      </tr>
      <tbody>
        <tr>
        <td class="center" id="object2">Object1</td>
        <td class="center"><input id="01-jan" type="number" name="01-jan" size="20" value="" class="target-input" /></td>
        <td class="center"><input id="01-feb" type="number" name="01-feb" size="20" value="" class="target-input" /></td>
        <td class="center"><input id="01-mar" type="number" name="01-mar" size="20" value="" class="target-input" /></td>
        </tr>
        <tr>
        <td class="center" id="object2">Object2</td>
        <td class="center"><input id="02-jan" type="number" name="02-jan" size="20" value="" class="target-input" /></td>
        <td class="center"><input id="02-feb" type="number" name="02-feb" size="20" value="" class="target-input" /></td>
        <td class="center"><input id="02-mar" type="number" name="02-mar" size="20" value="" class="target-input" /></td>
        </tr>
      </tbody>
      </table>
  #{/form}

如何在路径和控制器中映射对象1和对象2,知道表单中可能有n个对象?

1 个答案:

答案 0 :(得分:3)

在您的模板中,您可以执行以下操作:

#{form @createTargets()}

    #{field 'january[0]'}
        <input type="number" name="${field.name}" value=""/>
    #{/field}
    #{field 'february[0]'}
        <input type="number" name="${field.name}" value=""/>
    #{/field}
    #{field 'march[0]'}
        <input type="number" name="${field.name}" value=""/>
    #{/field}

    #{field 'january[1]'}
        <input type="number" name="${field.name}" value=""/>
    #{/field}
    #{field 'february[1]'}
        <input type="number" name="${field.name}" value=""/>
    #{/field}
    #{field 'march[1]'}
        <input type="number" name="${field.name}" value=""/>
    #{/field}
#{/form}

然后在您的控制器中,您的createTargets方法将如下所示:

public static void save(List<Integer> january, List<Integer> february, List<Integer> march) { ... }

您无需执行任何特殊操作即可将模板中的字段映射到控制器。 Play会将名称(即1月,2月,3月)映射到控制器中参数的名称。

您可以创建如下对象:

,而不是将单个月作为参数添加到操作方法中
public class Target {
    private int january;
    private int february;
    private int march;

    ...
}

然后模板看起来像这样:

#{form @createTargets()}

    #{field 'targets[0].january'}
        <input type="number" name="${field.name}" value=""/>
    #{/field}
    #{field 'targets[0].february'}
        <input type="number" name="${field.name}" value=""/>
    #{/field}
    #{field 'targets[0].march'}
        <input type="number" name="${field.name}" value=""/>
    #{/field}

    #{field 'targets[1].january'}
        <input type="number" name="${field.name}" value=""/>
    #{/field}
    #{field 'targets[1].february'}
        <input type="number" name="${field.name}" value=""/>
    #{/field}
    #{field 'targets[1].march'}
        <input type="number" name="${field.name}" value=""/>
    #{/field}
#{/form}

然后控制器就是这样:

public static void save(List<Target> targets) { ... }