Spring 3.0设置并获取会话属性
我想从会话范围中读取域对象(UserVO)。
我在名为WelcomeController的控制器中设置UserVO
@Controller @RequestMapping("/welcome.htm") public class WelcomeController { @RequestMapping(method = RequestMethod.POST) public String processSubmit(BindingResult result, SessionStatus status,HttpSession session){ User user = loginService.loginUser(loginCredentials); session.setAttribute("user", user); return "loginSuccess"; } }
我能够在jsp页面中使用该对象
${user.userDetails.firstName}
但是我无法从另一个Controller读取值,
我试图读取会话属性如下:
@Controller public class InspectionTypeController { @RequestMapping(value="/addInspectionType.htm", method = RequestMethod.POST ) public String addInspectionType(InspectionType inspectionType, HttpSession session) { User user = (User) session.getAttribute("user"); System.out.println("User: "+ user.getUserDetails().getFirstName); } }
您显示的代码应该有效 – HttpSession
在控制器之间共享,并且您使用相同的属性名称。 因此,你没有向我们展示其他的错误。
但是,无论它是否有效,Spring都提供了一种更优雅的方法,使用@SessionAttribute
注释将模型对象保留在会话中(请参阅文档 )。
例如(我没有测试过这个,但它给你的想法):
@Controller @RequestMapping("/welcome.htm") @SessionAttributes({"user"}) public class WelcomeController { @RequestMapping(method = RequestMethod.POST) public String processSubmit(ModelMap modelMap){ User user = loginService.loginUser(loginCredentials); modelMap.addtAttribute(user); return "loginSuccess"; } }
接着
@Controller @SessionAttributes({"user"}) public class InspectionTypeController { @RequestMapping(value="/addInspectionType.htm", method = RequestMethod.POST ) public void addInspectionType(InspectionType inspectionType, @ModelAttribute User user) { System.out.println("User: "+ user.getUserDetails().getFirstName); } }
但是,如果您的原始代码不起作用,那么这也不起作用,因为您的会话出现了其他问题。
@SessionAttributes仅在特定处理程序的上下文中起作用,因此WelcomeController中的属性集仅在此控制器中可见。
使用父类inheritance所有控制器并在那里使用SessionAttributes。 只是这个类应该在mvc的包扫描中。
可能是您没有将UserVO设置为Serializable。