The flash scope is designed to transport success and error messages between stateless web applications. Flash messages can either live for the current request or both the current and next request (then deleted afterwards).
The flash scope is similar to a Session. Like a session the flash scope is implemented as client side cookie. But the flash scope is not signed.
public Result flashSuccess(FlashScope flashScope) { flashScope.success("messageKeySuccess"); return Results.html(); }
You can then display the flash message in your view like that:
<h2>This page displays a flash cookie.</h2> <p> <#if flash.success??> Success cookie: <p class="success">${flash.success}</p> </#if> </p>
if flash.success??
will allow you to skip the if block when
the flash.success message is not set. Therefore it will not be displayed to your
user. Usually you want to use those messages when errors and success messages
from one page (hence controller method) to a another.
Please refer to the “HTML templating” section for more information regarding flash scope and HTML templates.
public Result flashError(FlashScope flashScope) { flashScope.error("messageKeyError"); return Results.html(); }
If you are simply using the FlashScope to display a message for the current
request, its safer to use flash.now()
as opposed to flash.put()
, flash.error()
,
or flash.success()
. This makes your flash data only available to the current
request and avoids writing it out as a client side cookie. This helps avoid
unexpected flash messages in the browser on the next request when you didn't
intend them to show up.
If you are using the default HTML rendering engine Freemarker you should use keys for your flash message. Freemarker will automatically translate your key into the correct message of the language your user is requesting.
If your message contains placeholders you have to prepare the messages inside your controller:
public Result flashSuccess(FlashScope flashScope, Context context) { Result result = Results.html(); Optional<String> flashMessage = messages.get("flashSuccess", context, Optional.of(result), "PLACEHOLDER"); if (flashMessage.isPresent()) { flashScope.success(flashMessage.get()); } flashScope.discard(); return result; }