2015-02-12 2 views
1

Сколько способов передать данные JSON контроллеру пружины?Как манипулировать данными JQuery AJAX JSON в контроллере весной MVC

Я последовал this tutorial, и они передают данные, используя следующий синтаксис:

data: "{\"name\":\"hmkcode\",\"id\":2}", 

Это работает, но так как мне нужно, чтобы получить данные от пользователя с помощью ввода текста, я не знаю, как поставить мой переменная в этой строке.

Я пытался делать, используя следующий синтаксис:

data: "{\"name\":\name\}" 

Но он возвращает следующую ошибку:

status: parsererror er:SyntaxError: Unexpected tokken a

Я видел другие сайты, которые используют следующий синтаксис:

data: {"name":name} 

Но это дает мне ту же ошибку.

Это работает, но я не знаю, подходит ли наилучший подход.

var json = {"name" : name}; 
... 
data: JSON.stringify(json), 

мне удается передать строку JSON к одному из моих контроллеров, но я получаю строку, как это:

{"name": Joe, "lastname": Smith} 

Есть ли способ, чтобы получить только что информация в Person объект или, по крайней мере, получить только Джо в цепочке и Смита в другом?

<script src="http://ajax.googleapis.com/ajax/libs/jquery/2.0.2/jquery.min.js"></script> 

<script type="text/javascript"> 

     function doAjaxPost() 
     { 
      // get the form values 
      var name = $('#name').val(); 
      var lastname = $('#lastname').val(); 

      var json = {"name" : name, "lastname" : lastname}; 
      //console.log(json); 
      $.ajax(
      { 
       type: "POST", 
       url: "formShow", 
       data: JSON.stringify(json), 
       //data: "{\"name\":name}", 
       //data: {"name":name}, 
       contentType: "application/json; charset=utf-8", 
       dataType: "json", 
       cache: false, 

       beforeSend: function(xhr) 
          { 
           xhr.setRequestHeader("Accept", "application/json"); 
           xhr.setRequestHeader("Content-Type", "application/json"); 
          }, 
       success: function(data) 
         { 
          //console.log(data);  
          console.log(data.name); 
          //var data = $.parseJSON(JSON.stringify(response)); 
          //alert(data); 
          alert("name: "+data.name); 
          //$('#name').val(''); 
         }, 
       error:function(data,status,er) { 
        alert("error: "+data+" status: "+status+" er:"+er); 
       } 
       /* error: function (xhr, ajaxOptions, thrownError) 
         { 
          alert(xhr.status); 
          alert(xhr.responseText); 
          alert(thrownError); 
       }*/ 
      }); 
     } 
</script> 

<fieldset> 
<legend>Name in view</legend> 
     Name in view: <input type="text" id="name" name="name"> 
    <br> 
    Last Name in view: <input type="text" id="lastname" name="lastname"> 
    <br> 

    Show modify name in view: <input type="text" id="modifyname" name=""modifyname""> 
    <br> 
    <input type="button" value="Add Users" onclick="doAjaxPost()"> 
</fieldset> 
<br> 

И это мои контроллеры:

@RequestMapping(value = "formShow", method = RequestMethod.GET) 
    public String formularioIncidencia (Model model) { 
     return "formShow"; 
    } 

    @RequestMapping(value = "formShow", method = RequestMethod.POST) 
    public @ResponseBody String getTags(@RequestBody String name) 
    { 

     String variableAjax= name; 
     System.out.println("controller variable is " + variableAjax); 
     //that prints me this "{name: Joe, lastname: Smith}" 
     return variableAjax; 
    } 

EDITED **** это мой класс Пользователь

public class Userimplements Serializable { 

    private static final long serialVersionUID = 1L; 

    private String name; 
    private String lastname; 

    public User(){} 
} 

Я редактировал мои контроллеры к следующему

@RequestMapping(value = "formShow", method = RequestMethod.GET) 
    public String formShow(Model model) { 
     return "formShow"; 
    } 

