L'éditeur suivant vous apportera une brève discussion sur l'utilisation des sessions et les enregistrements détaillés dans SpringMVC. L'éditeur le trouve plutôt bon, je vais donc le partager avec vous maintenant et le donner comme référence pour tout le monde. Suivons l'éditeur et jetons un coup d'œil
Avant-propos
Je suis nouveau sur SpringMVC Récemment, je dois l'utiliser pour me connecter. au système que j'ai construit pour la session d'entreprise.
J'ai trouvé beaucoup d'informations sur Internet et j'ai mentionné en gros 2 façons de sauvegarder des sessions :
1. HttpSession qui est commune à javaWeb. projets
2. @SessionAttributes spécifiques à SpringMVC
Je fais personnellement plus attention à l'utilisation de @SessionAttributes Après tout, j'utilise SpringMVC maintenant. Mais quand j'ai lu les articles sur Internet, ils n'expliquaient essentiellement que l'utilisation de base, et il n'y avait pratiquement aucune utilisation ni détails détaillés. J'ai pensé que ce n'était pas suffisant, alors j'ai fait quelques tests moi-même, puis j'ai compilé le code et créé un. Démo. Enregistrez-la et partagez-la. Si vous avez des lacunes, vous êtes invités à en discuter.
Bon, assez de bêtises, maintenant le vrai spectacle commence !
Conclusion
Eh bien, afin d'éviter à certains clients qui n'aiment pas lire le code la peine de lire la conclusion, je Je vais d’abord résumer ma conclusion ici. Énumérons d’abord les conclusions après le test.
1. Vous pouvez enregistrer automatiquement les données dans la session via le ModelMap et le modèle uniques de SpringMVC dans le contrôleur, ou vous pouvez enregistrer les données de session via HttpSession traditionnelle et d'autres paramètres
2. L'annotation @SessionAttributes doit être utilisée pour enregistrer les données de session. Cette annotation a deux méthodes de déclaration de paramètres (valeur et type), et la déclaration d'annotation doit être écrite sur la classe, pas sur la méthode
3. Les données de session enregistrées doivent correspondre à la liste de paramètres dans l'annotation @SessionAttributes. Les paramètres non déclarés ne peuvent pas être enregistrés dans la session
4. effacez les paramètres enregistrés dans la session. Notez que toutes les données sont effacées et que les données de session spécifiées par ne peuvent pas être supprimées individuellement. Dans le même temps, les autorisations effectives lors de l'effacement suivent les règles 2 et 3 ci-dessus (cette règle peut être utilisée pour obtenir artificiellement l'effet de suppression des données de session spécifiées)
5. données dans la session via ModelMap, etc., il existe également les restrictions d'autorisation des paramètres ci-dessus6. Lorsque vous utilisez ModelMap ou Model pour enregistrer des données de session, ModelMap doit être transmis en tant que méthode paramètre, et celui nouvellement défini dans la méthode n'est pas valide. En même temps, tant que le ModelMap est passé en paramètre, il fonctionnera même s'il est appelé par d'autres méthodes
7. Lors de l'utilisation de l'annotation @ResponseBody (généralement utilisée avec ajax), la session ne peut pas être enregistrée. Données
8 L'annotation @SessionAttributes peut utiliser 2 listes de paramètres de valeur et de type
. 9. La méthode traditionnelle d'utilisation de HttpSession n'a pas les annotations, autorisations et autres restrictions ci-dessus, il y a un test simple ci-dessous, mais aucune explication détaillée
Il existe quelques connaissances communes. points ci-dessous
10. Le fonctionnement des données de session peut être inter-catégories et n'a rien à voir avec le chemin du package ou de l'URL
. 11. Lorsque vous travaillez sur la même valeur de session, la valeur la plus récente écrasera la valeur précédente
Code de test et instructions simples
Outils de développement : Spring Tool Suite .
Spring a développé un outil de développement IDE basé sur
Eclipsespécifiquement pour SpringMVC Il intègre Maven et Tomcat Cela fait du bien après l'avoir utilisé récemment, je le recommande.
Prenons d'abord une capture d'écran de la structure du projetParce que l'annotation @ResponseBody d'ajax est utilisée dans les tests suivants. Par conséquent, le package jar doit être configuré dans le fichier pom.xml.
Ce qui suit est le code de test principal<!-- 使用@ResponseBody注解所需的2个包 --> <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-core-asl</artifactId> <version>1.9.13</version> </dependency> <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-mapper-asl</artifactId> <version>1.9.13</version> </dependency>
package test.dmh.session; import java.util.Enumeration; import javax.servlet.http.HttpSession; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.SessionAttributes; import org.springframework.web.bind.support.SessionStatus; /** * @SessionAttributes 只声明了参数test1 */ @Controller @SessionAttributes(value={"test1"}) public class HomeController { private static final Logger logger = LoggerFactory.getLogger(HomeController.class); @RequestMapping(value = "/show1") public String show(ModelMap modelMap, HttpSession session) { logger.info("show session"); for (Object key : modelMap.keySet()) { Object value = modelMap.get(key); System.out.println(key + " = " + value); } System.out.println("***********************************"); Enumeration<String> e = session.getAttributeNames(); while (e.hasMoreElements()) { String s = e.nextElement(); System.out.println(s + " == " + session.getAttribute(s)); } System.out.println("***********************************"); return "home"; } @RequestMapping("/set1") public String setSession(ModelMap modelMap) { logger.info("set session 1"); modelMap.addAttribute("test1", "value 1"); //设置一个在@SessionAttributes中声明过的参数 modelMap.addAttribute("test2", "value 2"); //设置一个未在@SessionAttributes中声明过的参数 return "home"; } @RequestMapping("/setM") public String setSessionM(Model model) { logger.info("set session 1"); model.addAttribute("test1", "value 1"); //设置一个在@SessionAttributes中声明过的参数 model.addAttribute("test2", "value 2"); //设置一个未在@SessionAttributes中声明过的参数 return "home"; } @RequestMapping("/clear1") public String clear(SessionStatus status) { logger.info("clear session 1"); status.setComplete(); return "home"; } }
package test.dmh.session.controller; import javax.servlet.http.HttpSession; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.RequestMapping; /** * 没有使用@SessionAttributes注解 */ @Controller public class IndexController { private static final Logger logger = LoggerFactory.getLogger(IndexController.class); @RequestMapping("/set2") public String setSession(ModelMap modelMap, HttpSession session) { logger.info("set session 2 : without @SessionAttributes"); modelMap.addAttribute("test3", "value 3"); session.setAttribute("test4", "value 4"); return "home"; } }
package test.dmh.session.controller; import java.util.Enumeration; import java.util.HashMap; import java.util.Map; import javax.servlet.http.HttpSession; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.SessionAttributes; import org.springframework.web.bind.support.SessionStatus; @Controller @SessionAttributes(value={"test5", "index"}) public class IndexController2 { private static final Logger logger = LoggerFactory.getLogger(IndexController2.class); @RequestMapping("/set3") public String setSession(ModelMap modelMap, HttpSession session) { logger.info("set session 3"); modelMap.addAttribute("test5", "value 5"); session.setAttribute("test6", "value 6"); ModelMap map = new ModelMap(); map.addAttribute("test7", "value 7"); this.setValueToSession(modelMap, session, "Hello World"); return "home"; } @ResponseBody @RequestMapping(value="/login") public Map<String, Object> login(ModelMap modelMap, HttpSession session) { logger.info("login"); Map<String, Object> map = new HashMap<String, Object>(); map.put("success", true); map.put("info", "登录成功!"); modelMap.addAttribute("testAjax", "test ajax value"); session.setAttribute("httpTestAjax", "http test ajax Value"); setValueToSession(modelMap, session, "This is Ajax"); return map; } private void setValueToSession(ModelMap modelMap, HttpSession session, String value) { logger.info("set session private"); modelMap.addAttribute("index", value); session.setAttribute("httpIndex", value); } @RequestMapping("/clear2") public String clear(SessionStatus status) { logger.info("clear session 2"); status.setComplete(); return "home"; } @RequestMapping(value = "/show2") public String show(ModelMap modelMap, HttpSession session) { logger.info("show session"); for (Object key : modelMap.keySet()) { Object value = modelMap.get(key); System.out.println(key + " = " + value); } System.out.println("***********************************"); Enumeration<String> e = session.getAttributeNames(); while (e.hasMoreElements()) { String s = e.nextElement(); System.out.println(s + " == " + session.getAttribute(s)); } System.out.println("***********************************"); return "home"; } }
. Sinon, les données de la session ne peuvent pas être affichées sur la page. Bien entendu, il est également possible de visualiser directement le code d'arrière-plan via le test /show que j'ai écrit ici.
Il existe également un code de test spécifiquement pour la configuration des paramètres @SessionAttributes<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 4 <html> <head> <title>Home</title> </head> <body> <h1> Hello world! </h1> <p> The test1 is ${sessionScope.test1}. </p> <p> The test2 is ${sessionScope.test2}. </p> <p> The test3 is ${sessionScope.test3}. </p> <p> The test4 is ${sessionScope.test4}. </p> <p> The test5 is ${sessionScope.test5}. </p> <p> The test6 is ${sessionScope.test6}. </p> <p> The test7 is ${sessionScope.test7}. </p> <p> The index is ${sessionScope.index}. </p> <p> The httpIndex is ${sessionScope.httpIndex}. </p> <br> <input type="button" value="test" onclick="test();"> <script src="resources/js/jquery.min.js"></script> <script type="text/javascript"> function test() { $.ajax({ type : "POST", url : "login", dataType : "json", success : function(data) { console.log(data); window.open("/session/test", "_self"); }, error : function() { alert("出错了!"); } }); } </script> </body> </html>
package test.dmh.session.controller; import java.util.Enumeration; import javax.servlet.http.HttpSession; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.SessionAttributes; import org.springframework.web.bind.support.SessionStatus; @Controller @SessionAttributes(value={"index1", "index2"}, types={String.class, Integer.class}) public class IndexController3 { private static final Logger logger = LoggerFactory.getLogger(IndexController3.class); @RequestMapping("/setIndex") public String setSession(ModelMap modelMap) { logger.info("set session index"); modelMap.addAttribute("index1", "aaa"); modelMap.addAttribute("index2", "bbb"); modelMap.addAttribute("index2", "ccc"); modelMap.addAttribute("DDD"); modelMap.addAttribute("FFF"); modelMap.addAttribute(22); return "home"; } @RequestMapping(value = "/showIndex") public String show(ModelMap modelMap, HttpSession session) { logger.info("show session"); for (Object key : modelMap.keySet()) { Object value = modelMap.get(key); System.out.println(key + " = " + value); } System.out.println("***********************************"); Enumeration<String> e = session.getAttributeNames(); while (e.hasMoreElements()) { String s = e.nextElement(); System.out.println(s + " == " + session.getAttribute(s)); } System.out.println("***********************************"); return "home"; } @RequestMapping("/clearIndex") public String clear(SessionStatus status) { logger.info("clear session index"); status.setComplete(); return "home"; } }
Une brève description du processus de test : Parce qu'il y a de nombreux paramètres, je suis trop paresseux pour penser à des noms, donc les tests sérialisés 1, 2 et 3 ont réussi.
Lors du test, entrez l'URL sur le navigateur : localhost:8080/session/show1
Remplacez ensuite le suffixe show1 par autre chose, comme set1, set2 et clear1, clear2, etc. , en particulier Veuillez consulter la configuration @RequestMapping dans mon code.
Chaque fois que vous entrez set1 et set2, vous devez entrer show1 et show2 pour afficher le contenu de la session via la console. Bien sûr, vous pouvez également afficher les informations d'affichage directement sur le navigateur.
Ici, je vais parler des principales conclusions :
1 Pour utiliser ModelMap pour enregistrer automatiquement les données dans la session, vous devez configurer l'annotation @SessionAttributes .
2. L'annotation @SessionAttributes ne peut être déclarée que sur une classe Après la déclaration, les méthodes de la classe ne peuvent opérer que sur les paramètres configurés dans @SessionAttributes, y compris. enregistrer, effacer et lire.
Enfin, quelques conclusions sont tirées sur la configuration des paramètres dans @SessionAttributes :
1 Les paramètres de configuration fournissent une valeur et un type, qui sont stockés Array. tapez. (Lorsqu'il n'y a qu'un seul paramètre, il n'est pas nécessaire de l'écrire sous forme de tableau, comme @SessionAttributes(value="test1", types=Integer.class))
Utiliser la valeur pour configurer les paramètres. est similaire à la paire clé-valeur dans Map key
3 Après avoir configuré les paramètres du type pratique, la clé enregistrée en arrière-plan est son type. Personnellement, j'estime qu'elle n'est utile que lors de la sauvegarde d'un. classe personnaliséeobjet, tel que types=User.class , pour les objets de classe communs généraux tels que String, je pense qu'il est préférable d'utiliser des paires valeur clé-valeur. Bien entendu, les situations spécifiques doivent encore être analysées au cas par cas.
[Recommandations associées]
2.Tutoriel vidéo Java sur la mise en œuvre de miniatures à proportion égale pour les images
3.Manuel du didacticiel FastJson
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!