Heim  >  Artikel  >  Java  >  Beschreiben Sie kurz die Sitzungsnutzung und detaillierte Aufzeichnungen in Java

Beschreiben Sie kurz die Sitzungsnutzung und detaillierte Aufzeichnungen in Java

Y2J
Y2JOriginal
2017-05-08 13:33:275750Durchsuche

Der folgende Editor bietet Ihnen eine kurze Diskussion der Sitzungsnutzung und detaillierte Aufzeichnungen in SpringMVC. Der Herausgeber findet es ziemlich gut, deshalb werde ich es jetzt mit Ihnen teilen und es allen als Referenz geben. Folgen wir dem Herausgeber und werfen wir einen Blick darauf.

Vorwort

Ich bin neu bei SpringMVC und muss mich damit anmelden zu dem System, das ich für die Firma erstellt habe.

Ich habe viele Informationen im Internet gefunden und grob zwei Möglichkeiten zum Speichern von Sitzungen erwähnt:

1. HttpSession, die bei JavaWeb üblich ist Projekte

2. SpringMVC-spezifische @SessionAttributes

Ich persönlich lege mehr Wert auf die Verwendung von @SessionAttributes. Schließlich verwende ich jetzt SpringMVC. Aber als ich die Artikel im Internet las, erklärten sie im Grunde nur die grundlegende Verwendung und es gab im Grunde keine detaillierten Verwendungen und Details. Ich dachte, das sei nicht genug, also habe ich selbst einige Tests durchgeführt, dann den Code kompiliert und einen erstellt Demo. Nehmen Sie es auf und teilen Sie es. Wenn Sie Mängel haben, können Sie diese gerne besprechen.

Okay, genug des Unsinns, jetzt beginnt die eigentliche Show!

Schlussfolgerung

Nun, um einigen Kunden, die den Code nicht gerne lesen, die Mühe zu ersparen, die Schlussfolgerung zu lesen, habe ich Ich werde hier zunächst meine Schlussfolgerungen zusammenfassen. Lassen Sie uns zunächst die Schlussfolgerungen nach dem Test auflisten.

1. Sie können Daten automatisch über die einzigartige ModelMap und das Modell von SpringMVC im Controller speichern, oder Sie können Sitzungsdaten über herkömmliche HttpSession und andere Parameter speichern

2. Die Annotation @SessionAttributes muss zum Speichern von Sitzungsdaten verwendet werden. Diese Annotation verfügt über zwei Parameterdeklarationsmethoden (Wert und Typ), und die Annotationsdeklaration muss in die Klasse geschrieben werden, nicht in die Methode

3. Die gespeicherten Sitzungsdaten müssen der Parameterliste in der Annotation @SessionAttributes entsprechen.

4 Löschen Sie die in der Sitzung gespeicherten Parameter. Beachten Sie, dass alle Daten gelöscht werden und die durch angegebenen Sitzungsdaten nicht einzeln gelöscht werden können. Gleichzeitig folgen die wirksamen Berechtigungen beim Löschen den oben genannten Regeln 2 und 3 (diese Regel kann verwendet werden, um den Effekt des Löschens bestimmter Sitzungsdaten künstlich zu erzielen)

5 Daten in der Sitzung über ModelMap usw. Es gibt auch die oben genannten Parameterberechtigungsbeschränkungen

6. Wenn Sie ModelMap oder Model zum Speichern von Sitzungsdaten verwenden, muss ModelMap als Methode übergeben werden Parameter, und der neu definierte in der Methode ist ungültig. Gleichzeitig funktioniert die ModelMap, solange sie als Parameter übergeben wird, auch dann, wenn sie von anderen Methoden aufgerufen wird

