【问题标题】:How to pass post array parameter in Spring MVC如何在 Spring MVC 中传递 post 数组参数
【发布时间】:2011-07-20 22:31:18
【问题描述】:

我只是想知道如何传入 post 参数,例如从 html 选项中获取 exercept,通常我会得到一个语言如 php 的数组(我相信POST['param'][0]... 会起作用)

url?param=value1&param=value2&param=value3

我试过了:

@RequestMapping(value="/schedule", method = RequestMethod.POST)
public void action(String[] param)

但这由于某种原因不起作用......

任何想法将不胜感激!

【问题讨论】:

  • 我想你想将@RequestParam 添加到你的方法参数中
  • 建议的解决方案是否有效?
  • 嗨,即使我现在也面临同样的问题。所以最好使用 -> (@RequestParam(value = "param[]") String[] paramValues) "OR" (@RequestParam MultiValueMap params) 。我很迷惑。你能帮帮我吗?
  • 我认为最好的语法是 param[]=value1&param[]=value2&... 因为多个简单的(没有像“[]”这样的特殊后缀)参数可能被视为程序错误。 Spring MVC 可以解析成数组吗?

标签: spring-mvc


【解决方案1】:

如果你知道你的参数名称,试试

@RequestMapping(value="/schedule", method = RequestMethod.POST)
public void action(@RequestParam("myParam") String param)

另一种方法是使用当前请求对象:

@RequestMapping(value="/schedule", method = RequestMethod.POST)
public void action(HttpServletRequest request) {
Map parameterMap = request.getParameterMap();
...

}

【讨论】:

    【解决方案2】:

    这应该有效:

    @RequestMapping(value="/schedule", method = RequestMethod.POST)
    public void action(@RequestParam("param") String[] param)
    

    【讨论】:

    • 这确实有效,但与问题所要求的略有不同 - 这将映射一个具有数组作为值的 SINGLE 参数;但是 MULTIPLE 参数(可能是动态且难以预料的名称)不能像这样映射。
    • @Eugen:嗨,即使我现在也面临同样的问题。所以最好使用 -> (@RequestParam(value = "param[]") String[] paramValues) "OR" (@RequestParam MultiValueMap params) 。我很迷惑。你能帮帮我吗?
    【解决方案3】:

    你可以用这个:

    @RequestMapping(value="/schedule", method = RequestMethod.POST)
    public void action(@RequestParam(value = "param[]") String[] paramValues){...}
    

    它将检索参数param的所有值(在数组paramValues内)(注意RequestParam的属性value:它以[]结尾)

    【讨论】:

    • 顺便说一下,当你在jquery中发送ajax参数时,不要忘记让数组参数名称也以“[]”结尾。
    • 这适用于整数还是长数组?到目前为止,我只能使用字符串来完成这项工作。
    • @kaleemsagard 嗨,即使我现在也面临同样的问题。所以最好使用 -> (@RequestParam(value = "param[]") String[] paramValues) "OR" (@RequestParam MultiValueMap params) 。我很迷惑。你能帮帮我吗?
    • @Chandz 我认为@RequestParam MultiValueMap<String, String> params 检索请求中的所有参数,而不仅仅是需要的参数param 的值,因此您可以使用MultiValueMap 对象并搜索它是参数param 的所有出现次数。这可能比@RequestParam(value = "param[]") 更难。
    【解决方案4】:
    @RequestMapping(value="/schedule", method = RequestMethod.POST)
    public void action(@RequestParam(value = "param[]") String[] paramValues {...}
    

    当您通过 jQuery 发送例如 ajax 时,这将起作用:

    $.ajax({
        type: "POST",
        data: { param:paramValues }
        ...
    });
    

    但是,当您只发送包含逗号“foo,baa”之类的字符串的单个元素数组时,Spring 将拆分此字符串并创建包含 2 个元素“foo”和“baa”的数组。 因此,当您的数组也可以有一个元素时,请注意逗号。

    【讨论】:

      【解决方案5】:

      如果有人还在为此苦苦挣扎,那就应该这样做:

      表单输入:

      <input name="myParam" value="1"/>
      <input name="myParam" value="4"/>
      <input name="myParam" value="19"/>
      

      控制器方法:

         @RequestMapping
          public String deletePlaces(@RequestParam("myParam") Long[] myParams) {
      
            //myParams will have 3 elements with values 1,4 and 19
          }
      

      这对String[] Integer[] Long[] 和可能更多。 POST,GET,DELETE 会以同样的方式工作。

      参数名称必须与表单输入中的name 标记匹配。不需要额外的[] 等等。实际上,参数名称可以省略,如果方法参数名称与输入名称相同,那么我们最终可以得到这样的方法签名:

         @RequestMapping
         public String deletePlaces(@RequestParam Long[] myParams) 
      

      它仍然可以工作

      一些额外的东西: 现在,如果您有域模型,可以说Place 并且您有PlaceRepository,通过提供Place#id 作为输入值,Spring 可以为我们查找相关对象。因此,如果我们假设上面的表单输入包含用户 ID 作为值,那么我们可以简单地将其写入控制器:

      public String deletePlaces(@RequestParam Place[] places) {
        //places will be populated with related entries from database!
       }
      

      是不是很甜?

      【讨论】:

        【解决方案6】:

        1、添加一个java类作为requestBody

        public class PostMembers {
            private String[] members;
        
            public String[] getMembers() {
                return members;
            }
        
            public void setMembers(String[] members) {
                this.members = members;
            }
        }
        

        2、在控制器类中添加方法

        @PostMapping("")
        public List<SomeClass> addMember(@RequestBody PostMembers postMembers) {
        // ...
        }
        

        现在您的控制器可以获取数组参数了。

        3、用 curl 测试

        curl -H "Content-Type:application/json"  \
         -X POST -d '{"members":["item1","item2"]}' \
         http://localhost:8080/api/xxx
        

        或者如果你使用 vue

        axios.post(someUrl,{
            members:[
               'item1','item2'
            ]
        }).then(response =>{
        // ...
        })
        

        【讨论】:

          猜你喜欢
          • 2014-07-02
          • 2013-11-25
          • 1970-01-01
          • 2011-10-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-06-06
          • 1970-01-01
          相关资源
          最近更新 更多