Wenn Sie nach jeder Antwort ein Objekt löschen möchten, benötigen Sie keine Sitzung.
Wenn Sie das Objekt während der Benutzersitzung behalten möchten, gibt es verschiedene Möglichkeiten:
Fügen Sie der Sitzung direkt ein Attribut hinzu:
@RequestMapping(method = RequestMethod.GET)
public String testMestod(HttpServletRequest request){
ShoppingCart cart = (ShoppingCart)request.getSession().setAttribute("cart",value);
return "testJsp";
}
und Sie können es von Controller wie folgt erhalten:
ShoppingCart cart = (ShoppingCart)session.getAttribute("cart");
Machen Sie Ihre Controller-Sitzung umfangreich
@Controller
@Scope("session")
Umfang der Objekte, z. B. haben Sie ein Benutzerobjekt, das sich jedes Mal in der Sitzung befinden sollte:
@Component
@Scope("session")
public class User
{
String user;
/* setter getter*/
}
Fügen Sie dann Klasse in jeden Controller ein, den Sie möchten
@Autowired
private User user
das hält den Unterricht in der Sitzung.
Die AOP-Proxy-Injektion: im Frühjahr -xml:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.1.xsd">
<bean id="user" class="com.User" scope="session">
<aop:scoped-proxy/>
</bean>
</beans>
Fügen Sie dann Klasse in jeden Controller ein, den Sie möchten
@Autowired
private User user
5.Pass HttpSession to method:
String index(HttpSession session) {
session.setAttribute("mySessionAttribute", "someValue");
return "index";
}
6.Make ModelAttribute in Sitzung von @SessionAttributes ("ShoppingCart"):
public String index (@ModelAttribute("ShoppingCart") ShoppingCart shoppingCart, SessionStatus sessionStatus) {
//Spring V4
//you can modify session status by sessionStatus.setComplete();
}
oder Sie können Modell zur gesamten Controller-Klasse hinzufügen, wie z.
@Controller
@SessionAttributes("ShoppingCart")
@RequestMapping("/req")
public class MYController {
@ModelAttribute("ShoppingCart")
public Visitor getShopCart (....) {
return new ShoppingCart(....); //get From DB Or Session
}
}
Jeder hat Vor- und Nachteile:
@session verwendet möglicherweise mehr Speicher in Cloud-Systemen, kopiert die Sitzung auf alle Knoten, und die direkte Methode (1 und 5) hat einen chaotischen Ansatz. Ein Unit-Test ist nicht sinnvoll.
So greifen Sie auf die Sitzung jsp zu
<%=session.getAttribute("ShoppingCart.prop")%>
in Jstl:
<c:out value="${sessionScope.ShoppingCart.prop}"/>
in Thymeleaf:
<p th:text="${session.ShoppingCart.prop}" th:unless="${session == null}"> . </p>
User
Bean funktioniert nur, wenn Sie die Bean in einer Klasse aufrufen, für die ebenfalls einsession
Gültigkeitsbereich besteht. Wenn sonst keine Sitzung vorhanden ist, wird eine Ausnahme ausgelöst, da im Kontext @runtime keine aktive Sitzung vorhanden ist, wenn dieuser
Bean in eine andere Klasse injiziert wird !!Verwenden
@SessionAttributes
Weitere Informationen finden Sie in den Dokumenten: Verwenden von @SessionAttributes zum Speichern von Modellattributen in der HTTP-Sitzung zwischen Anforderungen
" Grundlegendes zu Spring MVC-Modell und Sitzungsattributen " bietet auch einen sehr guten Überblick über Spring MVC-Sitzungen und erklärt, wie / wann
@ModelAttribute
s in die Sitzung übertragen werden (wenn der Controller mit@SessionAttributes
Anmerkungen versehen ist).In diesem Artikel wird auch erläutert, dass es besser ist,
@SessionAttributes
das Modell zu verwenden, als Attribute direkt in der HttpSession festzulegen, da dies Spring MVC dabei hilft, ansichtsunabhängig zu sein.quelle
SessionAttribute
Annotation ist am einfachsten und unkompliziertesten, anstatt eine Sitzung vom Anforderungsobjekt und vom Einstellungsattribut abzurufen. Jedes Objekt kann dem Modell in der Steuerung hinzugefügt werden und wird in der Sitzung gespeichert, wenn sein Name mit dem Argument in der@SessionAttributes
Anmerkung übereinstimmt . Im Folgenden wird zBpersonObj
in der Sitzung verfügbar sein.quelle
Der unten angegebene kommentierte Code würde "Wert" auf "Name" setzen.
Um in JSP darauf zuzugreifen, verwenden Sie
${sessionScope.name}
.Für den
@ModelAttribute
siehe diesen Linkquelle
Ist es nicht so einfach und am kürzesten ? Ich wusste es und habe es einfach getestet - hier funktioniert es perfekt:
ps Ich bin hierher gekommen, um nach einer Antwort auf " Verwendung von Sitzungsattributen in Spring-mvc " zu suchen , habe aber so viele gelesen, ohne das offensichtlichste zu sehen, das ich in meinen Code geschrieben hatte. Ich habe es nicht gesehen, also dachte ich, es sei falsch, aber nein, das war es nicht. Teilen wir dieses Wissen mit der einfachsten Lösung für die Hauptfrage.
quelle
Versuche dies...
quelle
Beim Versuch, mich anzumelden (was ein Bootstrap-Modal ist), habe ich die Annotation @sessionattributes verwendet. Das Problem war jedoch, dass es sich bei der Ansicht um eine Umleitung handelt ("Weiterleitung: / home"). Die Werte, die ich in die Sitzung eingegeben habe, werden in der URL angezeigt. Einige Internetquellen schlagen vor, http://docs.spring.io/spring/docs/4.3.x/spring-framework-reference/htmlsingle/#mvc-redirecting zu folgen. Stattdessen habe ich die HttpSession verwendet. Diese Sitzung wird so lange stattfinden, bis Sie die Browser schließen. Hier ist ein Beispielcode
Sie ändern nichts auf der Ansichtsseite.
Fügen Sie nach der Anmeldung die oben genannten Codes an einer beliebigen Stelle auf Ihrer Website hinzu. Wenn die Sitzung korrekt eingestellt ist, werden dort die Werte angezeigt. Stellen Sie sicher , dass Sie die jstl Tags und El- Ausdrücke korrekt hinzugefügt (Hier Link zum Set jstl Tags https://menukablog.wordpress.com/2016/05/10/add-jstl-tab-library-to-you-project- richtig / )
quelle
Verwendung Diese Methode ist sehr einfach und benutzerfreundlich
in jsp einmal verwenden, dann entfernen
quelle
Im Frühjahr 4 Web MVC. Sie können
@SessionAttribute
in der Methode mit@SessionAttributes
in Controller-Ebene verwendenquelle