4

<head>我知道将内容添加到检票口页面部分的两种方法。您可以使用HeaderContributors 并且可以使用<wicket:head></wicket:head>检票口面板 html 顶部的 。

我的问题是:我需要将特定的元标记添加到我网站的特定页面以进行网络分析,但我需要它们出现在我包含在每个页面<head>部分中的分析脚本之前。我有一个基本的抽象页面,它被其他页面扩展。我想在基本页面中包含分析脚本,并在扩展它的页面中的面板中添加元标记。但是,默认情况下,wicket在基本页面部分中包含的内容之后添加您放入这些面板的内容。<wicket:head></wicket:head><head>

有没有办法告诉 wicket 预先添加该<wicket:head></wicket:head>内容而不是附加它?

更新:我使用的是 Webtrends,而不是 Google Analytics,它需要 2 个脚本:一个在该head部分,一个在页面底部。

4

1 回答 1

3

在 Wicket 1.5 中,他们正在试验不同的IHeaderRenderStrategy实现,例如 ChildFirstHeaderRenderStrategy(实验性)或 ParentFirstHeaderRenderStrategy(默认)。似乎重新排序标题贡献在 1.4 中是一个问题,所以他们正在解决它。

但是,对于 Wicket 1.4,有某种解决方案。这个想法是重新排序行为列表(标题贡献只是另一个 IBehavior)。每个组件都有一个getBehaviors()可以被覆盖的受保护方法。诀窍是找到与您应该首先包含的特殊 JS 文件相对应的行为。我通过创建自己的 HeaderContribution 对象实例来做到这一点,因此我可以执行实例比较,然后使用 ArrayList 将 HeaderContribution 对象从行为列表的中间移动到行为列表的顶部:

public abstract class BasePage extends WebPage {

public BasePage() {
    add(HeaderContributor.forJavaScript("foo-base.js"));
}

}

HomePage 添加了应首先呈现的附加脚本。HomePage 还覆盖了 geBehaviors() 方法:

public class HomePage extends BasePage {

private static final long serialVersionUID = 1L;

private final HeaderContributor contrib = new HeaderContributor(
        new IHeaderContributor() {
    public void renderHead(IHeaderResponse response) {
        response.renderJavascriptReference("foo-first.js");
    }
});

public HomePage(final PageParameters parameters) {
    add(new Label("message", "If you see this message ..."));
    add(contrib);
}

@Override
protected List getBehaviors(Class type) {
    List behaviors = super.getBehaviors(type);
    ArrayList sortedBehaviors = new ArrayList(behaviors);
    boolean moveToTop = true;
    if (moveToTop) {
        if (!sortedBehaviors.remove(contrib)) {
            throw new IllegalStateException();
        }
        sortedBehaviors.add(0, contrib);
    }
    return sortedBehaviors;
}
}

现在,最终结果将是 HomePage 添加的脚本先渲染,BasPage 添加的脚本在后。

<html xmlns:wicket="http://wicket.apache.org/... >
<head>  
    <title>Wicket Quickstart Archetype Homepage</title>
<script type="text/javascript" src="foo-first.js"></script>
<script type="text/javascript" src="foo-base.js"></script>
</head>
于 2011-01-05T22:47:07.243 回答