如何在Wicket的setResponsePage()中添加锚点?

时间:2013-01-21 10:42:58

标签: redirect wicket anchor

我们需要将访问某个网址的用户重定向到Wicket页面并滚动到页面中的锚点。例如,用户直接链接到http://.../target/url/123。然后,从数据库中查找123 id。随后,将根据是否找到实体将用户重定向到不同的页面。

提取实体后,应将用户重定向到http://.../another/url/123#element123。我们怎样才能通过Wicket实现这一目标?页面也应该在没有锚点的情况下可访问,并且最好,解决方案应该是通用的。

我提出的一个解决方案是覆盖PageParametersEncoder逻辑,以便在#anchor包含名为PageParameters的条目时将anchor附加到网址。但是,这意味着我还需要使用自己的Url类来扩展锚点。

public class ExtendedEncoder extends PageParametersEncoder {

    public static final String ANCHOR = "anchor";

    @Override
    public Url encodePageParameters(PageParameters pageParameters) {
        Url fromSuper = super.encodePageParameters(pageParameters.remove(ANCHOR));
        return new ExtendedUrl(fromSuper,
                pageParameters.get(ANCHOR).toOptionalString());

    }
}

public class ExtendedUrl extends Url {
        private String anchor;

        private ExtendedUrl(Url url, String anchor) {
            super(url);
            this.anchor = anchor;
        }

        @Override
        public String toString(StringMode mode, Charset charset) {
            return super.toString(mode, charset)
                   + anchor == null ? "" : "#" + anchor;
        }
    }
}

该问题还有其他解决方案吗?

2 个答案:

答案 0 :(得分:1)

以下代码将javascript片段呈现到目标页面的html中,页面加载时会将页面聚焦在网址中指定的锚点上。

@Override
public void renderHead(IHeaderResponse response) {
    super.renderHead(response);
    long anchor = getRequest().getQueryParameters().getParameterValue("anchor").toLong(0);
    if (anchor > 0) {
        response.render(new OnLoadHeaderItem("location.href='#anchor" + anchor + "';"));
        anchor = 0;
    }
}

顺便说一句,这是针对wicket 6.你可以在1.5及以前的版本中做类似的事情。

答案 1 :(得分:0)

您可以要求提供该网页的网址,然后重定向

String fullUrl = RequestCycle.get().getUrlRenderer()
    .renderFullUrl(Url.parse((String) urlFor(RedirectPage.class,parameters)));
setResponsePage(new RedirectPage(fullUrl+"#anchor"));