web-dev-qa-db-fra.com

Passer l'attribut de modèle pendant la redirection au printemps MVC et éviter le même dans l'URL

Je suis un débutant au printemps 
J'ai également consulté des publications Web et connexes dans stackoverflow. Je n'ai pas trouvé celui dont j'ai réellement besoin.
Mon objectif est de transmettre les attributs de modèle du contrôleur à la page jsp lors d’une redirection et d’éviter que l’attribut ne soit affiché dans une URL.
Ce qui suit valide la connexion depuis le magasin de données à l’aide de jdo. 

Mon contrôleur: 

@Controller
public class LoginController {
    int count;
    PersistenceManager pm = PMF.get().getPersistenceManager();

    //Instance of data class
        User user;
    ModelAndView modelAndView=new ModelAndView();

    @RequestMapping(value="/Login",method = RequestMethod.POST)
    public ModelAndView loginValidate(HttpServletRequest req){

        //Getting login values
        String uname=req.getParameter("nameLogin");
        String pswd1=req.getParameter("pswdLogin");
        count=0;


        user=new User();

        //Generating Query
        Query q = pm.newQuery(User.class);
        q.setFilter("userName == userNameParam");
        q.declareParameters("String userNameParam");

        try{
            List<User> results = (List<User>) q.execute(uname);  
            for (User u: results) {

                String userName=u.getUserName();

                if(userName.equals(uname)){

                    System.out.println(u.getPassword());

                    if(u.getPassword().equals(pswd1)){
                        count=count+1;
                        modelAndView.setViewName("redirect:welcome");
                        modelAndView.addObject("USERNAME",uname);
                        return modelAndView;

                    }
         //rest of the logic 
    }

JSP: 

 <h1>Welcome ${USERNAME} </h1>

Mon URL est /welcome?USERNAME=robin
Mon objectif est de l'afficher en tant que /welcome 
De plus, ma page est supposée afficher "Welcome robin" alors qu’elle n’affiche que Welcome. S'il vous plaît laissez-moi savoir comment puis-je résoudre ce problème. 
Merci d'avance!

19
Chandni

Vous devez utiliser l'attribut flash facility de Spring MVC. Lorsque vous souhaitez que les données soient accessibles après une redirection, ne les ajoutez pas au modèle (Model, ModelMap ou ModelAndView), mais à une RedirectAttributes que vous obtenez comme paramètre dans votre méthode de contrôleur.

@RequestMapping(value="/Login",method = RequestMethod.POST)
public ModelAndView loginValidate(HttpServletRequest req, RedirectAttributes redir){
...

    modelAndView.setViewName("redirect:welcome");
    redir.addFlashAttribute("USERNAME",uname);
    return modelAndView;
}

Ces attributs flash sont transmis via la session (et sont détruits immédiatement après leur utilisation - voir Spring Reference Manual pour plus de détails). Cela a deux intérêts:

  • ils ne sont pas visibles dans l'URL
  • vous n'êtes pas limité à String, mais vous pouvez transmettre des objets arbitraires.
55
Serge Ballesta

Vous devez faire attention ici car je pense que ce que vous essayez de faire n’est pas pris en charge pour une bonne raison. La directive "redirect" émettra une requêteGETà votre contrôleur. La requêteGETdoit uniquement récupérer l'état existant à l'aide de paramètres de requête, il s'agit du contrat de méthode. CeGETrequestne devrait pass'appuyer sur une interaction précédente ou sur n'importe quel objet stocké quelque part dans la session à la suite.GETrequest est conçu pour récupérer l'état existant (persistant). Votre demande d'origine (POST) doit avoir conservé tout ce dont vous avez besoin pour vousOBTENEZdemande de récupération d'un état. 

RedirectAttributes ne sont pas conçus pour vous aider dans ce cas, et même si vous parvenez à l'utiliser correctement, cela ne fonctionnera qu'une fois, puis ils seront détruits. Si vous actualisez ensuite le navigateur, vous obtiendrez une erreur d'application car il ne trouvera plus vos attributs.

5
DhafirNz

Tous les objets envoyés en utilisant la redirection peuvent être passés dans l'URL elle-même depuis le contrôleur en tant que -

String message = "Hi Hello etc etc"
return new ModelAndView("redirect:" + "welcome", "message", message);

Cette variable de message sera disponible dans l'URL sous la forme d'une demande GET -

http://localhost:8080/Demo/welcome?message=Hi Hello etc etc

Vous pouvez maintenant accéder à la variable sur votre JSP via Scriptlet -

<%= request.getParameter("message") %>
2
devutkarsh