如何在Spring-mvc中使用会话属性
你能帮我写这个代码的springmvc风格的模拟?
session.setAttribute("name","value");
以及如何将由@ModelAttribute
注释注释的元素添加到会话中,然后访问它?
如果要在每个响应之后删除对象,则不需要进行会话,
如果你想在用户会话期间保持对象,它有一些方法:
-
直接向会话添加一个属性:
@RequestMapping(method = RequestMethod.GET) public String testMestod(HttpServletRequest request){ ShoppingCart cart = (ShoppingCart)request.getSession().setAttribute("cart",value); return "testJsp"; }
你可以像这样从控制器中获得它:
ShoppingCart cart = (ShoppingCart)session.getAttribute("cart");
-
使您的控制器会话范围
@Controller @Scope("session")
-
范围的对象,例如你有每次想要在会话中的用户对象:
@Component @Scope("session") public class User { String user; /* setter getter*/ }
然后在每个你想要的控制器中注入类
@Autowired private User user
保持上课的课程。
-
AOP代理注入:在春季-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>
然后在每个你想要的控制器中注入类
@Autowired private User user
5.通过HttpSession方法:
String index(HttpSession session) { session.setAttribute("mySessionAttribute", "someValue"); return "index"; }
6.在会话中build立ModelAttribute通过@SessionAttributes(“ShoppingCart”):
public String index (@ModelAttribute("ShoppingCart") ShoppingCart shoppingCart, SessionStatus sessionStatus) { //Spring V4 //you can modify session status by sessionStatus.setComplete(); }
或者你可以添加模型到整个控制器类
@Controller @SessionAttributes("ShoppingCart") @RequestMapping("/req") public class MYController { @ModelAttribute("ShoppingCart") public Visitor getShopCart (....) { return new ShoppingCart(....); //get From DB Or Session } }
每个人都有优势和劣势:
在云系统中可能会使用更多的内存将会话复制到所有节点,直接方法(1和5)具有凌乱的方法,unit testing并不好。
访问会话jsp
<%=session.getAttribute("ShoppingCart.prop")%>
在Jstl:
<c:out value="${sessionScope.ShoppingCart.prop}"/>
在Thymeleaf:
<p th:text="${session.ShoppingCart.prop}" th:unless="${session == null}"> . </p>
使用@SessionAttributes
请参阅文档: 使用@SessionAttributes在请求之间的HTTP会话中存储模型属性
“ 了解Spring MVC模型和会话属性 ”也给出了Spring MVC会话的非常好的概述,并解释了@ModelAttribute
如何被转移到会话中(如果控制器是@SessionAttributes
注释的)。
该文章还解释说,最好在模型上使用@SessionAttributes
,而不是直接在HttpSession上设置属性,因为这有助于Spring MVC与视图无关。
SessionAttribute
注解是最简单直接的,而不是从请求对象和设置属性获取会话。 任何对象都可以添加到控制器中的模型中,如果名称与@SessionAttributes
注释中的参数匹配,它将存储在会话中。 在下面例如, personObj
将在会话中可用。
@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; } }
下面带注释的代码会将“value”设置为“name”
@RequestMapping("/testing") @Controller public class TestController { @RequestMapping(method = RequestMethod.GET) public String testMestod(HttpServletRequest request){ request.getSession().setAttribute("name", "value"); return "testJsp"; } }
要在JSP中访问相同的文件,使用${sessionScope.name}
。
对于@ModelAttribute
请参阅此链接
当我尝试login(这是引导模式)时,我使用@sessionattributes注释。 但问题是当视图是redirect(“redirect:/ home”),我input到会话中的值显示在url中。 一些Internet源代码build议遵循http://docs.spring.io/spring/docs/4.3.x/spring-framework-reference/htmlsingle/#mvc-redirecting但是我使用了HttpSession。; 这个会话将在那里,直到你closures浏览器。 这里是示例代码
@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 }
在视图方面你不会改变具体的东西。
<c:out value="${username}"></c:out> <c:out value="${email}"></c:out>
login后,将以上代码添加到您网站的任何地方。 如果会话正确设置,您将看到那里的值。 确保你正确地添加了jstl标签和El-expression式(这里是链接来设置jstl标签https://menukablog.wordpress.com/2016/05/10/add-jstl-tab-library-to-you-project-正确/ )
这不是最简单和最短的吗? 我知道它,只是testing它 – 在这里工作完美:
@GetMapping public String hello(HttpSession session) { session.setAttribute("name","value"); return "hello"; }
ps 我来到这里寻找“ 如何在Spring-mvc中使用会话属性 ”的答案,但读了很多,却没有看到我在代码中写的最明显的东西。 我没有看到它,所以我认为是错的,但不是。 因此,让我们分享这个知识与主要问题的最简单的解决scheme。
hi dear try this... @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(); } } }