Como controlar onde o wicket adiciona itens ao cabeçalho?
Pergunta
Eu conheço duas maneiras de adicionar conteúdo ao <head>
Seção da página no wicket. Você pode usar HeaderContributor
s e você pode usar o <wicket:head></wicket:head>
No topo do HTML do seu painel de postigos.
Meu problema é o seguinte: preciso adicionar metatags específicas a especial Páginas do meu site para fins de análise da web, mas preciso que eles apareçam perante um script de análise que estou incluindo no <head>
Seção de todo página. Eu tenho uma página abstrata base que é estendida por todas as outras páginas. Quero incluir o script de análise na página base e adicionar as metatags nos painéis localizados nas páginas que o estendem. No entanto, por padrão, wicket adiciona o conteúdo que você coloca no <wicket:head></wicket:head>
desses painéis após o conteúdo incluído no <head>
Seção da página base.
Existe uma maneira de dizer a Wicket para prender que <wicket:head></wicket:head>
Conteúdo em vez de anexá -lo?
ATUALIZAÇÃO: Estou usando WebTrends, não o Google Analytics, que requer 2 scripts: um no head
seção e uma na parte inferior da página.
Solução
No wicket 1.5, eles estão experimentando com diferentes IHeaderRenderStrategy
implementações, como ChildFirStheaderrenderStrategy (Experimental) ou ParentFirStheaderrenderStrategy (padrão). Parece que reordenar as contribuições do cabeçalho foi um problema em 1.4, então eles estão enfrentando.
No entanto, para o wicket 1.4, existe algum tipo de solução. A idéia é reordenar a lista de comportamentos (as contribuições do cabeçalho são apenas mais um ibehavior). Cada componente tem um protegido getBehaviors()
método que pode ser substituído. O truque é encontrar o comportamento que corresponde ao seu arquivo JS especial que deve ser incluído primeiro. Eu fiz isso criando minha própria instância de um objeto de headercontribution, para que eu pudesse executar uma comparação de instância e depois usar uma lista de Arraylist para mover o objeto de tabela de headercontribution no meio da lista de comportamento para o topo da lista de comportamento:
public abstract class BasePage extends WebPage {
public BasePage() {
add(HeaderContributor.forJavaScript("foo-base.js"));
}
}
A página inicial adiciona o script adicional, que deve ser renderizado primeiro. A página inicial também substitui o método 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;
}
}
Agora, o resultado final será que o script adicionado pela página inicial é renderizado primeiro e o script adicionado pela Baspage ocorre depois.
<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>