Rapidoid - Extremely Fast, Simple and Powerful Java Web Framework!

Open source (Apache license). View benchmark...

Rapidoid consists of several modules which can be used separately or together:
  • rapidoid-net - Network protocol framework
  • rapidoid-http-server (named 'rapidoid-http-fast' before v6) - HTTP Server Framework
  • rapidoid-rest (named 'rapidoid-http-server' before v6) - REST API Framework
  • rapidoid-gui - Web GUI Components (based on Bootstrap + Angular)
  • rapidoid-web - rapidoid-rest + rapidoid-gui + goodies
  • rapidoid-quick - rapidoid-web + Hibernate + Logback + MySQL Connector...
  • rapidoid-render - Rapidoid's template engine
Add rapidoid-quick as Maven dependency:
<dependency>
    <groupId>org.rapidoid</groupId>
    <artifactId>rapidoid-quick</artifactId>
    <version>5.5.5</version>
</dependency>
docker run rapidoid --help
Getting started with Rapidoid

For a quick start please use the rapidoid-quick module. It includes rapidoid-web, Hibernate, Logback, Hibernate Validator and MySQL Connector.

Running this single line of code will start a web server embedded in your application.

By default, the server listens on port 8888 and address 0.0.0.0 (matching any IP address).

Navigating to http://localhost:8888/size?msg=abc will return 3.

// On GET /size return the length of the "msg" parameter
On.get("/size").json((String msg) -> msg.length());
GET /size?msg=abc
3

HTTP server routes information:

Verb Path Zone Content type MVC View name Roles
GET /size main json
// On GET /hi or POST /hi return a "Hello World" web page
On.page("/hi").mvc("Hello <b>world</b>!");
config.yml
gui:
  brand: 'Cool app!'
  title: 'the head title'
  search: true
  menu:
    Home: /
    Portfolio: /portfolio
    About:
      About Us: /about
      About You: /

Let's send some HTTP requests and check the results:

GET /hi
Hello world!

HTTP server routes information:

Verb Path Zone Content type MVC View name Roles
GET POST /hi main html hi
Main.java
import org.rapidoid.annotation.Valid;
import org.rapidoid.jpa.JPA;
import org.rapidoid.setup.App;
import org.rapidoid.setup.On;
 
public class Main {
 
    public static void main(String[] args) {
        App.bootstrap(args).jpa(); // bootstrap JPA
 
        On.get("/books").json(() -> JPA.of(Book.class).all()); // get all books
 
        On.post("/books").json((@Valid Book b) -> JPA.save(b)); // insert new book if valid
    }
 
}
Book.java
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.validation.constraints.NotNull;
 
@Entity
public class Book {
 
    @Id
    @GeneratedValue
    public Long id;
 
    @NotNull
    public String title;
 
    public int year;
 
}

Let's send some HTTP requests and check the results:

POST /books {"title":"Java Book","year":2016}
{"id":1,"title":"Java Book","year":2016}
GET /books
[{"id":1,"title":"Java Book","year":2016}]
POST /books {"year":2004}
{"error":"Validation failed: Book.title (may not be null)","code":422,"status":"Unprocessable Entity"}
GET /books
[{"id":1,"title":"Java Book","year":2016}]

HTTP server routes information:

Verb Path Zone Content type MVC View name Roles
GET /books main json
POST /books main json