Il controller Spring-MVC reindirizza a & # 8220; precedente & # 8221; pagina?

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

  •  03-07-2019
  •  | 
  •  

Domanda

Diciamo che ho un modulo per modificare le proprietà di un Pony e nella mia applicazione web ci sono più posti in cui puoi scegliere di modificare un Pony. Ad esempio, in un elenco di Pony potrebbe esserci una "modifica" collegamento accanto a ciascun Pony e quando l'utente sta visualizzando un Pony, potrebbe esserci anche una "modifica" link in quella vista.

Quando un utente fa clic su " submit " dopo aver modificato un Pony, vorrei riportare l'utente alla pagina che era quando faceva clic su " modifica " collegamento.

Come scrivo il mio controller per reindirizzare l'utente al punto di partenza? Certamente posso farlo passando un parametro al controller, ma sembra un po 'sciocco. Sto pensando a questo tutto sbagliato o è praticamente quello che dovrò fare?

È stato utile?

Soluzione

Un'opzione, ovviamente, sarebbe quella di aprire il modulo di modifica in una nuova finestra, quindi tutto ciò che l'utente deve fare è chiuderlo e sono tornati dove erano.

Ci sono alcuni punti nella mia attuale applicazione in cui ho bisogno di fare qualcosa di complicato, quindi passare l'utente a un modulo e poi farli tornare al punto di partenza. In questi casi, memorizzo il punto di partenza nella sessione prima di trasmetterli. Questo è probabilmente eccessivo per quello che stai facendo.

Altre opzioni: 1) puoi memorizzare il " Referer " intestazione e usalo, ma potrebbe non essere affidabile; non tutti i browser impostano quell'intestazione. 2) potresti avere javascript nella pagina di conferma dopo l'invio del modulo che chiama " history.go (-2) " ;.

Altri suggerimenti

Ecco come farlo ragazzi (nota che questa è la sintassi MVC RESTful Spring 3 ma funzionerà con i controller Spring più vecchi):

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

La mia risposta è simile a quella di Sam Brodkins (l'ho consigliato anche io). Ma tenendo conto del fatto che il "Referer" valore potrebbe non essere disponibile Ho creato questa funzione per usarla nei miei 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);
}

Quindi nella funzione di chiamata del controller dovresti restituire qualcosa del genere:

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

Sì, penso che l'idea di Jacob per il modulo in una nuova finestra possa essere una buona opzione. O in un div nascosto. Come una finestra di dialogo dojo. http://dojocampus.org/explorer/#Dijit_Dialog_Basic

un'altra opzione sarebbe quella di progettare i tuoi URL in modo che rivelino il contesto di ciò che stai facendo e, per convenzione, ti permetterebbe di "conoscere". dove era l'inizio di un'operazione.

Ad esempio, potresti avere gli URL in questo modo

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

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

entrambi gli URL consentono la modifica e l'eliminazione di pony. Per tornare all'inizio di entrambi, devi semplicemente andare su " su " 2 cartelle. Questo potrebbe essere fatto tramite una funzione javascript che guarda l'URL corrente e sale solo 2 cartelle, oppure potresti capirlo sul lato server 2 e fare anche un reindirizzamento del genere.

Puoi anche tenere traccia di ModelAndView (o solo della vista) che è stata presentata per l'ultima volta all'utente con un intercettore. Questo esempio tiene traccia solo dell'ultimo modello e vista, ma è possibile utilizzare un elenco per tornare indietro di più livelli.

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

}

Con configurazione XML Spring:

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

E quindi utilizzare il seguente codice per tornare a quella vista in un controller:

ModelAndView mv = (ModelAndView)request.getSession().getAttribute(LastModelAndViewInterceptor.LAST_MODEL_VIEW_ATTRIBUTE);
return mv;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top