Yao Chen Yao Chen - 1 year ago 205
Java Question

How to get POST form data using VERTX handlers?

I am able to get the form data using the buffer handler, but it is a void function and I cannot return the form data values. Have about 4-7 forms total, I don't want to end up writing the same handler over and over because the default function is void.


<!DOCTYPE html>
<head><title>Login Page</title></head>
<a href="/activateUserPage">activate user</a>
<a href="/login">log in</a>

<form id='login' action='/login' method='post'>
<fieldset >
<input type='hidden' name='submitted' id='submitted' value='1'/>

<label for='username' >UserName: </label>
<input type='text' name='username' id='username' maxlength="50"/>

<label for='password' >Password: </label>
<input type='password' name='password' id='password' maxlength="50"/>

<input type='submit' name='Submit' value='Submit' />


import org.jboss.netty.handler.codec.http.QueryStringDecoder;
import org.vertx.java.core.Handler;
import org.vertx.java.core.Vertx;
import org.vertx.java.core.buffer.Buffer;
import org.vertx.java.core.http.HttpServer;
import org.vertx.java.core.http.HttpServerRequest;
import org.vertx.java.core.http.RouteMatcher;
import org.vertx.java.deploy.Verticle;

import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;

* Created by IntelliJ IDEA.
* User: yao
* Date: 1/17/13
* Time: 2:22 PM

public class Main extends Verticle
public void start() throws Exception
System.out.println("starting the vertx stuff");
final String host = "localhost";
final String port = "8181";

Vertx vertx = Vertx.newVertx();
HttpServer httpServer = vertx.createHttpServer();


httpServer.requestHandler(new Handler<HttpServerRequest>()
public void handle(HttpServerRequest req)
String path = req.path;

/* start mapping of page urls*/
// redirect user to the login page
if (path.equals("/"))
req.response.sendFile(dir + "html/loginPage.html");

/* end mapping of page urls*/

/* start mapping of form urls */
// login
else if (path.equals(login))

/* end mapping of form urls */

/* all other pages */
req.response.end("404 - page no exist");

System.out.println("vertx listening to: " + host + " " + port);
httpServer.listen(Integer.valueOf(port), host);


private void getFormData(final HttpServerRequest req)
req.bodyHandler(new Handler<Buffer>()
public void handle(Buffer buff)
String contentType = req.headers().get("Content-Type");
if ("application/x-www-form-urlencoded".equals(contentType))
QueryStringDecoder qsd = new QueryStringDecoder(buff.toString(), false);
Map<String, List<String>> params = qsd.getParameters();

Answer Source

what i did in the end is basically this:

do the ajax call using post, the data from the form needs to be serialized.

    type: "POST",
    url: "/login",
    data: $('#frm_login').serialize(),
    success: function(data)

in the backend, vertx receives this data as a buffer. rest is to parse the buffer by splitting by "&" and "=".

Map<String, String> params = new HashMap<String, String>();
String[] paramSplits = buffer.toString().split("&");
String[] valueSplits;

if (paramSplits.length > 1)
    for (String param : paramSplits)
        valueSplits = param.split("=");
        if (valueSplits.length > 1)
            // add this check to handle empty phone number fields
            params.put(decode(valueSplits[0]), decode(valueSplits[1]));

hope this will help others!