我们需要将访问某个网址的用户重定向到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;
}
}
}
该问题还有其他解决方案吗?
答案 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"));