如何将Json作为请求发送到play框架中的控制器文件

时间:2014-11-02 17:19:03

标签: jquery ajax json playframework

我想通过ajax发送json请求,我喜欢从控制器解析。请找到我的以下代码(查看部分)

<input type="checkbox" id="selectall" />
<table id="tbl" border="1">
  <tr>
    <td>
      <input type="checkbox" />
    </td>
    <td>2</td>
    <td>3</td>
    <td>4</td>
  </tr>
  <tr>
    <td>
      <input type="checkbox" />
    </td>
    <td>2</td>
    <td>3</td>
    <td>4</td>
  </tr>
  <tr>
    <td>
      <input type="checkbox" />
    </td>
    <td>2</td>
    <td>3</td>
    <td>5</td>
  </tr>
</table>
<input type="button" id="save" value="save" />
<div id="log"></div>

JQuery部分

 $("#save").click(function() {       
          //get all the checked checboxex
          $('#tab input:checkbox:checked').each(function() {
            //for each checked checkbox, iterate through its parent's siblings
            var array = $(this).parent().siblings().map(function() {
              return $(this).text().trim();
            }).get();
            //to print the value of array
            console.log(JSON.stringify(array))
             $.ajax({
                 type : 'POST',
                 url : '@routes.Application.save()',
                 dataType: "json",
                 data: JSON.stringify(array),
                 success : function(data) {
                    console.log("success"); 

               },
                 error : function() {

                     alert("failure")
                 }

                 });
          })

控制器部分

public static Result saveboxes()
  {
      JsonNode json = null;
      try{
          DynamicForm dynamicForm = new DynamicForm();
            dynamicForm = dynamicForm.bindFromRequest();
            Dynamic dynamic = dynamicForm.get(); 
            json = Json.toJson(dynamic.getData());
            //String data = json.get("data").asText();
            JsonNode jsonData = Json.parse(json.asText());
         logger.info(jsonData.asText());
      }
      catch(Exception e)
      {
          e.printStackTrace();
      }


        return null;
  }

我得到空指针异常。视图将根据用户选择复选框返回多行值。如果用户选择三行,则输入为[“2”,“3”,“4”] [“2”,“3”,“4”] [“2”,“3”,“5”]。我需要获得控制器中的所有值。如果你建议比这更好的方法。这会很棒。

3 个答案:

答案 0 :(得分:0)

我检查了你发送的数据格式,它不是json格式。 它应该是这样的:

{
   [
      "2",
      "3",
      "4"
   ],
   [
      "2",
      "3",
      "4"
   ],
   [
      "2",
      "3",
      "5"
  ]
}

答案 1 :(得分:0)

指定“dataType”是不够的。您还需要设置“contentType”。尝试将contentType: "application/json; charset=utf-8"添加到您的请求中。

看起来应该是这样的:

             $.ajax({
             type : 'POST',
             url : '@routes.Application.save()',
             contentType: "application/json; charset=utf-8,
             dataType: "json",
             data: JSON.stringify(array),
             success : function(data) {
                console.log("success"); 

           },
             error : function() {

                 alert("failure")
             }

             });

如果您不使用UTF-8,请务必选择正确的字符集。

答案 2 :(得分:0)

在脚本部分之前定义jsRouter,之后你可以像下面这样使用它:

@scripts = {
      @helper.javascriptRouter("jsRouter")(
        controllers.routes.javascript.Application.save
      )
       <script type="application/javascript">

                   ...

                   $("#save").click(function() { 
                          ...
                          jsRouter.controllers.Application.save().ajax({
                                  cache: false,
                                  method: "POST",
                                  contentType: "application/json",
                                  data: JSON.stringify({
                                    ...
                                  }),
                                  success: function(data) {
                                    ...
                                  },
                                  error: function(data) {
                                    ...
                                  }
                           });
                   }
       </script>
}