web-dev-qa-db-fra.com

Wicket: comment rediriger vers une autre page?

Comment puis-je rediriger vers une autre page à l'aide de Wicket? IIRC, une exception doit être lancée dans le constructeur, mais je ne me souviens plus lequel. Merci d'avance.

20
Mot

Lancer une RestartResponseAtInterceptPageException le fera, comme vous l'avez noté dans votre propre réponse, mais cela fait vraiment partie d'un système permettant une redirection avec une éventuelle continuation à la page en cours (souvent dans le cadre d'un processus d'autorisation). Si ce n'est pas votre cas, mais que vous devez tout de même faire quelque chose qui interrompt le traitement, il peut être préférable de lancer une RestartResponseException.

L’utilisation principale que je connais de RestartResponseAtInterceptPageException se trouve dans le processus "redirection de la page de connexion". Si vous utilisez l'authentification basée sur les rôles, une implémentation de IAuthorizationStrategy pour déterminer que vous n'êtes pas connecté indiquera une IUnauthorizedComponentInstantiationListener configurée, généralement la AuthenticatedWebApplication qui lève cette exception si vous n'êtes pas connecté, avec une redirection vers un page de connexion. (Si vous êtes connecté mais que vous n'êtes pas autorisé, quelque chose d'autre se passe ...).

La redirection proprement dite est effectuée par la variable PageMap, qui dans ce cas aussi se souvient de la page à laquelle vous vouliez accéder. Après une connexion réussie, la page de connexion peut vous demander de vous envoyer la page que vous cherchiez à l'origine en appelant continueToOriginalDestination(), une méthode de Component et en récupérant la page mémorisée à partir de PageMap.

Il y a quelques bons exemples de code pour ce processus d'authentification, mais l'exception et l'interception se cachent quelque peu dans les coulisses.

29
Don Roby

Redirection vers une page de guichet en utilisant une redirection client (HTTP 302, les modifications de l'URL du navigateur):

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

Rediriger vers une page de guichet en utilisant un serveur de redirection/transfert (l'URL du navigateur reste inchangé):

Depuis Wicket 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));

Avant Wicket 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);

Rediriger vers une URL à l'aide de HTTP 302 ("déplacé temporairement"):

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

Rediriger vers une URL à l'aide de HTTP 301 ("Déplacé de façon permanente", adapté au référencement):

import org.Apache.wicket.request.flow.RedirectToUrlException;
import javax.servlet.http.HttpServletResponse;
...
throw new RedirectToUrlException("http://targetURL", 
    HttpServletResponse.SC_MOVED_PERMANENTLY);
23
sother

Une recherche rapide de tous les fichiers *Exception.Java dans le guichet l'a révélé. Il faut lancer une RestartResponseAtInterceptPageException:

public MyPage() {
   ...
   if (redirect) {
       throw new RestartResponseAtInterceptPageException(targetPage);
   }
   ...
}
5
Mot

Je viens de trouver

getRequestCycle().setResponsePage(MyOtherPage.class);

qui fonctionne au moins dans le guichet 6. Cela fonctionne côté serveur et réécrit l'URL aussi. Peut-être que c'est un peu plus rapide que d'utiliser une exception.

1
user2081279

vous pouvez utiliser 

setResponsePage (new RedirectPage ("/"));

ou

setResponsePage (HomePage.class);

ou

lancer une nouvelle exception RestartResponseException (HomePage.class);

0
Shubham Pandey