Pourriez-vous m'aider à écrire l'analogue printanier de style mvc de ce code?
session.setAttribute("name","value");
Et comment ajouter un élément annoté par l'annotation @ModelAttribute
à la session, puis y accéder?
Si vous souhaitez supprimer un objet après chaque réponse, vous n'avez pas besoin de session,
Si vous souhaitez conserver l’objet pendant la session utilisateur, il existe différentes manières:
ajoutez 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");
Rendez votre session de contrôleur étendue
@Controller
@Scope("session")
Portée des 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 garde la classe en session.
L'injection de proxy AOP: 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>
puis injecter la classe dans chaque contrôleur que vous voulez
@Autowired
private User user
5.Passe HttpSession à la méthode:
String index(HttpSession session) {
session.setAttribute("mySessionAttribute", "someValue");
return "index";
}
6.Make 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 un modèle à toute la classe de 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 en nuage, il copie la session sur tous les nœuds, et la méthode directe (1 et 5) a une approche compliquée, il n'est pas bon de faire des tests unitaires.
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>
Utilisez @SessionAttributes
Voir la documentation: tilisation de @SessionAttributes pour stocker les attributs de modèle dans la session HTTP entre les demandes
" Comprendre le modèle et les attributs de session Spring MVC " donne également un très bon aperçu des sessions Spring MVC 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 plutôt que de définir des attributs directement sur HttpSession, car cela permet à Spring MVC d'être indépendant de la vue.
L'annotation SessionAttribute
est la plus simple et la plus directe au lieu d'obtenir une session à partir d'un objet de requête et d'un attribut de paramètre. Tout 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 l'annotation @SessionAttributes
. En 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 définirait "valeur" sur "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 chose dans JSP, utilisez ${sessionScope.name}
.
Pour le @ModelAttribute
voir ceci lien
Essaye ça...
@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();
}
}
}
N'est-ce pas plus simple et plus court de cette façon? Je le savais et je l'ai juste testé - ç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 de "Comment utiliser les attributs de session dans Spring-mvc", mais j'en ai lu beaucoup sans voir le plus évident dans lequel j'avais écrit mon code. Je ne l'ai pas vu, alors j'ai pensé que c'était faux, mais non, ce n'était pas le cas. Partageons donc ces connaissances avec la solution la plus simple pour la question principale.
Lorsque j'essaie de me connecter (ce qui est un modal bootstrap), j'ai utilisé l'annotation @sessionattributes. Mais le problème était lorsque la vue est une redirection ("redirect:/home"), les valeurs que j'ai entrées en session sont affichées 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 plutôt utilisé HttpSession. Cette session sera là jusqu'à la fermeture des navigateurs. 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
}
Vous ne changez pas de chose spécifique du côté de la vue.
<c:out value="${username}"></c:out>
<c:out value="${email}"></c:out>
Après la connexion, ajoutez les codes ci-dessus à n’importe quel endroit de votre site Web. Si la session est correctement définie, vous verrez les valeurs à cet endroit. Assurez-vous que vous avez correctement ajouté les balises jstl et expressions El (Le lien suivant vous permet de définir les balises jstl https://menukablog.wordpress.com/2016/05/10/add-jstl-tab-library-to- vous projetez correctement / )
Utilisez 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 enlever
<c:remove var="errorMsg" scope="session"/>
Au printemps 4 Web MVC. Vous pouvez utiliser @SessionAttribute
dans la méthode avec @SessionAttributes
dans le niveau du contrôleur.
@Controller
@SessionAttributes("SessionKey")
public class OrderController extends BaseController {
GetMapping("/showOrder")
public String showPage(@SessionAttribute("SessionKey") SearchCriteria searchCriteria) {
// method body
}