Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I construct an Html object from a String variable in Java controller code within the play (2.3) framework

I am just getting started working with the play framework, and I'm trying to understand the interaction between java application code, and the scala-based template framework (Note: I know absolutely nothing about Scala so far, beyond the fact that it's another language that compiles to bytecode on the JVM, and that your Scala and Java classes can interact).

I have a test1.scala.html template that looks like this:

@(title: String)(content: Html)

<!DOCTYPE html>

<html>
    <head>
        <title>@title</title>
    </head>
    <body>
        @content
    </body> </html>

As you can see from the top line, the template expects a String and an Html argument, but I can't figure out how to construct the Html argument from Java caller code!

I have tried a few variations in my controller class:

return ok(test1.render("My Title","It <em>finally</em> works!"));

This fails, obviously, because the second argument is a String and not Html, so I have an argument mismatch. (There's a runtime error: actual argument String cannot be converted to Html by method invocation conversion -- which makes sense, but I was hoping for some magic here. :))

So I tried creating some Html from a String, figuring this was a likely helper class somewhere in the package and this might 'just work':

return ok(test1.render("My Title",new Html("It <em>finally</em> works!")));

This won't compile, because javac can't find an Html class. Ok, fair enough. Scanning the play documentation, there appears to be a play.api.templates.Html class (written in Scala) with a constructor that takes a String, so I try the full package-qualified name:

return ok(test1.render("My Title",new play.api.templates.Html("It <em>finally</em> works!")));

And this won't compile either: I get a Symbol not found for 'Html' in package play.api.templates.

So: what's the magic sauce that will let me turn my String (which contains a snippet of HTML) into an HTML object I can pass into the template?

like image 772
JVMATL Avatar asked Jun 19 '14 22:06

JVMATL


1 Answers

Play templates have been factored out into the Twirl module, as stated in the Play 2.3 Migration Guide.

play.api.templates.Html is now play.twirl.api.Html.

like image 133
Michael Zajac Avatar answered Oct 21 '22 07:10

Michael Zajac