4

我们需要将访问某个 url 的用户重定向到 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;
        }
    }
}

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

4

2 回答 2

1

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

@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 和以前的版本中,您可以做类似的事情。

于 2013-01-22T01:07:13.610 回答
0

您可以询问页面的 URL,然后重定向

String fullUrl = RequestCycle.get().getUrlRenderer()
    .renderFullUrl(Url.parse((String) urlFor(RedirectPage.class,parameters)));
setResponsePage(new RedirectPage(fullUrl+"#anchor"));
于 2013-01-21T17:23:08.397 回答