Spring mvc 在SpringMVC中使用项目数组处理表单post

Spring mvc 在SpringMVC中使用项目数组处理表单post,spring-mvc,deserialization,forms,Spring Mvc,Deserialization,Forms,我正在尝试将一些数据从客户端发送到服务器,并将其处理为文件下载。 我使用一个简单的HTML表单,因为我想初始化文件下载(而不是AJAX)。 表单字段之一是项数组。(其他两个是名称和说明字符串)。 在提交表单之前,我将此字段序列化为字符串(JSON.stringify) 在服务器端,我尝试了一百万种技术(@modeldattribute与@RequestBody,不同的jackson映射bean配置)将其转换为单个类型或三个单独的类型(String+String+List/Array) 我发现的示

我正在尝试将一些数据从客户端发送到服务器,并将其处理为文件下载。 我使用一个简单的HTML表单,因为我想初始化文件下载(而不是AJAX)。 表单字段之一是项数组。(其他两个是名称和说明字符串)。 在提交表单之前,我将此字段序列化为字符串(JSON.stringify)

在服务器端,我尝试了一百万种技术(@modeldattribute与@RequestBody,不同的jackson映射bean配置)将其转换为单个类型或三个单独的类型(String+String+List/Array)

我发现的示例仅适用于AJAX。。。 有人能提供一个有效的例子或描述吗

=======

更新: 我已经通过JSON实现了一个变通方法。stringify-ing集合并将其传递到一个输入中, 在服务器端,我有:

@RequestMapping(method = RequestMethod.POST, value = "exportSectionsToExcel")
  public HttpEntity<byte[]> createExcelWorkBook(@ModelAttribute ExportSectionsListForm exportSectionsListForm) {
Section[] sectionObjects = gson.fromJson(exportSectionsListForm.getSections(), Section[].class);
...
此外,我还发现了这个有希望的链接:
但我没有尝试过——似乎我需要动态生成输入元素才能工作,但它实际上可能是正确的解决方案。有人尝试过吗?

@modeldattribute标记将尝试基于表单发布构建对象。因为您正在将表单值序列化为JSON,所以这不起作用@RequestBody只提供一个表示请求正文的字符串。因此,您可以获取表示传入的JSON的字符串,然后使用FlexJSON的Jackson(或您使用的任何JSON库)对JSON进行解压。不过,我不确定这是不是最好的办法

我想问一下,为什么首先需要将表单序列化为JSON。Spring可以很好地处理带有列表/映射的表单。只需使用@modeldattribute提交表单,在控制器上创建“数组”和列表,或者您期望的任何内容。因此,如果我正确解释了您的示例,我的ModelAttribute将如下所示:

public class ExportSectionsFormBean {
  private String name;
  private String url;
  private String rssUrl;
  private List<String> sections;
  /* getters/setters */
}
@RequestMapping(method = RequestMethod.POST, value = "exportSectionsToExcel")
public HttpEntity<byte[]> createExcelWorkBook(@ModelAttribute ExportSectionsFormBean exportSectionsFormBean ) {
  /* Do whatever with your  */
}
<form:input path="sections[0]" />
<form:input path="sections[1]" />
公共类导出部分fORBEAN{
私有字符串名称;
私有字符串url;
私有字符串rssUrl;
私人名单部分;
/*能手/二传手*/
}
然后,我的控制器方法如下所示:

public class ExportSectionsFormBean {
  private String name;
  private String url;
  private String rssUrl;
  private List<String> sections;
  /* getters/setters */
}
@RequestMapping(method = RequestMethod.POST, value = "exportSectionsToExcel")
public HttpEntity<byte[]> createExcelWorkBook(@ModelAttribute ExportSectionsFormBean exportSectionsFormBean ) {
  /* Do whatever with your  */
}
<form:input path="sections[0]" />
<form:input path="sections[1]" />
@RequestMapping(method=RequestMethod.POST,value=“exportSectionsToExcel”)
公共HttpEntity createExcelWorkBook(@ModelAttribute ExportSectionsFrombean ExportSectionsFrombean){
/*用你的钱做任何事*/
}
在表单端,使用Spring JSTL标记,只需将“sections”字段设置为:

public class ExportSectionsFormBean {
  private String name;
  private String url;
  private String rssUrl;
  private List<String> sections;
  /* getters/setters */
}
@RequestMapping(method = RequestMethod.POST, value = "exportSectionsToExcel")
public HttpEntity<byte[]> createExcelWorkBook(@ModelAttribute ExportSectionsFormBean exportSectionsFormBean ) {
  /* Do whatever with your  */
}
<form:input path="sections[0]" />
<form:input path="sections[1]" />

或者,如果您更愿意使用HTML,那么

<input type="text" name="sections[0]" id="sections0" />
<input type="text" name="sections[1]" id="sections1" />


这就是上面的JSTL标记生成的内容。只要将“sections”的值作为“section[#]=value”放入HTTP请求中,您就都已设置好了。

我一直在处理相同的问题。如果我有几个同名的输入,比如:

<input name="somename"/>
<input name="somename"/>
<input name="somename"/> 
在这种形式下,我有一个名为:
String[]somename,spring正在将这些值很好地传递到该数组中

请告诉我您的控制器代码好吗?我尝试了许多技术-每种技术都会导致不同的问题,但都不起作用-因此我正在寻找一个工作示例…因为我不在办公室,所以无法提供我的代码,但我建议您向控制器方法添加断点,并检查请求中存储的数据类型。谢谢。我通常要么得到几个异常中的一个,要么得到一个空数组/列表。我正在寻找一个解决方案,其中包括:(1)客户端序列化(json?方括号数组项,如项[1],项[2]等?)和(2)带注释的控制器方法签名+bean配置。您可以使用firebug检查发送给控制器的数据。谢谢,这正是我想要的——我在我链接的文章中也提到了这一点——但我没有测试它(因为我使用了一种更丑陋的解决方法)。Spring MVC中的列表/地图的一个caviat允许添加/删除表单是,如果您将ModelAttribute放入会话中,您必须以某种方式跟踪您删除的列表/地图。问题是ModelAttribute只创建一次,因此设置了list/map。后续发布不会重新构建列表/映射,只会修改/插入您在post表单中特别引用的项目。例如,如果列表中有10个项目,并且删除了视图侧的第5个项目,Spring将设置为1-4和6-10,而5仍然是旧值,因为post没有携带#5。