Redirect 如何在Wicket'中添加锚;s setResponsePage()?

Redirect 如何在Wicket'中添加锚;s setResponsePage()?,redirect,wicket,anchor,Redirect,Wicket,Anchor,我们需要将访问特定url的用户重定向到Wicket页面,并滚动到页面中的锚。例如,用户直接链接到http://.../target/url/123。然后,从数据库中查找123id。随后,根据是否找到实体,用户将被重定向到不同的页面 获取实体后,应将用户重定向到http://.../another/url/123#element123。我们如何通过Wicket实现这一点?页面也应该可以在没有锚的情况下访问,并且解决方案最好是通用的 我提出的一个解决方案是,当PageParameters包含名为an

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

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

我提出的一个解决方案是,当
PageParameters
包含名为
anchor
的条目时,重写
PageParametersEncoder
逻辑,将
#anchor
附加到url。然而,这意味着我还需要用我自己的扩展
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;
        }
    }
}

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

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

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

下面的代码将一个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和以前的版本中执行类似的操作。

Nice,但Wicket抱怨:
无法从org.apache.Wicket.markup.html.pages.RedirectPage类创建页面。类没有可见的默认构造函数。
。我认为这是因为它试图用
RedirectPage(PageParameters)
构造函数实例化
RedirectPage
,而该构造函数并不存在。此外,
fullUrl
似乎包含
http://localhost:8080/...
。它真的能在真实环境中工作吗?也许我运行的是不同的wicket版本1.5,我们也在使用wicket 1.5。是的,这就可以了。但是,它会使
anchor
参数在url中可见,如
/page/123?anchor=foo#foo
。此外,您需要将代码添加到每个页面,因此它不是非常通用的。@rjokelai我总是有一个基本页面,从中我对应用程序的所有页面进行子类化,因此对我来说从来都不是问题。我在内容页面中使用了这种模式,其中锚参数是注释id,使其在url中可见并不是问题。但是,如果您正在寻找仅在渲染时使用的解决方案,那么您唯一的选择是wicket6,以及使用自定义PageParameterEncoder的解决方案,该解决方案将添加一个附加字符并将锚定标记移动到参数列表的末尾。我认为在apache.issues.org上打开带有功能请求的票证是个好主意。我认为在Wicket 1.5中,
PageParametersEncoder
也可以被覆盖,因为它作为参数传递给
MountedMapper
。我认为我们将使用javascript解决方案,尽管它会让URL变得更难看:)