web-dev-qa-db-fra.com

Avancer avec des paramètres supplémentaires?

Existe-t-il un moyen de transmettre une demande à un autre contrôleur tout en y ajoutant des données de paramètres? J'ai essayé d'ajouter au ModelMap, mais il ne semble pas traîner. Je fais quelque chose comme:

return "forward:/my-other-controller";

La seule autre façon dont je peux penser est de mettre les paramètres sur la session puis de les faire disparaître dans le contrôleur cible.

25
Tony R

Le moyen le plus simple consiste à ajouter les données à la demande. Comme il s'agit d'un transfert, la même demande est transmise à différents gestionnaires du serveur.

À titre d'exemple, commençons par une configuration simple de deux contrôleurs, l'un se transmettant à l'autre:

@Controller
public class TestController {
    @RequestMapping(value="/test")
    public String showTestPage() {
        return "forward:/test2";
    }
}

@Controller
public class TestController2 {
    @RequestMapping(value="/test2")
    public String showTestPage() {
        return "testPageView";
    }
}

La première façon d'ajouter les données consiste à les définir comme attributs sur la demande. Les nouveaux contrôleurs ressembleront à ceci ( [~ # ~] a [~ # ~] ):

@Controller
public class TestController {
    @RequestMapping(value="/test")
    public String showTestPage(HttpServletRequest request) {
        request.setAttribute("param1", "foo");
        request.setAttribute("param2", "bar");
        return "forward:/test2";
    }
}

@Controller
public class TestController2 {
    @RequestMapping(value="/test2")
    public String showTestPage(HttpServletRequest request) {
        String param1 = (String) request.getAttribute("param1");
        String param2 = (String) request.getAttribute("param2");
        return "testPageView";
    }
}

Étant donné que le nom de la vue dans le le préfixe avant est essentiellement une URL , vous pouvez également avoir les versions suivantes (attribut changé en paramètre) ( [~ # ~] b [ ~ # ~] ):

@Controller
public class TestController {
    @RequestMapping(value="/test")
    public String showTestPage() {
        return "forward:/test2?param1=foo&param2=bar";
    }
}

@Controller
public class TestController2 {
    @RequestMapping(value="/test2")
    public String showTestPage(HttpServletRequest request) {
        String param1 = request.getParameter("param1");
        String param2 = request.getParameter("param2");
        return "testPageView";
    }
}

Vous pouvez également simplifier davantage le deuxième contrôleur en utilisant des annotations à la place:

@Controller
public class TestController2 {
    @RequestMapping(value="/test2")
    public String showTestPage(@RequestParam String param1, @RequestParam String param2) {
        return "testPageView";
    }
}

Et juste pour le plaisir, et pour montrer le comportement de liaison de Spring en action, vous pouvez le faire même comme ceci ( [~ # ~] c [~ # ~] ):

@Controller
public class TestController {
    @RequestMapping(value="/test")
    public String showTestPage() {
        return "forward:/test2?param1=foo&param2=bar";
    }
}

@Controller
public class TestController2 {
    @RequestMapping(value="/test2")
    public String showTestPage(@ModelAttribute DummyBinder params) {
        String param1 = params.getParam1();
        String param2 = params.getParam2();
        return "testPageView";
    }
}

class DummyBinder {
    private String param1;
    private String param2;

    public String getParam1() {
        return param1;
    }

    public void setParam1(String param1) {
        this.param1 = param1;
    }

    public String getParam2() {
        return param2;
    }

    public void setParam2(String param2) {
        this.param2 = param2;
    }
}

Je choisirais personnellement la solution A pour de nombreux paramètres et la solution B pour quelques-uns. La solution C a une sorte de "hein ...?!" effet donc je l'éviterais (cela fonctionne aussi avec des paramètres ajoutés à l'URL donc quelques-uns ou vous obtenez une URL en désordre).

L'ajout des données dans la session fonctionnerait également hors cours, mais prolongerait inutilement la durée de vie des données, donc le meilleur endroit est de les ajouter à la demande lors de la transition vers le deuxième contrôleur.

49
Bogdan

Considérez le transfert comme la redirection, mais sans avoir besoin d'un contexte et d'un hôte dans ce sens (le transfert est géré en interne par le serveur, tandis que la redirection demande au navigateur de l'utilisateur de demander une URL différente).

Alors, oui, utilisez la session, les cookies ou postez ou obtenez des paramètres.

0
Steven

Avez-vous pensé aux filtres? Vous pouvez créer un filtre en utilisant le proxy de filtrage délégué qui vous donnera accès aux paramètres de la demande ainsi qu'aux beans ressort.

0
Aravind A

J'ai trouvé ce message , qui utilise un HttpRequestWrapper:

D'abord:
Définissez le HttpRequestWrapper et remplacez les méthodes getParameter, getParameterMap, getParameterNames et getParameterValues comme dans la publication.

Deuxième:
Transférer via RequestDispatcher à votre URL, en utilisant la requête wrapped dans les paramètres de la méthode:

request.getRequestDispatcher("myForwardUrl").forward(new MyRequestWrapper(request), response);

J'ai essayé cela pour supprimer des paramètres (ce qui est encore plus difficile!) Et ça marche!

0
olivmir