Frage

Lassen Sie uns sagen, dass ich für die Bearbeitung der Eigenschaften eines Pony eine Form haben, und in meiner Web-Anwendung gibt es mehrere Orte, an denen Sie wählen können, ein Pony zu bearbeiten. Zum Beispiel in einer Liste von Ponies könnte es einen Link „Bearbeiten“ wird neben jedes Pony, und wenn der Benutzer ein Pony anschaut, könnte es auch ein Link „Bearbeiten“ in dieser Ansicht sein.

Wenn ein Benutzer klickt auf „Eintragen“ nach einem Pony bearbeiten, würde Ich mag den Benutzer auf der Seite zurückzukehren, die er oder sie war, als der Link „Bearbeiten“ klicken.

Wie schreibe ich meinen Controller die Benutzer zurück zu umleiten, wo sie begonnen hat? Sicherlich kann ich dies tun, indem Sie einen Parameter an die Steuerung vorbei, aber das scheint ein wenig doof. Bin ich über dieses alles falsch zu denken, oder ist das ziemlich viel, was ich tun?

War es hilfreich?

Lösung

Eine Möglichkeit, natürlich, würde das Bearbeitungsformular in einem neuen Fenster zu öffnen, so dass alle Benutzer zu tun haben, ist in der Nähe es und sie sind wieder da, wo sie waren.

Es gibt ein paar Orte in meiner aktuellen Anwendung, wo ich brauche etwas kompliziert zu tun, passiert dann den Benutzer auf eine Form, und sie dann zum Ausgangspunkt zurückzukehren. In den Fällen, speichere ich den Startpunkt in der Sitzung, bevor sie passiert haben. Das ist wahrscheinlich übertrieben für das, was Sie tun.

Weitere Möglichkeiten: 1) Sie können den „Referer“ Header speichern und verwenden, aber das ist vielleicht nicht zuverlässig; nicht gesetzt alle Browser diesen Header. 2) Sie können haben Javascript auf der Bestätigungsseite nach der Formular-Vorlage, die „history.go(-2)“.

ruft

Andere Tipps

Hier ist, wie es Jungen tun (Beachten Sie diese RESTful Frühling ist 3 MVC-Syntax, aber es wird in älteren Frühjahr Controller arbeiten):

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

Meine Antwort ist ähnlich zu Sam Brodkins's (i recomended es auch). Aber in Zahl aufweist, die der „Referer“ Wert möglicherweise nicht zur Verfügung ich diese Funktion gemacht, es zu benutzen in meinem Controller

/**
* 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);
}

So in Ihrer Controller CLIP-Funktion sollten Sie etwas wie folgt zurück:

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

Ja ich denke, Jacob Idee für das Formular in einem neuen Fenster eine gute Option sein kann. Oder in einem versteckten div. Wie ein Dojo-Dialog. http://dojocampus.org/explorer/#Dijit_Dialog_Basic

eine andere Option wäre, um Ihre Urls zu gestalten, so dass sie den Kontext zeigen, was Sie tun, und vereinbarungs Sie erlauben würde, zu „wissen“, wo der Start einer Operation war.

Zum Beispiel, Sie Urls wie so haben könnte

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

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

diese beiden URLs erlauben Pony Bearbeiten und Löschen. Um zurück zum Start für beide zu gehen, würden Sie einfach gehen „up“ 2 Ordner. Dies könnte über eine Javascript-Funktion erfolgen, die in der aktuellen URL aussieht, und nur nach oben geht 2 Ordner, oder Sie können es herausfinden auf der Serverseite 2 und führen Sie eine Umleitung wie das auch.

Sie können auch den Überblick über das Modeland halten (oder einfach nur die Aussicht), die zuletzt an den Benutzer mit einem Abfangjäger präsentiert wurde. Dieses Beispiel verfolgt nur das letzte Modell und Aussicht, aber man könnte eine Liste navigieren zurück mehr Ebenen verwendet werden.

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

}

Mit Spring-XML-Konfiguration:

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

Und dann verwenden Sie den folgenden Code in einem Controller zu dieser Ansicht zurück zu bekommen:

ModelAndView mv = (ModelAndView)request.getSession().getAttribute(LastModelAndViewInterceptor.LAST_MODEL_VIEW_ATTRIBUTE);
return mv;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top