@RequestMapping(value = "formShow", method = RequestMethod.POST) 
public @ResponseBody User getTags(@RequestBody final User user, Model model) 
{ 

    //what should i do here parse my user to JSON how?? 
    user.setName("name changed"); 
    model.("modifyname", user.getName()); 
    return User; 
} 

ответ

0
  1. Для отправки входных данных контроллеру вам необязательно использовать json в качестве формата. Вы можете просто передать их в качестве параметра запроса и извлечь его на контроллере, используя аннотацию @RequestParam. Если вы хотите опубликовать данные json, вы можете использовать JSON.stringify (json). если вы привяжете объект к объекту модели, попробуйте использовать @Modelattribute на контроллере и передайте данные в своем сообщении ajax. Для этого есть много примеров.
  2. Использование @RequestParam или @RequestBody, чтобы получить данные о контроллере на основе какой подход вы выбираете основанный на точке 1.
  3. Использование @ResponseBody для передачи данных обратно, и если вы отправляете данные JSON обратно, используйте Json.parseJson для преобразования в объект js или при отправке карты вы получите объект JS в своем обработчике ajax. Вы можете использовать нотацию Dot для заполнения данных.
0

Несколько наблюдений будут просвещены (я надеюсь).

В JAVA: всегда лучше указать свой «запрос» объект и ваш объект ответа, как это:

@RequestMapping(method = RequestMethod.POST, value = "/rest/path/to/action", 
consumes = "application/json", produces = "application/json") 
    @ResponseStatus(value = HttpStatus.OK) 
    public @ResponseBody 
    List<?> action(@RequestBody List<?> requestParam) { 
    List<String> myret = new ArrayList<String>(); 
    for (int i=0; i < requestParam.size() ;i++){ 
     myret.add(requestParam.get(i).toString()); 
    } 

}

В этом случае я определил тот же объект «List», как мой запрос и мой объект ответа, но это зависит от ваших определений. Если вы хотите представить объект пользователя, вы должны определить свой пользовательский объект и указать поля u want with Jackson lib. Это немного сложно, но как только вы его получите, вы можете передать любой объект, который вы хотите.

А затем вы можете просто передать свои данные в AJAX, как определено в вашем контроллере. Так что в этом случае будет:

var postData = ["Somedata", "Someotherdata"]; 
$.ajax(
      { 
       type: "POST", 
       url: "/rest/path/to/action", 
       data: postData, // i can do this, because it is defined this way in my controller 
       contentType: "application/json; charset=utf-8", 
       dataType: "json", 
       cache: false, 
       //etc etc 

Я надеюсь, что это помогает :)

Приветствия

+0

Я отредактировал свой вопрос, у меня есть сомнения в том, как я должен вернуть свое значение изменения в мой код ajax и как я должен прочитать это значение в моем коде ajax, должен ли он быть в моем блоке успеха? и какие libs я должен использовать для преобразования моего объекта в объект JSON? должен ли я использовать 'com.fasterxml.jackson.databind.ObjectMapper;' использовать класс ObjectMapper, или я должен использовать 'import org.json.JSONObject;' для использования класса JSONObject – stackUser2000

4

С Ajax вы можете также передавать данные как data:'name='+ name+'&lastname='+ lastname, И в конце контроллера вы можете использовать @RequestParam аннотацию чтобы получить это значение, переданное из вызова ajax. Ajax код выглядит следующим образом:

$.ajax({ 
    type: 'POST',  
    url:'your controller url', 
    data:'name='+ name+'&lastname='+ lastname, 
    success: function(msg){ 
     alert('wow' + msg); 
    } 
}); 

код контроллер:

@RequestMapping(value = "formShow", method = RequestMethod.POST) 
public String getTags(@RequestParam("name") String name, RequestParam("lastname") String lastname) 
{ 
    System.out.println("name: " + name+ " lastname: "+lastname); 
    String fullName = name + lastname; 
    return fullName; 
} 

Надеется, что это помогло вам. Cheers :)

+0

Мы боролись с этой проблемой в течение 4 часов. Ваш ответ нам очень помог. Благодарю. – anurag619

Смежные вопросы