Pourriez-vous m'aider à écrire l'analogue de ce code dans le style de spring mvc ?
session.setAttribute("name","value");
Et comment ajouter un élément qui est annoté par @ModelAttribute
à la session et ensuite y avoir accès ?
Pourriez-vous m'aider à écrire l'analogue de ce code dans le style de spring mvc ?
session.setAttribute("name","value");
Et comment ajouter un élément qui est annoté par @ModelAttribute
à la session et ensuite y avoir accès ?
Si vous voulez supprimer l'objet après chaque réponse, vous n'avez pas besoin de session,
Si vous voulez conserver l'objet pendant la session de l'utilisateur, Il y a quelques moyens :
ajouter directement un attribut à la 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 du contrôleur comme ceci :
ShoppingCart cart = (ShoppingCart)session.getAttribute("cart");
Rendre la session de votre contrôleur scopée
@Controller
@Scope("session")
Scope les objets, par exemple vous avez un objet utilisateur qui doit être en session à chaque fois :
@Component
@Scope("session")
public class User
{
String user;
/* setter getter*/
}
puis injecter la classe dans chaque contrôleur que vous voulez
@Autowired
private User user
qui maintient la classe en session.
L'injection de proxy AOP : dans spring -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>
puis injecter la classe dans chaque contrôleur que vous voulez
@Autowired
private User user
Passer HttpSession à la méthode :
String index(HttpSession session) {
session.setAttribute("mySessionAttribute", "someValue");
return "index";
}
6.faire ModelAttribute dans la 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 des avantages et des inconvénients :
@session peut utiliser plus de mémoire dans les systèmes en nuage, il copie la session sur tous les nœuds, et la méthode directe (1 et 5) a une approche désordonnée, elle n'est pas bonne pour le test unitaire.
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>
Utilice @SessionAttributes
Voir les docs : Utilisation de @SessionAttributes pour stocker les attributs du modèle dans la session HTTP entre les requêtes
" Comprendre les attributs de modèle et de session de Spring MVC "donne également un très bon aperçu des sessions Spring MVC et explique comment/quand @ModelAttribute
sont transférées 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 les attributs directement sur la session Http, car cela permet à Spring MVC d'être agnostique vis-à-vis de la vue.
SessionAttribute
est la plus simple et la plus directe au lieu de récupérer la session à partir de l'objet de la demande et de définir l'attribut. N'importe quel objet peut être ajouté au modèle dans le contrôleur et il sera stocké dans la session si son nom correspond à l'argument dans le champ @SessionAttributes
annotation. Dans l'exemple ci-dessous, personObj
sera disponible en séance.
@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 définit la valeur "value" comme "name".
@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 chose en JSP, utilisez ${sessionScope.name}
.
Pour le @ModelAttribute
voir ceci lien
N'est-ce pas plus facile et le plus court de cette façon ? Je le savais et je viens de le tester - ça marche parfaitement ici :
@GetMapping
public String hello(HttpSession session) {
session.setAttribute("name","value");
return "hello";
}
p.s. Je suis venu ici pour chercher une réponse à la question " Comment utiliser les attributs de session dans Spring-mvc ? ", mais j'en ai lu tellement sans voir la plus évidente que j'avais écrite dans mon code. Je ne l'ai pas vu, donc j'ai pensé que c'était faux, mais non, ça ne l'était pas. Alors partageons cette connaissance avec la solution la plus simple pour la question principale.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.