Калитка: как перенаправить на другую страницу? - PullRequest
20 голосов
/ 26 июля 2010

Как мне перенаправить на другую страницу с помощью Wicket? IIRC, в конструктор нужно добавить какое-то исключение, но я не помню, какой именно. Заранее спасибо.

Ответы [ 5 ]

29 голосов
/ 27 июля 2010

Бросок RestartResponseAtInterceptPageException сделает это, как вы отметили в своем собственном ответе, но это действительно часть системы, позволяющей перенаправлять с возможным продолжением на текущей странице (часто это часть процесса авторизации). Если это не ваша ситуация, но вы все равно должны сделать что-то, что прерывает обработку, может быть лучше бросить RestartResponseException.

Основное использование, которое я знаю для RestartResponseAtInterceptPageException, заключается в процессе «перенаправления на страницу входа». Если вы используете проверку подлинности на основе ролей, реализация IAuthorizationStrategy при определении того, что вы не вошли в систему, будет сигнализировать о настроенном IUnauthorizedComponentInstantiationListener, обычно AuthenticatedWebApplication, который выдает это исключение, если вы не вошли в систему, с перенаправлением на настроенную страницу входа. (Если вы вошли в систему, но не авторизованы, произойдет что-то еще ...).

Фактическое перенаправление выполняется PageMap, который также в этом случае запоминает страницу, на которую вы пытались перейти. После успешного входа в систему на странице входа можно попросить отправить вас на страницу, которую вы первоначально пытались вызвать, вызвав continueToOriginalDestination(), который является методом в Component и извлекает запомненную страницу из PageMap.

Для этого процесса аутентификации есть хороший пример кода , но исключение и перехват несколько скрываются за кулисами.

23 голосов
/ 28 июня 2011

Перенаправление на страницу калитки, используя перенаправление клиента (HTTP 302, URL-адрес браузера изменяется):

import org.apache.wicket.RestartResponseException;
import org.apache.wicket.request.mapper.parameter.PageParameters;
...
throw new RestartResponseException(
    TargetWicketPage.class, 
    new PageParameters().set("param1", "value1")); 

Перенаправление на страницу калитки с использованием перенаправления / пересылки сервера (URL браузера остается неизменным):

С калиткой 1.5RC5.1:

import org.apache.wicket.RestartResponseException;
import org.apache.wicket.request.handler.PageProvider;
import org.apache.wicket.request.handler.RenderPageRequestHandler.RedirectPolicy;
import org.apache.wicket.request.mapper.parameter.PageParameters;
...
throw new RestartResponseException(
    new PageProvider(
        TargetWicketPage.class, 
        new PageParameters().set("param1", "value1")), 
    RedirectPolicy.NEVER_REDIRECT));

Перед калиткой 1.5RC5.1:

import org.apache.wicket.request.RequestHandlerStack.ReplaceHandlerException;
import org.apache.wicket.request.handler.PageProvider;
import org.apache.wicket.request.handler.RenderPageRequestHandler;
import org.apache.wicket.request.handler.RenderPageRequestHandler.RedirectPolicy;
import org.apache.wicket.request.mapper.parameter.PageParameters;
...
throw new ReplaceHandlerException(
    new RenderPageRequestHandler(
        new PageProvider(
            TargetWicketPage.class, 
            new PageParameters().set("param1", "value1")), 
        RedirectPolicy.NEVER_REDIRECT), 
    true);

Перенаправление на URL с использованием HTTP 302 («Временно перемещено»):

import org.apache.wicket.request.flow.RedirectToUrlException;
...
throw new RedirectToUrlException("http://targetURL");

Перенаправление на URL с использованием HTTP 301 («Перемещено навсегда», оптимизировано для SEO):

import org.apache.wicket.request.flow.RedirectToUrlException;
import javax.servlet.http.HttpServletResponse;
...
throw new RedirectToUrlException("http://targetURL", 
    HttpServletResponse.SC_MOVED_PERMANENTLY);
5 голосов
/ 26 июля 2010

Быстрый поиск всех *Exception.java файлов в калитке показал это. Нужно бросить RestartResponseAtInterceptPageException:

public MyPage() {
   ...
   if (redirect) {
       throw new RestartResponseAtInterceptPageException(targetPage);
   }
   ...
}
1 голос
/ 22 мая 2018

вы можете использовать

setResponsePage (new RedirectPage ("/"));

или

setResponsePage (HomePage.class);

или

бросить новое RestartResponseException (HomePage.class);

1 голос
/ 08 февраля 2015

Я только что нашел

getRequestCycle().setResponsePage(MyOtherPage.class);

, который работает по крайней мере в калитке 6. Он работает на стороне сервера и перезаписывает URL-адрес.Возможно, это немного быстрее, чем использование исключения.

...