There are pros and cons for both approaches.
My personal preference is to use the redirect approach, and the reason is because the browser URL correctly indicates where you are in the application. For example, if your index page triggers a login action, if you do not use redirects, then the browser URL will show the login when you are actually on the index page with errors.
But there is a problem with this approach. To receive redirection and save validation error messages, you need to use validation.keep() and params.flash() (see here for more details) so that the validation is saved for the next request. This is achieved behind the scenes by storing validation errors and user-entered parameters in a cookie (to ensure that Play remains stateless). As you probably know, the HTTP specification limits Cookies to 4Kb, so there is a risk that if you enter data larger than 4Kb (which is possible for forms in which you enter large chunks of text), your Cookie will overflow and you will lose data.
The original method in which Play was used was a redirect method, but the second approach was specifically added to the documentation as a workaround due to the cookie restriction.
The third, and potentially cleaner option is to perform client-side validation using javascript, which invokes some server logic using AJAX. An example of this can be seen in the 10th example of the sample application samples-and-test/validation .
source share