Sitemesh使用velocity #parse工作不正常

时间:2016-02-29 02:56:38

标签: java struts velocity sitemesh

现在我使用struts,sitemesh,velocity,配置已经可以使用

在主页面中:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head> 
    #parse("common/taglibs.vm")
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<div class="body-0214">
    #parse("/velocity/info/head.vm")
    $body
    #parse("/velocity/info/foot.vm")
</div>
</body>
</html>

在taglibs.vm中我定义了一些全局变量:

#set ($ctx=$request.contextPath)
#set ($imageService=$controlUtil.getDomainName($session.servletContext))

head.vmmain.vm时,我尝试获取全局变量:

$ctx
$imageService

得到结果:

$ctx
$imageService

没有任何改变!

但是当我将#parse("common/taglibs.vm")放入main.vm(结果页面)时,它会得到正确的结果:

http://127.0.0.1

这是一个问题:为什么必须在儿童页面推荐#parse("common/taglibs.vm"),其他问题是当我将#parse("common/taglibs.vm")放入head.vm时,它也无效,我感到非常惊讶

为什么我得到了那个结果,不管我错在哪里或总是那样,请帮助我!

1 个答案:

答案 0 :(得分:1)

我认为您正面临配置问题或完全超出Velocity的问题。

让我们从简化事物开始。对于测试,将以下所有vm-templates放在同一文件夹中。最好将它们放在声明为Velocity资源加载器路径或Velocity根目录的文件夹中。

第一步:

taglib.vm:

#set($ctx = $request.contextPath)

main.vm:

#parse("taglibs.vm")
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    </head>
    <body>
        <div class="body-0214">
            $ctx
        </div>
    </body>
</html>

结果将是上下文路径 - 在您的情况下http://127.0.0.1。根据你发布的内容,这应该有效。

第二步:

像这样创建一个文件head.vm

$ctx

并将main.vm更改为:

#parse("taglibs.vm")
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    </head>
    <body>
        <div class="body-0214">
            #parse("head.vm")
        </div>
    </body>
</html>

结果应该是一样的。

第三步:

创建文件secondLevel.vm

$ctx

是的,现在与head.vm相同。

现在将head.vm更改为

#parse("secondLevel.vm")

在默认配置中,这仍然会产生相同的结果。如果不是,则可能会更改默认配置。如果您看到$ctx而不是http://127.0.0.1,请检查Velocity配置。寻找parse_directive.maxdepth。该值应高于1 请注意,默认值为10,因此默认情况下您最多可以解析10个嵌套的vm文件。

如果您在第一步或第二步中未能看到所需的结果,我建议在一个全新的项目中测试,以消除副作用。

虽然不太可能导致问题,但请确保使用最新版本的Velocity 1.7