Ottieni parametri inviati tramite jquery ajax in Java Servlet

Cerco questo argomento sul web ma non riesco a ottenere un esempio che funzioni. Sarò felice con qualcuno potrebbe darmi un aiuto.

questo è quello che sto testando.

$.ajax({ url: 'GetJson', type: 'POST', dataType: 'json', contentType: 'application/json', data: {id: 'idTest'}, success: function(data) { console.log(data); } }); 

a Sevlet

 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String id = request.getParameter("id"); String id2[] = request.getParameterValues("id"); String id3 = request.getHeader("id"); } 

Sto diventando nulla in tutto.

La risposta di ordinamento è che questi dati sono nascosti nella richiesta InputStream .

Il seguente servlet è una demo di come puoi usarlo (lo sto eseguendo su JBoss 7.1.1):

 import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.util.Enumeration; import java.util.HashMap; import java.util.Map; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet(name="fooServlet", urlPatterns="/foo") public class FooServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { InputStream is = req.getInputStream(); ByteArrayOutputStream os = new ByteArrayOutputStream(); byte[] buf = new byte[32]; int r=0; while( r >= 0 ) { r = is.read(buf); if( r >= 0 ) os.write(buf, 0, r); } String s = new String(os.toByteArray(), "UTF-8"); String decoded = URLDecoder.decode(s, "UTF-8"); System.err.println(">>>>>>>>>>>>> DECODED: " + decoded); System.err.println("================================"); Enumeration e = req.getParameterNames(); while( e.hasMoreElements() ) { String ss = (String) e.nextElement(); System.err.println(" >>>>>>>>> " + ss); } System.err.println("================================"); Map map = makeQueryMap(s); System.err.println(map); ////////////////////////////////////////////////////////////////// //// HERE YOU CAN DO map.get("id") AND THE SENT VALUE WILL BE //// //// RETURNED AS EXPECTED WITH request.getParameter("id") //// ////////////////////////////////////////////////////////////////// System.err.println("================================"); resp.setContentType("application/json; charset=UTF-8"); resp.getWriter().println("{'result':true}"); } // Based on code from: http://www.coderanch.com/t/383310/java/java/parse-url-query-string-parameter private static Map makeQueryMap(String query) throws UnsupportedEncodingException { String[] params = query.split("&"); Map map = new HashMap(); for( String param : params ) { String[] split = param.split("="); map.put(URLDecoder.decode(split[0], "UTF-8"), URLDecoder.decode(split[1], "UTF-8")); } return map; } } 

Con la richiesta:

 $.post("foo",{id:5,name:"Nikos",address:{city:"Athens"}}) 

L’output è:

 >>>>>>>>>>>>> DECODED: id=5&name=Nikos&address[city]=Athens ================================ ================================ {address[city]=Athens, id=5, name=Nikos} ================================ 

(NOTA: req.getParameterNames() non funziona.La mappa stampata nella 4a riga contiene tutti i dati normalmente accessibili usando request.getParameter() . Notare anche la notazione degli oggetti nidificati, {address:{city:"Athens"}}address[city]=Athens )


Leggermente non correlato alla tua domanda, ma per completezza:

Se si desidera utilizzare un parser JSON sul lato server, è necessario utilizzare JSON.stringify per i dati:

 $.post("foo",JSON.stringify({id:5,name:"Nikos",address:{city:"Athens"}})) 

Secondo me, il modo migliore per comunicare JSON con il server è usare JAX-RS (o l’equivalente Spring). È semplicemente semplice sui server moderni e risolve questi problemi.

Ho avuto lo stesso problema con getParameter (“pippo”) restituendo null nel servlet. Ho trovato una soluzione semplice che potrebbe essere utile alle persone qui. Usa il valore predefinito

 contentType='application/x-www-form-urlencoded; charset=UTF-8' 

o lasciarlo fuori. Questo codificherà automaticamente la richiesta con i dati nei parametri.

Spero che questo ti aiuti…