4

特定の URL にアクセスするユーザーを Wicket ページにリダイレクトし、ページ内のアンカーまでスクロールする必要があります。たとえば、ユーザーは に直接リンクしhttp://.../target/url/123ます。その後、123ID がデータベースから検索されます。その後、エンティティが見つかったかどうかに基づいて、ユーザーは別のページにリダイレクトされます。

エンティティがフェッチされた後、ユーザーは にリダイレクトされhttp://.../another/url/123#element123ます。Wicket でこれを実現するにはどうすればよいでしょうか? ページはアンカーなしでもアクセスできる必要があり、できればソリューションは汎用的である必要があります。

私が思いついた解決策の 1 つは、 という名前のエントリが含まれている場合に、PageParametersEncoderロジックをオーバーライドし#anchorて url に追加することです。ただし、これは、アンカーを追加するために独自のクラスを拡張する必要があることを意味します。PageParametersanchorUrl

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;
    }
}

ところで、これは改札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 に答える