Comment utiliser les attributs Session au printemps-mvc
9 réponses
si vous voulez supprimer un objet après chaque réponse pas besoin de session,
si vous voulez garder l'objet pendant la session de l'utilisateur , Il y a plusieurs façons:
-
ajouter directement un attribut à session:
@RequestMapping(method = RequestMethod.GET) public String testMestod(HttpServletRequest request){ ShoppingCart cart = (ShoppingCart)request.getSession().setAttribute("cart",value); return "testJsp"; }
et vous pouvez l'obtenir bof contrôleur comme ceci :
ShoppingCart cart = (ShoppingCart)session.getAttribute("cart");
-
Faire de votre contrôleur de session étendue
@Controller @Scope("session")
-
Scope les objets, par exemple vous avez un objet utilisateur qui veut être en session à chaque fois:
@Component @Scope("session") public class User { String user; /* setter getter*/ }
puis injectez la classe dans chaque contrôleur que vous voulez
@Autowired private User user
qui garde la classe en session.
-
L'AOP proxy injection : au printemps-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>
injecter ensuite la classe dans chaque contrôleur qui vous voulez
@Autowired private User user
5.Passer la session à la méthode:
String index(HttpSession session) {
session.setAttribute("mySessionAttribute", "someValue");
return "index";
}
6.Faites ModelAttribute en session par @SessionAttributes ("ShoppingCart"):
public String index (@ModelAttribute("ShoppingCart") ShoppingCart shoppingCart, SessionStatus sessionStatus) {
//Spring V4
//you can modify session status by sessionStatus.setComplete();
}
ou vous pouvez ajouter le modèle à la classe entière du contrôleur comme
@Controller
@SessionAttributes("ShoppingCart")
@RequestMapping("/req")
public class MYController {
@ModelAttribute("ShoppingCart")
public Visitor getShopCart (....) {
return new ShoppingCart(....); //get From DB Or Session
}
}
chacun a un avantage et un inconvénient:
@session peut utiliser plus de mémoire dans les systèmes de nuages il copie session à tous les noeuds, et la méthode directe (1 et 5) a une approche désordonnée, il n'est pas bon de tester à l'unité.
pour accéder à la session jsp
<%=session.getAttribute("ShoppingCart.prop")%>
dans Jstl :
<c:out value="${sessionScope.ShoppingCart.prop}"/>
dans Thymeleaf:
<p th:text="${session.ShoppingCart.prop}" th:unless="${session == null}"> . </p>
Utiliser @SessionAttributes
voir les docs: utiliser @SessionAttributes pour stocker les attributs du modèle dans la session HTTP entre les requêtes
" comprendre les attributs du modèle et de la Session MVC du ressort "donne également un très bon aperçu des sessions MVC du ressort et explique comment/quand @ModelAttribute
s sont transférés dans la session (si le contrôleur est @SessionAttributes
annoté).
Cet article explique également qu'il est préférable d'utiliser @SessionAttributes
sur le modèle au lieu de définir des attributs directement sur la session HTTPS, car cela aide MVC à être vue-agnostique.
SessionAttribute
l'annotation est la plus simple et la plus simple au lieu d'obtenir la session à partir de l'objet de la requête et de l'attribut de réglage.
N'importe quel objet peut être ajouté au model dans le controller et il sera stocké en session si son nom correspond à l'argument dans l'annotation @SessionAttributes
.
Ci-dessous, par exemple, personObj
sera disponible en session.
@Controller
@SessionAttributes("personObj")
public class PersonController {
@RequestMapping(value="/person-form")
public ModelAndView personPage() {
return new ModelAndView("person-page", "person-entity", new Person());
}
@RequestMapping(value="/process-person")
public ModelAndView processPerson(@ModelAttribute Person person) {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("person-result-page");
modelAndView.addObject("pers", person);
modelAndView.addObject("personObj", person);
return modelAndView;
}
}
le code annoté ci-dessous indiquerait "valeur" à" nom
@RequestMapping("/testing")
@Controller
public class TestController {
@RequestMapping(method = RequestMethod.GET)
public String testMestod(HttpServletRequest request){
request.getSession().setAttribute("name", "value");
return "testJsp";
}
}
pour accéder à la même dans L'utilisation JSP
${sessionScope.name}
.
pour le @ModelAttribute
voir ce link
N'est-ce pas plus facile et le plus court de cette façon? Je le savais et je l'ai juste testé-travailler parfait ici:
@GetMapping
public String hello(HttpSession session) {
session.setAttribute("name","value");
return "hello";
}
p. S. je suis venu ici à la recherche d'une réponse de " comment utiliser les attributs de Session au printemps-mvc ", mais j'en ai lu tellement sans voir le plus évident que j'avais écrit dans mon code. Je ne l'ai pas vu, alors j'ai pensé que c'était mal, mais non. Donc permet de partager ce que l' connaissance avec la solution la plus facile pour la question principale.
essayez ceci...
@Controller
@RequestMapping("/owners/{ownerId}/pets/{petId}/edit")
@SessionAttributes("pet")
public class EditPetForm {
@ModelAttribute("types")
public Collection<PetType> populatePetTypes() {
return this.clinic.getPetTypes();
}
@RequestMapping(method = RequestMethod.POST)
public String processSubmit(@ModelAttribute("pet") Pet pet,
BindingResult result, SessionStatus status) {
new PetValidator().validate(pet, result);
if (result.hasErrors()) {
return "petForm";
}else {
this.clinic.storePet(pet);
status.setComplete();
return "redirect:owner.do?ownerId="
+ pet.getOwner().getId();
}
}
}
quand j'ai essayé mon login (qui est un modal bootstrap), j'ai utilisé l'annotation @sessionattributes. Mais le problème était quand la vue est une redirection ("redirect:/home"), les valeurs que j'ai entrées aux expositions de session dans l'url. Certaines sources Internet suggèrent de suivre http://docs.spring.io/spring/docs/4.3.x/spring-framework-reference/htmlsingle/#mvc-redirecting mais j'ai utilisé le HttpSession à la place. Cette session sera là jusqu'à ce que vous fermez le navigateur. Voici un exemple de code
@RequestMapping(value = "/login")
@ResponseBody
public BooleanResponse login(HttpSession session,HttpServletRequest request){
//HttpServletRequest used to take data to the controller
String username = request.getParameter("username");
String password = request.getParameter("password");
//Here you set your values to the session
session.setAttribute("username", username);
session.setAttribute("email", email);
//your code goes here
}
on ne change rien de précis du côté de la vue.
<c:out value="${username}"></c:out>
<c:out value="${email}"></c:out>
après l'ouverture de session, ajoutez les codes ci-dessus à n'importe quel endroit de votre site web. Si la session est correctement définie, vous verrez les valeurs qui s'y trouvent. Assurez - vous que vous avez correctement ajouté les balises jstl et El-expressions (voici le lien pour définir les balises jstl ) https://menukablog.wordpress.com/2016/05/10/add-jstl-tab-library-to-you-project-correctly / )
utiliser cette méthode très simple facile à utiliser
HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getNativeRequest();
request.getSession().setAttribute("errorMsg", "your massage");
dans jsp une fois utiliser, puis supprimer
<c:remove var="errorMsg" scope="session"/>
in Spring 4 Web MVC. Vous pouvez utiliser @SessionAttribute
dans la méthode avec @SessionAttributes
dans le niveau de contrôleur
@Controller
@SessionAttributes("SessionKey")
public class OrderController extends BaseController {
GetMapping("/showOrder")
public String showPage(@SessionAttribute("SessionKey") SearchCriteria searchCriteria) {
// method body
}