Le contrôleur Spring-MVC est redirigé vers & # 8220; previous & # 8221; page?

StackOverflow https://stackoverflow.com/questions/804581

  •  03-07-2019
  •  | 
  •  

Question

Supposons que j'ai un formulaire pour modifier les propriétés d'un poney et que dans mon application Web, vous pouvez choisir de modifier un poney à plusieurs endroits. Par exemple, dans une liste de poneys, il pourrait y avoir un "modifier". lien à côté de chaque poney, et lorsque l'utilisateur visualise un poney, il peut également y avoir un "modifier". lien dans cette vue.

Lorsqu'un utilisateur clique sur "envoyer". après avoir édité un poney, je voudrais redonner à l’utilisateur la page qu’il était en cliquant sur le bouton "modifier". lien.

Comment puis-je écrire mon contrôleur pour rediriger l'utilisateur vers son point de départ? Certes, je peux le faire en transmettant un paramètre au contrôleur, mais cela semble un peu maladroit. Est-ce que je pense à tout cela ou est-ce à peu près ce que je vais devoir faire?

Était-ce utile?

La solution

Une des options, bien sûr, serait d’ouvrir le formulaire de modification dans une nouvelle fenêtre. L’utilisateur n’a plus qu’à fermer le formulaire.

Il y a quelques endroits dans mon application actuelle où je dois faire quelque chose de compliqué, puis passer l'utilisateur à un formulaire, puis le faire revenir au point de départ. Dans ces cas, je stocke le point de départ dans la session avant de les transmettre. C'est probablement exagéré pour ce que vous faites.

Autres options: 1) vous pouvez enregistrer le " Référent " en-tête et l'utiliser, mais cela peut ne pas être fiable; tous les navigateurs ne définissent pas cet en-tête. 2) après la soumission du formulaire, javascript pourrait être javascript sur la page de confirmation qui appelle " history.go (-2) ".

Autres conseils

Voici comment procéder (notez qu'il s'agit de la syntaxe RESTful Spring 3 MVC, mais qu'elle fonctionnera dans les anciens contrôleurs Spring):

@RequestMapping(value = "/rate", method = RequestMethod.POST)
public String rateHandler(HttpServletRequest request) {
    //your controller code
    String referer = request.getHeader("Referer");
    return "redirect:"+ referer;
}

Ma réponse est identique à celle de Sam Brodkins (je l’ai également recommandé). Mais ayant en compte que le "Référent" la valeur peut ne pas être disponible i fait cette fonction pour l'utiliser dans mes contrôleurs

/**
* Returns the viewName to return for coming back to the sender url
*
* @param request Instance of {@link HttpServletRequest} or use an injected instance
* @return Optional with the view name. Recomended to use an alternativa url with
* {@link Optional#orElse(java.lang.Object)}
*/
protected Optional<String> getPreviousPageByRequest(HttpServletRequest request)
{
   return Optional.ofNullable(request.getHeader("Referer")).map(requestUrl -> "redirect:" + requestUrl);
}

Ainsi, dans la fonction appelant de votre contrôleur, vous devriez renvoyer quelque chose comme ceci:

@RequestMapping(value = "/upload", method = RequestMethod.POST)
public @ResponseBody
String testRedirection(HttpServletRequest request)
{
      //Logic....
      //Returns to the sender url
      return getPreviousPageByRequest(request).orElse("/"); //else go to home page
}

Oui, je pense que l'idée de Jacob pour le formulaire dans une nouvelle fenêtre peut être une bonne option. Ou dans un div caché. Comme un dialogue de dojo. http://dojocampus.org/explorer/#Dijit_Dialog_Basic

Une autre option serait de concevoir vos URL de manière à révéler le contexte de ce que vous faites, et par convention, de vous permettre de "savoir". où débutait une opération.

Par exemple, vous pouvez avoir des URL telles que

.
site/section1/pony/edit
site/section1/pony/delete

site/somewhere/else/entirely/pony/edit
site/somewhere/else/entirely/pony/delete

Ces deux URL permettent l'édition et la suppression de poneys. Pour revenir au début pour les deux, vous devez simplement aller "haut" 2 dossiers. Pour ce faire, vous pouvez utiliser une fonction javascript qui ressemble à l’URL actuelle et monte simplement de 2 dossiers. Vous pouvez également le trouver du côté serveur 2 et effectuer une redirection similaire.

Vous pouvez également garder une trace de ModelAndView (ou simplement de la vue) présentée en dernier à l'utilisateur avec un intercepteur. Cet exemple conserve uniquement le dernier modèle et la dernière vue, mais vous pouvez utiliser une liste pour remonter de plusieurs niveaux.

package com.sample;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LastModelAndViewInterceptor extends HandlerInterceptorAdapter {

    public static final String LAST_MODEL_VIEW_ATTRIBUTE = LastModelAndViewInterceptor.class.getName() + ".lastModelAndView";

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        request.getSession(true).setAttribute(LAST_MODEL_VIEW_ATTRIBUTE, modelAndView);
        super.postHandle(request, response, handler, modelAndView);
    }

}

Avec la configuration XML Spring:

<bean id="handlerMapping" class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
    <property name="interceptors">
        <bean class="com.sample.LastModelAndViewInterceptor"/>
    </property>
</bean>

Ensuite, utilisez le code suivant pour revenir à cette vue dans un contrôleur:

ModelAndView mv = (ModelAndView)request.getSession().getAttribute(LastModelAndViewInterceptor.LAST_MODEL_VIEW_ATTRIBUTE);
return mv;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top