我一直在为我的项目使用Sitemesh 3,到目前为止,它一直工作得很好。最近,我遇到了被卡住的情况。

我的最终视图必须由2个html文件组成,它们都有各自的和标签。
文件1:

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


文件2:

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


我正在使用freemarker include标签组成一个视图。因此,组成的HTML看起来像:

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


以下是我的装饰器:

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


但是一旦装饰,我得到的最终输出是:

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


但是预期的输出是

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


我遇到了similar question,但是该解决方案对我不起作用,因为我不想创建多个装饰器。

我只想知道Sitemesh 3中是否可能。如果是,那么如何。

谢谢。

最佳答案

如果您不介意扩展Sitemesh 3,则可以通过在装饰器模板中添加对服务器端包含的支持来做到这一点。我正是在另一个库(UtterlyIdle)中做到这一点。

我使用StringTemplate作为装饰语言,但这应该可以在Freemarker或任何其他模板工具中使用。我添加一个PageMap,然后在我的装饰器模板调用中

$include("someUrl").body$


这将包括在内,然后使用Sitemesh 3引擎解析输出。这使您可以根据需要拥有尽可能多的包含。

希望有道理

10-05 18:52