0

有很多教程展示了如何使用简单的 POJO 模型对象和 Spring taglib 上的“command”属性构建表单。

示例: 教程

不过,我似乎很喜欢让我的生活变得艰难,并且让我的表单在一个 jQuery 对话框中运行......其复选框状态是使用 javascript 函数进行预处理的。我通过该javascript函数中的AJAX调用来做到这一点。

Sooo,我的表单初始化如下所示:

<form:form action="javascript:associateArtifacts()">

这调用了我的 javascript 方法:

function associateArtifacts(){
/* JSONIFY the list of checked boxes and send that data to the server here in an AJAX call */
var artifacts = [];
$('#artifacts_container input:checkbox').each( function(j,listitem) {
    artifacts.push(listitem.name);
});

$.ajax({
    type: "POST",
    url: "associateArtifacts.html",
    data:JSON.stringify(artifacts),
    success: function(html){
      alert( "Submitted");
    }
}); 
return false;

}

重点是构建一个包含复选框列表的对话框,这些复选框根据用户可以修改的数据库数据进行检查,然后保存回服务器。

我的问题是,我正在启动对话框并使用复选框填充并加载值,但我似乎没有考虑透彻,因为我不知道如何拦截以 JSON 形式传入服务器的数据并处理它.

过去,我使用 URL 参数来完成此操作,但在这种情况下,是一个可变大小的大型 JSON 数据字符串。

我是否将被迫定义一个仅包含一个列表的对象,以便我的 Spring MVC 容器将此 JSON 数据分配给?好像有点可笑...

想法?建议?对这完全错误的严厉批评?

感谢以上任何一项。

编辑

签名看起来像这样:

@RequestMapping(value = "/associateArtifacts.html", method = RequestMethod.POST, headers = {"content-type=application/json"})   
public void associateArtifacts(@RequestBody List<String> checkboxData){  

Chrome 工具中数据的客户端如下所示:

["checkboxTitle1","checkboxTitle2","checkboxTitle3"]:

当我使用我的复选框名称数组并对它执行以下操作时,这是由我的客户生成的:

JSON.stringify(arrayOfNames)

当前错误是:

HTTPStatus 415 - The server refused this request because the request entity is in a format not supported by the requested resource for the requested method.

编辑#2

正如您所建议的,这是我的 AJAX 调用中缺少 contentType 。谢谢。

4

1 回答 1

2

假设您的 JSON 是这样的:

"[{checkbox1: 'true'}, {checkbox2: 'false'}]"

首先在你的类路径中包含jackson-mapper-asl

<dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-mapper-asl</artifactId>
    <version>1.9.13</version>
</dependency>

像这样使用 JQuery ajax 发布:

$.ajax({
  type: "POST",
  url: "associateArtifacts.html",
  data: JSON.stringify(artifacts),
  contentType: 'application/json',
  success: function(html) {
    alert("Submitted");
  }
});

并像这样定义您的 Spring MVC 控制器处理程序方法:

@RequestMapping(value = "/associateArtifacts.html", method = RequestMethod.POST, headers = {"Content-type=application/json"})
@ResponseBody
public MyResponse associateArtifacts(@RequestBody List<Map<String,String>> checkboxData) {
  // .. process the data here
}

JSON 字符串将自动绑定到映射列表(键值对)中。

@ResponseBody注解会导致返回的对象MyResponse被序列化为 JSON

于 2013-08-13T23:43:44.593 回答