Frage

Ich kenne zwei Möglichkeiten, Inhalte auf den <head> Bereich der Seite in Wicket hinzuzufügen. Sie können HeaderContributors verwenden und die <wicket:head></wicket:head> an der Spitze Ihres Wicket Panels HTML verwenden können.

Mein Problem ist folgendes: Ich muss bestimmte Meta-Tags hinzufügen insbesondere Seiten meiner Website für Web-Analytics-Zwecke, aber ich brauche sie vor einem Analytics-Skript zu erscheinen, dass ich in der <head> bin auch Abschnitt von alle Seite. Ich habe eine Basis abstrakte Seite, die von jeder anderen Seite erweitert wird. Ich will die Analytik Skript in der Basisseite schließen und die Meta-Tags in den Platten hinzuzufügen, die in den Seiten befinden, die sie verlängern. Allerdings fügt standardmäßig Wicket den Inhalt, der in der <wicket:head></wicket:head> dieser Platten, nachdem der Inhalt in der <head> Abschnitt der Basisseite enthalten setzen.

Gibt es eine Möglichkeit Wicket zu sagen, dass <wicket:head></wicket:head> Inhalt vorangestellt wird, anstatt es zu anhängt?

UPDATE: Ich bin mit Webtrends, nicht Google Analytics, die 2-Skripte benötigt: eine in der head Abschnitt sowie eine am unteren Rand der Seite.

War es hilfreich?

Lösung

In Wicket 1.5, sie sind Experimentieren mit verschiedenen IHeaderRenderStrategy Implementierungen, wie als ChildFirstHeaderRenderStrategy (experimentell) oder ParentFirstHeaderRenderStrategy (Standard). Es scheint, dass die Header-Beiträge Nachbestellung war ein Problem bei 1,4, so dass sie es sind praxisnah erläutert.

Doch für Wicket 1.4, gibt es eine Art von Lösung. Die Idee ist, die Liste der Verhaltensweisen (Header Beiträge sind nur noch eine weitere IBehavior) neu zu ordnen. Jede Komponente hat eine geschützte getBehaviors() Methode, die überschrieben werden können. Der Trick ist, um das Verhalten zu finden, die auf Ihre spezielle JS-Datei entspricht, die zuerst aufgenommen werden sollten. Ich tat dies durch meine eigene Instanz eines HeaderContribution Objekt zu erzeugen, so dass ich eine Instanz Vergleich durchführen könnte und dann eine Arraylist verwenden, um das HeaderContribution Objekt aus in der Mitte der Verhaltenliste an die Spitze der Liste Verhalten zu bewegen:

public abstract class BasePage extends WebPage {

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

}

Die HomePage fügt die zusätzliche Skript, das zuerst wiedergegeben werden soll. Die Homepage auch überschreibt den geBehaviors () Methode:

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;
}
}

Nun, das Endergebnis wird sein, dass das Skript von HomePage hinzugefügt zuerst gerendert wird, und das Skript von der BasPage hinzugefügt kommt danach.

<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>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top