如何使用Spring MVC为每个对象传递列表参数?

时间:2014-02-21 02:09:33

标签: java spring url spring-mvc

我在这里使用Spring MVC RequestMapping作为GET参数。以下是我的代码 -

@RequestMapping(value = "index", method = RequestMethod.GET)
public HashMap<String, String> handleRequest(@RequestParam("dc1Servers") String dc1Servers, @RequestParam("dc2Servers") String dc2Servers, @RequestParam("dc3Servers") String dc3Servers) {
    HashMap<String, String> model = new HashMap<String, String>();
    String helloWorld = "Hello World!";
    model.put("greeting", helloWorld);

    System.out.println(dc1Servers);
    System.out.println(dc2Servers);
    System.out.println(dc3Servers);

    return model;
}

我正在点击此网址 - http://127.0.0.1:8080/dataweb/index?dc1Servers=3&dc2Servers=3&dc3Servers=3然后它进入上面的代码并在控制台上输出3以获取所有打印效果。

现在,如果你看到,我有dc1dc2dc3

因此,对于dc1,我希望将这些内容作为参数发送到这些参数 -

dc1Servers=3

dc1HostA
dc1HostB
dc1HostC

dc1IPAddresssA
dc1IPAddresssB
dc1IPAddresssC

同样对于dc2,我想在URL中将这些作为参数发送 -

dc2Servers=3

dc2HostA
dc2HostB
dc2HostC

dc2IPAddresssA
dc2IPAddresssB
dc2IPAddresssC

同样对于dc3,我想在URL中将这些作为参数发送 -

dc3Servers=3

dc3HostA
dc3HostB
dc3HostC

dc3IPAddresssA
dc3IPAddresssB
dc3IPAddresssC  

现在我不确定如何构建此用例的URL以及我的方法将如何?我想通过一个URL调用发送它们。

这个用例是否可以使用Spring MVC?

2 个答案:

答案 0 :(得分:1)

您可以以任何您认为合适的方式传递参数,一种方法是通过它们的自然分组传递它们:http://127.0.0.1:8080/dataweb/index?dc1Server=dc1HostA,dc1IPAddressA&dc1Server=dcHostB,dc1IPAddressB....

通过为每个组使用相同的参数名称,您需要使用MultiValueMapMultiValueMap或多或少是Map<String, List<String>>,因此具有相同名称的参数(dc1Server,dc2Server等)将位于同一列表中。您可以使用它来获取您传递的参数的完整列表,如下所示:

public HashMap<String, String> handleRequest(@RequestParam MultiValueMap<String,String> allRequestParams) 

然后你有3个密钥,dc1Server将包含所有dc1Server数据,dc2Server所有 dc2Server等

如果您想直接映射到域对象,可以考虑使用@ModelAttributeLink

修改

public void testSpringMultiValueMap() {
        MultiValueMap<String, String> map = new LinkedMultiValueMap<String, String>();
        map.add("dc1Server", "dc1HostA,dc1IPAddressA");
        map.add("dc1Server", "dc1HostB,dc1IPAddressB");
        map.add("dc1Server", "dc1HostC,dc1IPAddressC");
        map.add("dc2Server", "dc2HostA,dc2IPAddressA");
        map.add("dc2Server", "dc2HostB,dc2IPAddressB");
        map.add("dc2Server", "dc2HostC,dc2IPAddressC");

        List<String> dc1List = map.get("dc1Server");

        for(String pair: dc1List) {
            String[] tokens = pair.split(",");
            System.out.println("host: " + tokens[0] + " ip: " + tokens[1]);
        }
    }

答案 1 :(得分:0)

Url参数是字符串,因此传递可变数量字符串的选项是:

在单个url参数中编码您的值

最简单的方法是使用分隔符,如果您知道您的值永远不会包含它们。鉴于您尝试传递IP地址和主机名,这应该适合您:&dc1Servers=dc1HostA,dc1IPAddressA,dc1HostB,dc1IPAddressB等。

多次传递相同的url参数

@RequestParam注释放在String[]类型的方法arg上,并多次传递该url参数:&dc1Host=dc1HostA&dc1IPAddress=dc1IPAddressA&dc1Host=dc1HostB&dc1IPAddress=dc1IPAddressB等。

以下是此方法的更多详细信息:How to pass post array parameter in Spring MVC