ActiveJ | Simple web application with template engine integration
In this example we will implement template engines in ActiveJ applications. The example shows how to create a simple Poll app which creates new polls with a custom title, description, and options. Each new poll gets a unique generated link that leads to the page where you can vote.
See how simple it is to implement such features using ActiveJ: the embedded application server has only about 100 lines of code with no additional xml configurations. In this example we used Mustache as a template engine.
The ApplicationLauncher launches our application, takes care of routing and proper content generation on HTML pages. We will extend ActiveJ’s HttpServerLauncher to manage the application’s lifecycle:
Let’s have a closer look at the launcher. It contains two methods:
- applyTemplate(Mustache mustache, Map<String, Object> scopes) fills the provided Mustache template with the given data through a ByteBuf - a more efficient implementation of ByteBuffer;
- pollRepo() provides the business logic of our app. The @Provides annotation means it’s done through ActiveJ Inject DI.
Next, we provide AsyncServlet:
In the AsyncServlet we create three Mustache objects, one for each HTML page. To define routing, we create a RoutingServlet. You may notice that the routing approach resembles Express.js. In the example above we’ve added the mapping to the homepage by using the map method.
Method map(@Nullable HttpMethod method, String path, AsyncServlet servlet) adds a route to the RoutingServlet:
- method is one of the HTTP methods (
POSTand so on)
- path is the path on the server
- servlet defines the logic of request processing. If you need to get some data from the request while processing you can use:
- request.getPathParameter(String key)/request.getQueryParameter(String key) (see example of query parameter usage to provide the key of the needed parameter and receive back a corresponding String
- request.getPostParameters() to get a Map of all request parameters
In this request we get all current polls and info about them in order to generate listPolls page.
Let’s add one more request:
This request returns a page with a poll which id was specified in the path.
Pay attention to the provided path
: states that the following characters until the next
/ are a
variable; in this case, its keyword is
id. This way you don’t have to map each poll’s id to a different request.
The next requests with
/delete paths take care of providing a page for creating
new polls, voting, adding created polls to the pollDao and deleting them from it respectively:
Also, we defined main() method which will start our launcher:
And that’s it, we have a full-functional poll application!
Running the application
If you want to run the example, you need to clone ActiveJ from GitHub and import it as a Maven project. Check out branch v4.1. Before running the example, build the project (Ctrl + F9 for IntelliJ IDEA). Open ApplicationLauncher class and run its main() method. Then open your favourite browser and go to localhost:8080.