如何使用Spring MVC将多个值从表单传递给控制器​​?

时间:2014-02-22 08:53:45

标签: java spring spring-mvc

我正在使用Spring MVC模式,我正在尝试创建一个类似于此的JSP文件 -

在表单中,我有四行,第一行仅用于标记,另外三行我需要将我的数据放在文本框中。例如 - 对于DC1,我会在文本框中插入numServers值,我会在文本框中插入ipaddress值,在文本框中插入hostname值。

<form method="post" enctype="multipart/form-data">
    <table>
        <tr>
            <td>Datacenter Name</td>
            <td>Number of Servers</td>
            <td>IP Address(comma separated)</td>
            <td>Host Name(comma separated)</td>
        </tr>
        <tr>
            <td><label for="dc1">DC1</label></td>
            <td><input type="text" name="numservers" size="20"></td>
            <td><input type="text" name="ipaddress" size="60"></td>             
            <td><input type="text" name="hostname"  size="60"></td>
        </tr>
        <tr>
            <td><label for="dc1">DC2</label></td>
            <td><input type="text" name="numservers" size="20"></td>
            <td><input type="text" name="ipaddress" size="60"></td>             
            <td><input type="text" name="hostname"  size="60"></td>
        </tr>
        <tr>
            <td><label for="dc1">DC3</label></td>
            <td><input type="text" name="numservers" size="20"></td>
            <td><input type="text" name="ipaddress" size="60"></td>             
            <td><input type="text" name="hostname"  size="60"></td>
        </tr>
        <tr><td colspan="2">&nbsp;</td></tr>
    </table>
    <input type="submit">
</form>

现在我应该在点击提交按钮后读取这些值,因为我将在文本框中键入必要的值。我在下面的代码中使用了RequestMapping -

@RequestMapping(value = "test", method = RequestMethod.GET)
public HashMap<String, String> testRequest(@RequestParam MultiValueMap<?, ?> allRequestParams) {

}

最初,我使用的是MultiValueMap,但我不确定我的上述输入标准是如何适合这种情况的?一般来说,我不知道如何在上述用例的上述方法中构造输入,以便我可以在方法中轻松提取所有值?

这是我第一次开始使用Spring MVC,因此遇到了一些困难。

3 个答案:

答案 0 :(得分:1)

您可以将数组传递给弹簧控制器,如下所示:

  @RequestMapping(value = "test", method = RequestMethod.GET)
    public HashMap<String, String> testRequest(@RequestParam String[] numservers, @RequestParam String[] ipaddress, @RequestParam String[] hostname) {
    //By using array position you can determine each row
    //DC1 values
    String dc1_numServer = numservers[0];
    String dc1_ipaddres= ipaddress[0];
    String dc1_hostname= hostname[0];
    //DC2 values
    String dc2_numServer = numservers[1];
    String dc2_ipaddres= ipaddress[1];
    String dc2_hostname= hostname[1];
    //DC3 values
    String dc3_numServer = numservers[2];
    String dc3_ipaddres= ipaddress[2];
    String dc3_hostname= hostname[2];
    }

答案 1 :(得分:0)

一种简单的方法是定义一个模型来保存整个信息:

public class Datacenter {

    private String name;
    private String ipAddress;
    private String hostName;
    private String numServers;
    // Add getters and setters..
}


public class Datacenters {
    private List<Datacenter> datacenters;
    //Getters and setters..
}

现在,您必须通过以下方式更改表单以干净地绑定到此数据结构:

    <tr>
        <td><label for="dc1">DC1</label></td>
        <input type="hidden" name="datacenters[0].name" value="DC1"/>
        <td><input type="text" name="datacenter[0].numServers" size="20"></td>
        <td><input type="text" name="datacenter[0].ipAddress" size="60"></td>             
        <td><input type="text" name="datacenter[0].hostName"  size="60"></td>
    </tr>
    <tr>
        <td><label for="dc1">DC2</label></td>
        <input type="hidden" name="datacenters[1].name" value="DC2"/>
        <td><input type="text" name="datacenter[1].numServers" size="20"></td>
        <td><input type="text" name="datacenter[1].ipAddress" size="60"></td>             
        <td><input type="text" name="datacenter[1].hostName"  size="60"></td>
    </tr>

通过此更改,您只需以这种方式将此模型绑定到Controller:

@RequestMapping(value = "test", method = RequestMethod.GET)
public String testRequest(DataCenters dataCenters) {
    //.. process request
}

就是这样,Spring应该为你绑定一切。

答案 2 :(得分:0)

发生状态405是因为该方法的侦听器是GET。 您需要将其更改为POST,以便它接受帖子。