Search code examples
javafreemarkersitemesh

Multiple body tags in Sitemesh 3


I have been using Sitemesh 3 for my project and so far it's been working great. Recently I came across a situation where I am stuck.

My final view has to be composed of 2 html files, both have their own and tags. File1:

<html>
    <head>Head1</head>
    <body>body1</body>
</html>

File2:

<html>
    <head>Head2</head>
    <body>body2</body>
</html>

I am composing a view using freemarker include tag. So, the composed HTML looks like:

<html>
    <head>Head1</head>
    <body>body1</body>
</html>
<html>
    <head>Head2</head>
    <body>body2</body>
</html>

Following is my decorator:

<html>
<head>
    <sitemesh:write property='head'/>
</head>
<body>
    <div class="container">
        <sitemesh:write property='body'/>
    </div>
</body>
</html>

But once decorated, the final output I am getting is:

<html>
<head>
    <head>Head1</head>
</head>
<body>
    <div class="container">
        <body>body1</body>
    </div>
</body>
</html>

But the expected output is

<html>
<head>
    <head>
        Head1
        Head2
    </head>
</head>
<body>
    <div class="container">
            body1
            body2
    </div>
</body>
</html>

I came across a similar question, but that solution won't work for me because I don't want to create multiple decorators.

I just want to know if it's possible in Sitemesh 3. If yes, then how.

Thanks.


Solution

  • If you don't mind extending Sitemesh 3 then this is fairly easy to do by adding support for server side includes in your decorator template. I do exactly this in another library (UtterlyIdle).

    I'm using StringTemplate as my decorator language but this should work in Freemarker or any other templating tool. I add in a PageMap and then in my decorator template call

    $include("someUrl").body$
    

    This does a include and then parses the output with the Sitemesh 3 engine. This allows you to have as many includes as you like.

    Hope that makes sense