【问题标题】:how to capture multiple parameters using @RequestParam using spring mvc?如何使用spring mvc使用@RequestParam捕获多个参数?
【发布时间】:2014-04-19 09:12:37
【问题描述】:

假设点击了一个超链接并使用下面的参数列表myparam=myValue1&myparam=myValue2&myparam=myValue3 触发了一个url。现在如何在spring mvc中使用@RequestParam捕获所有参数?

我的要求是我必须捕获所有参数并将它们放在地图中。

请帮忙!

【问题讨论】:

  • 你所有的参数都叫“myparam”吗?

标签: spring spring-mvc annotations


【解决方案1】:
@RequestMapping(value = "users/newuser", method = RequestMethod.POST)   
public String saveUser(@RequestParam Map<String,String> requestParams) throws Exception{
   String userName=requestParams.get("email");
   String password=requestParams.get("password");

   //perform DB operations

   return "profile";
}

您可以按照上述方式使用 RequestParam。

【讨论】:

  • 如何对这种类型的地图对象进行soapui休息测试?
  • 如果RequestParams是不同的数据类型怎么办?
  • 这不能回答问题。问题是询问具有多个同名值的参数。
【解决方案2】:

好像拿不到

Map<String,String>

因为您所有的参数都具有相同的名称“myparam”

试试这个:

public ModelAndView method(@RequestParam("myparam") List<String> params) { }

【讨论】:

  • 应该是 '@RequestParam' 而不是 '@RequestRaram'。注意“P”而不是“R”。我尝试使用上面的代码并得到一个错误并且由于这个微妙的拼写错误而没有立即发现它。希望这可以帮助某人。感谢您提供有用的答案:)
【解决方案3】:

要一次获取所有参数,试试这个:

public ModelAndView postResultPage(@RequestParam MultiValueMap<String, String> params)

@RequestParam java doc(3.段落)中描述了此功能:

表示方法参数应绑定到 Web 请求参数的注解。支持 Servlet 和 Portlet 环境中的带注释的处理程序方法。

如果方法参数类型是 Map 并且指定了请求参数名称,则假设适当的转换策略可用,则请求参数值将转换为 Map。

如果方法参数为Map&lt;String, String&gt;MultiValueMap&lt;String, String&gt; 且未指定参数名称,则使用所有请求参数名称和值填充映射参数。

【讨论】:

  • 好的,我明白了。我可以在 params 中获取所有参数及其值,现在我该如何使用它们?请给我看..
  • 如果您有多个同名参数,这是最好的解决方案
【解决方案4】:

从 Spring 3.0 开始,您还可以使用 MultiValueMap 来实现此目的:

一个基本的例子是:

public String someMethod(@RequestParam MultiValueMap<String,String> params) {

    final Iterator<Entry<String, List<String>>> it = params.entrySet().iterator();

    while(it.hasNext()) {
        final String k = it.next().getKey();
        final List<String> values = it.next().getValue();
    }

    return "dummy_response";

}

【讨论】:

  • 你知道 Swagger 是否支持这个选项吗?
【解决方案5】:

如果有人尝试在 Spring Boot 中做同样的事情,请使用 RequestBody 代替 RequestParam

【讨论】:

    【解决方案6】:

    Spring mvc 可以支持List&lt;Object&gt;Set&lt;Object&gt;Map&lt;Object&gt; 参数,但没有@RequestParam

    List&lt;Object&gt;为例,如果你的对象是User.java,它是这样的:

    public class User {
        private String name;
        private int age;
    
        // getter and setter
    }
    

    你想传递List&lt;User&gt;的参数,你可以使用这样的url

    http://127.0.0.1:8080/list?users[0].name=Alice&users[0].age=26&users[1].name=Bob&users[1].age=16
    

    记得对url进行编码,编码后的url是这样的:

    http://127.0.0.1:8080/list?users%5B0%5D.name=Alice&users%5B0%5D.age=26&users%5B1%5D.name=Bob&users%5B1%5D.age=16
    

    List&lt;Object&gt;Set&lt;Object&gt;Map&lt;Object&gt; 的示例显示在my github 中。

    【讨论】:

    【解决方案7】:

    你可以这样使用多个参数

    public String saveUser(@RequestParam("email") String userName, @RequestParam("password") String password) throws Exception{
       //your code
       //perform DB operations
    
       return "profile";
    }
    

    【讨论】:

      【解决方案8】:

      您可以使用多个@RequestParam 注释,如下所示。

      @RequestParam(value="myparam1", required = true) <Datatype> myparam1,
      @RequestParam(value = "myparam2", required = false) <Datatype> myparam2,
      

      【讨论】:

        猜你喜欢
        • 2020-11-11
        • 2020-12-06
        • 2013-01-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多