我想从会话范围中读取域对象(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页面<h1>${user.userDetails.firstName}</h1>
但是我无法从另一个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);
}
}
答案 0 :(得分:40)
您显示的代码应该工作 - HttpSession
在控制器之间共享,并且您使用相同的属性名称。因此,你没有向我们展示其他东西。
但是,无论它是否有效,Spring都会使用@SessionAttribute
注释(见docs)提供一种更优雅的方法来保持模型对象在会话中的使用。
例如(我没有测试过这个,但它给你的想法):
@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);
}
}
但是,如果您的原始代码不起作用,那么这也不起作用,因为您的会话出现了其他问题。
答案 1 :(得分:6)
@SessionAttributes仅在特定处理程序的上下文中起作用,因此WelcomeController中的属性集仅在此控制器中可见。
答案 2 :(得分:2)
使用父类继承所有控制器并在那里使用SessionAttributes。只是这个类应该在mvc的包扫描中。
答案 3 :(得分:0)
您可能没有将UserVO设置为Serializable。