2010-11-17 1 views
13

Ho un backend JAVA EE e sto usando Spring MVC. Ho una chiamata AJAX come questo:Spring MVC -> Risposta JSON

function getAllProjects() { 
     $.getJSON("project/getall", function(allProjects) { 
      ??? 
     }); 
    } 

Il mio sistema di back-end:

@RequestMapping(value="/getall", method=RequestMethod.GET) 
public @ResponseBody ??? getAllProjects() { 
    ??? 
} 

Qual è il contenuto che ho per implementare in modo da funzionerà? Nel sistema di back-end che ho da un database chiamare l'ID univoco e il nome del progetto, ad esempio:

1 => My Test Project 
4 => Another One 
23 => One More Test 

l'ID e il nome del progetto deve essere restituito al sistema frontend, così posso costruire un HTML lista ul/li in questo tipo:

<ul> 
    <li><a href="/1">My Test Project</a></li> 
    <li><a href="/4">Another One</a></li> 
    <li><a href="/23">One More Test</a></li> 
</ul> 

Qualcuno sa come si può fare?

risposta

14

È necessario:

  • Aggiungere Jackson JSON Mapper al classpath
  • Aggiungi <mvc:annotation-driven> alla propria configurazione
  • ritorno Map<Integer, String>

Per i casi più complessi quando è necessario configurare il processo di associazione per ciascun metodo di gestore, è possibile utilizzare MappingJacksonJsonView anziché @ResponseBody, come suggerito da Stepen C.

+0

' 'mancava nel mio caso – Joram

+0

per riferimento, penso che questa sia una guida più dettagliata: http://blog.springsource.com/2010/01/25/ajax-simplifications-in-spring-3-0/ –

8

è necessario leggere il capitolo 15.5 della Guida per l'utente di Primavera, che descrive come configurare vista MVC, e il capitolo 16.10, che descrive brevemente la JSON Mapping View. Poi leggi le javadocs per MappingJacksonJsonView ecc

8

È anche possibile utilizzare JSONArray e JSONObject di org.json per costruire l'output JSON, quindi restituire un valore di stringa come @ResponseBody.

http://www.json.org/javadoc/org/json/JSONObject.html

@RequestMapping(value="/getall", method=RequestMethod.GET) 
public @ResponseBody String getAllProjects() { 
    ... 
    JSONArray jsonItems = new JSONArray(); 

    JSONObject jsonItem1 = new JSONObject(); 
    jsonItem1.put("id", "1"); 
    jsonItem1.put("name", "My Test Project"); 

    JSONObject jsonItem2 = new JSONObject(); 
    jsonItem2.put("id", "4"); 
    jsonItem2.put("name", "Another one"); 

    jsonItems.put(jsonItem1); 
    jsonItems.put(jsonItem2); 

    return jsonItems.toString(); 
} 

Si dovrebbe ottenere qualcosa di simile in callback successo della vostra richiesta Ajax.

[{ 
    "id":"1", 
    "name":"My Test Project" 
},{ 
    "id":"4", 
    "name":"Another one" 
}] 

È possibile utilizzare questi dati per entrambi i accodare il tuo ul li utilizzando JavaScript o utilizzando _underscore template per rendere l'interfaccia utente.

+0

È più efficace questa soluzione? O è meglio usare la funzione Jackson writeValueAsString? –