4

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

在服务器端,我尝试了一百万种技术(@ModelAttribute 与 @RequestBody,不同的杰克逊映射 bean 配置)将其转换为单一类型或三种单独的类型(字符串 + 字符串 + 列表/数组)。

我发现的示例仅适用于 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);
...

使用仅包含字符串的 ExportSectionsListForm 对象:

public class ExportSectionsListForm {
private String name;
private String url;
private String rssUrl;
private String sections;
...
(omitting ctor, getters and setters)

另外,我发现了这个有希望的链接:http: //viralpatel.net/blogs/spring-mvc-multi-row-submit-java-list/ 但没有尝试过 - 似乎我需要动态生成输入元素使它起作用,但它实际上可能是正确的解决方案。有人试过吗?

4

2 回答 2

8

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

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

public class ExportSectionsFormBean {
  private String name;
  private String url;
  private String rssUrl;
  private List<String> sections;
  /* getters/setters */
}

然后我的 Controller 方法将如下所示:

@RequestMapping(method = RequestMethod.POST, value = "exportSectionsToExcel")
public HttpEntity<byte[]> createExcelWorkBook(@ModelAttribute ExportSectionsFormBean exportSectionsFormBean ) {
  /* Do whatever with your  */
}

在表单方面,使用 Spring JSTL 标记,只需使您的“部分”字段看起来像:

<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 请求中,就可以了。

于 2013-03-19T12:34:01.373 回答
1

我一直在研究同样的问题。如果我有几个输入名称相同,例如:

<input name="somename"/>
<input name="somename"/>
<input name="somename"/> 

我有一个映射到我的方法的表单,如下所示:

@ModelAttribute("ReturnsAndExchangesForm") ReturnsAndExchangesForm    returnsAndExchangesForm

在那种形式中,我有一个名为: String[] somename 的属性的 getter 和 setter,spring 很好地将这些值传递到该数组中!

于 2015-07-14T00:29:45.477 回答