7. Bei Verwendung der @ResponseBody-Annotation (normalerweise Bei Verwendung mit Ajax kann die Sitzung nicht gespeichert werden. Daten

8. Die @SessionAttributes-Annotation kann 2 Parameterlisten mit Wert und Typ verwenden

9. Die herkömmliche Methode zur Verwendung von HttpSession weist nicht die oben genannten Anmerkungen und Berechtigungen sowie andere Einschränkungen auf. Es gibt unten einen einfachen Test, aber keine detaillierte Erklärung

Es gibt einige allgemeine Kenntnisse Punkte unten

10. Der Betrieb von Sitzungsdaten kann kategorieübergreifend sein und hat nichts mit dem Paket oder URL-Pfad zu tun

11. Wenn mit demselben Sitzungswert gearbeitet wird, überschreibt der nachfolgende Wert den vorherigen Wert

Testcode und einfache Anweisungen

Entwicklungstools: Spring Tool Suite .

Spring hat ein IDE-Entwicklungstool basierend auf

Eclipse speziell für SpringMVC entwickelt. Es fühlt sich gut an, nachdem ich es kürzlich verwendet habe.

Machen wir zunächst einen Screenshot der Projektstruktur

Beschreiben Sie kurz die Sitzungsnutzung und detaillierte Aufzeichnungen in Java

Da die @ResponseBody-Annotation von Ajax verwendet wird Für die nachfolgenden Tests muss daher das JAR-Paket in der Datei pom.xml konfiguriert werden.

<!-- 使用@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>
Das Folgende ist der Haupttestcode

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";
 }
 
}
Wenn dies ein mit STS erstelltes Projekt wie ich ist, hat die Standard-JSP-Datei die Konfiguration, muss gelöscht oder

auskommentiert werden. Andernfalls können die Daten in der Sitzung nicht auf der Seite angezeigt werden. Natürlich ist es auch möglich, den Hintergrundcode direkt über den /show-Test anzuzeigen, den ich hier geschrieben habe.

<%@ 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>
Es gibt auch einen Testcode speziell für die @SessionAttributes-Parameterkonfiguration

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

Eine kurze Beschreibung des Testprozesses:

Da es viele Parameter gibt, bin ich zu faul, mir Namen auszudenken, also haben die serialisierten Tests 1, 2 und 3 bestanden.

Geben Sie beim Testen die URL im Browser ein: localhost:8080/session/show1

Ändern Sie dann das Suffix show1 in etwas anderes, z. B. set1, set2 und clear1, clear2 usw. , insbesondere Bitte beachten Sie die @RequestMapping-Konfiguration in meinem Code.

Jedes Mal, wenn Sie set1 und set2 eingeben, müssen Sie show1 und show2 eingeben, um den Inhalt der Sitzung über die Konsole anzuzeigen. Natürlich können Sie die Anzeigeinformationen auch direkt im Browser anzeigen.

Hier werde ich über die wichtigsten Schlussfolgerungen sprechen:

1. Um ModelMap zum automatischen Speichern von Daten in der Sitzung zu verwenden, müssen Sie die Annotation @SessionAttributes konfigurieren

2. Die Annotation @SessionAttributes kann nur für eine Klasse deklariert werden. Nach der Deklaration können die Methoden in der Klasse nur mit den in @SessionAttributes konfigurierten Parametern arbeiten, einschließlich Speichern , Klar und lesen.

Abschließend werden einige Schlussfolgerungen zur Parameterkonfiguration in @SessionAttributes gezogen:

1. Konfigurationsparameter stellen Wert und Typ bereit, die im Array Typ. (Wenn nur ein Parameter vorhanden ist, ist es nicht erforderlich, ihn in Array-Form zu schreiben, z. B. @SessionAttributes(value="test1",types=Integer.class))

2. Verwenden von Werten zum Konfigurieren von Parametern ähnelt dem Schlüssel-Wert-Paar im Kartenschlüssel

3 Nach der Konfiguration der Parameter des praktischen Typs ist der im Hintergrund gespeicherte Schlüsseltyp meiner Meinung nach nur beim Speichern von nützlich benutzerdefinierte Klasse

Objekt, wie z. B. „types=User.class“, für allgemeine gemeinsame Klassenobjekte wie „String“ halte ich es für besser, Wert-Schlüssel-Wert-Paare zu verwenden. Natürlich müssen spezifische Situationen immer noch im Einzelfall analysiert werden.

[Verwandte Empfehlungen]

1.

Kostenloses Java-Video-Tutorial

2.

Java-Video-Tutorial zur Implementierung von Miniaturansichten mit gleichen Proportionen für Bilder

3.

FastJson Tutorial-Handbuch

Das obige ist der detaillierte Inhalt vonBeschreiben Sie kurz die Sitzungsnutzung und detaillierte Aufzeichnungen in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn