2012-04-15 16 views
0

Ich schicke eine POST-Anforderung mit jQuery Servlet:kann nicht Parameter übergeben über jQuery POST

$.post(
'test', 
{ foo: 'bar'} 
); 

Und ich habe ein einfaches Servlet für die Verarbeitung von es:

@WebServlet("/test") 
public class TestServlet extends HttpServlet { 

    @Override 
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) 
      throws ServletException, IOException { 
     Map<String, String[]> parameterMap = req.getParameterMap(); 
    } 

} 

Aber die requestMap im Servlet stellt sich als leer heraus. Was mache ich falsch?

Bearbeiten: Vergessen zu erwähnen, dass ich dieses Skript von der JSF Facelet Seite aufrufen. Fragen Sie mich nicht, warum ich Ajax-Anfragen manuell ausstellen muss und warum ich sie mit Servlets verarbeite. Das ist eine lange Geschichte. Ich weiß, dass es kein JSF'scher Weg ist.

Nach @BalusC Antwort habe ich versucht, einen Servlet-Filter wie folgt ergänzt:

@WebFilter(urlPatterns="/test") 
public class TestFilter implements Filter { 
    @Override 
    public void destroy() { } 

    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, 
      FilterChain chain) throws IOException, ServletException { 
     Map<String, String[]> parameterMap = request.getParameterMap(); 
     chain.doFilter(request, response); 
    } 

    @Override 
    public void init(FilterConfig filterConfig) throws ServletException { } 
} 

Und es hat funktioniert! Nicht nur ich konnte die Parameter im Filter abrufen, sondern auch im Servlet! Kann mir jemand erklären, welche Art von Magie das ist?

+0

Was siehst du mit 'firebug'? – gdoron

+0

Ich sehe, dass es tatsächlich eine POST-Anfrage sendet. Gleichzeitig habe ich den Breakpoint in Eclipse gesetzt, und ich habe wirklich diese Anfrage, aber ohne Parameter ... Ich benutze Chrome Developer Tools und es zeigt, dass die Anfrage tatsächlich mit allen erforderlichen Parametern gepostet wird. – jFrenetic

Antwort

0

Die Parameterzuordnung ist leer, wenn zuvor ein Code in der Anforderungsantwortkette request.getReader() oder aufgerufen wurde. Der HTTP-Anfragetext kann nur einmal gelesen und geparst werden (der Client wird ihn nicht mehrmals auf die Bedürfnisse des Servers zurücksenden). Überprüfen Sie alle Ihre Filter.

+0

Ich habe keine benutzerdefinierten Filter. Ich bekomme eine Antwort von Facebook mit Zugriffstoken, und ich führe dieses Skript beim Laden der Seite aus, um es an das Servlet zu übergeben. Eine Anmerkung jedoch: Dieses Skript wird von JSF Facelet aufgerufen. – jFrenetic

+0

Siehe auch die Bearbeitung. – jFrenetic

+0

Wenn 'getReader()' oder 'getInputStream()' vor * 'getParameter()', 'getParameterMap()' usw. aufgerufen wird, bleiben die Parameter 'null'. Umgekehrt, wenn Sie 'getParameter()', usw., * vor * dem 'getReader()' oder 'getInputStream()' aufrufen, geben sie EOF zurück. Debuggen Sie Ihren Code, um zu überprüfen, ob Sie nicht beide direkt aufrufen. Das ist alles, was ich aufgrund der Symptome sagen kann. – BalusC

Verwandte Themen