Controllers
Every controller method, whether it renders a template, sends JSON, or just returns an HTTP status, must return a Response
object. This is handled using the Response
class of mangoo I/O. Below is an example of a controller method:
package controllers;
import io.mangoo.routing.Response;
public class ApplicationController {
public Response index() {
return Response.ok();
}
}
The example above returns a blank HTML page without any rendering.
Predefined HTML Templates
Mangoo I/O provides predefined HTML templates for standard responses:
package controllers;
import io.mangoo.routing.Response;
public class ApplicationController {
public Response index() {
return Response.ok().bodyDefault();
}
}
To trigger rendering of a Freemarker template, use render()
:
package controllers;
import io.mangoo.routing.Response;
public class ApplicationController {
public Response index() {
return Response.ok().render();
}
public Response foo() {
return Response.ok().render("bar", "value");
}
}
By convention, the corresponding Freemarker template is expected to be in:
/src/main/resources/templates/CONTROLLER_NAME/METHOD_NAME.ftl
For example:
/src/main/resources/templates/ApplicationController/index.ftl
Note
Mapping of controller methods to templates is case-sensitive.
With the previously mapped request in the Bootstrap.java
file, a request to /
will render the index.ftl
template and send it along with an HTTP 200 OK response.
Request and Query Parameters
Mangoo I/O makes handling request or query parameters straightforward. Assume the following mapping in your Bootstrap
class:
Bind.controller(MyController.class).withRoutes(
On.get().to("/foo/{id}").respondWith("myMethod")
);
Here, {id}
in the URL defines a request parameter.
For example, given the request:
/user/1?foo=bar
Both request and query parameters can be accessed in the controller method:
public Response index(int id, String foo) {
// Process id and foo
return Response.ok().render();
}
Mangoo I/O automatically converts passed parameters into the required data types.
Supported Parameter Types
The following parameter types are supported by default:
String
Integer / int
Float / float
Double / double
Long / long
LocalDate
LocalDateTime
Optional
- Double and Float values must use a
.
delimiter, even if the query parameter is passed with,
. - All parameters are case-sensitive. For example, if a method parameter is
localDateTime
, it must be mapped exactly in Bootstrap URL mapping, like so:
/foo/{localDateTime}
- Date Formats
LocalDate
:yyyy-MM-dd
(ISO_LOCAL_DATE
)LocalDateTime
:yyyy-MM-ddThh:mm:ss
(ISO_LOCAL_DATE_TIME
)
Unsupported Parameter Types
The following classes cannot be used as request or query parameters but can still be used in controller methods:
Request
Session
Form
Flash
Authentication
Messages
These will be explained in the next chapters.
Custom Handlers
Using Google Guice, you can customize request handlers as needed. To override a handler, first bind your custom handler in your Modules
class:
bind(LocaleHandler.class).to(MyLocaleHandler.class);
Then, extend the default handler class:
public class MyLocaleHandler extends LocaleHandler {
@Override
public void handleRequest(HttpServerExchange exchange) throws Exception {
// Custom handling logic
}
@Override
protected void nextHandler(HttpServerExchange exchange) throws Exception {
// Call a different handler instead of the default one
}
}
Request Validation
Mangoo I/O allows validation of incoming request parameters.
public Response index(Request request) {
request.expectValue("bar");
request.expectEmail("foo");
if (request.isValid()) {
// Process request
} else {
// Handle invalid request
}
}
Returning Validation Errors as JSON
You can return validation errors as a JSON response:
public Response index(Request request) {
request.expectValue("bar");
request.expectEmail("foo");
if (!request.isValid()) {
return Response.badRequest().bodyJson(request.getErrors());
}
return Response.ok();
}
Request Object and Values
The Request
object provides access to headers, URL values, and additional request data. It can be passed directly into a controller method:
public Response index(Request request) {
// Process request
return Response.ok();
}
When dealing with multiple query or request parameters, instead of listing them explicitly, you can access them using:
public Response index(Request request) {
String foo = request.getParameter("foo");
return Response.ok();
}