zoukankan      html  css  js  c++  java
  • 在SpringMVC中使用@SessionAttributes和@ModelAttribute将数据存储在session域中

    今天在我的springMVC项目——图书管理系统中,希望在登录时将登录的Users存在session中,开始是准备在controller中使用Servlet API中的对象,可是一直无法引用,不知道为什么,难道是要导入什么特定的包吗(如果有知道的朋友,可以的话麻烦留言告诉我下,谢谢了),然后看见网上说可以用@SessionAttributes和@ModelAttribute注释来实现,具体实现如下:

    UserController类:

    @Controller
    @SessionAttributes("userid")//①将ModelMap中属性名为"users"的属性
    //放到Session属性列表中,以便这个属性可以跨请求访问
    public class UserController {
    @Autowired
    private UserService service;
    @Autowired
    private BooksService booksService;

    public UserService getService() {
    return service;
    }
    public void setService(UserService service) {
    this.service = service;
    }
    @RequestMapping(value="register")
    public String register(String name,String password,Map<String, Object> params){
    Users users=new Users();
    users.setName(name);
    users.setPassword(password);
    users.setPoint(0);
    users.setType(0);
    users.setLevel(0);
    service.save(users,params);
    params.put("userName", name);
    if(params.get("ErrMsg")!=null){
    return "register";
    }
    return "reg_success";
    }

    @RequestMapping(value="login")
    public String login(Users users,ModelMap map){
    Users users2 = service.findUsers(users);
    if(users2==null){
    map.put("ErrMsg","输入有误,请重新输入");
    return "";
    }

    map.put("users", users2);

    map.addAttribute("userid", users2.getId()); 
    if(users2.getType()==0){
    List<Books> booksList = booksService.findAllBooks();
    map.put("booksQueryList", booksList);
    map.put("books", new Books());
    return "visitor_first";
    }else{
    return "manager_first";
    }
    }
    }

    在另一个要调用userid的BookInfoController中:

    @Controller
    @SessionAttributes("userid")
    public class BookInfoController {
    @Autowired
    private BookInfoService service;
    @Autowired
    private BooksService booksService;
    @Autowired
    private UserService userService;
    @Autowired
    private RecordsService recordsService;
    @RequestMapping(value = "bookInfos")
    public String bookInfoList(@RequestParam("bid") int bid, Map<String, Object> map) {
    List<BookInfo> bookInfos = service.findBookInfoByBid(bid);
    Books books = booksService.findBooksById(bid);
    map.put("bookInfoList", bookInfos);
    map.put("books", books);
    return "bookInfoList";
    }
    @RequestMapping(value="lendBooks")
    public String lendBooks(@RequestParam("id") int id,@ModelAttribute("userid")int uid,Map<String,Object> map){
    service.updateBookInfo(id);
    System.out.println("userId:"+uid);
    BookInfo info = service.findBookInfoById(id);
    Records records=new Records();
    Users users = userService.findUsersById(uid);
    records.setUsers(users);
    records.setInfo(info);
    records.setLendTime(new Date());
    recordsService.addRecords(records);
    map.put("Msg","借书成功");
    return "saveShow";
    }
    }

    上面这样已经试验成功,但成功之前还是走了不少弯路:

    1.开始的时候,我在@SessionAttributes中保存的是持久态的(有id值)users对象,可是在@ModelAttribute中取得的users对象的id值每取一次就自增长,其他的属性都没变,我不知道是我建表有问题还是配置文件有问题,找了半天也没有找到,有知道的朋友也麻烦留言告诉我下吧。

    2.在网上查询时看见一位朋友说@SessionAttributes(“userid”)中的“userid”必须要包含一个大写字母,经我试验,完全没有必要啊!

    努力努力再努力!

  • 相关阅读:
    c# 三元运算符 表达式赋值的时候 我老容易写错 备注下
    wpf 图片操作类 ImageBrush BitmapImage
    WPF 结合 微软的手写板 进行输入
    c# 经纬度距离计算
    c# 通用类扩展方法 备注
    Android SDK Manager无法更新的解决(转帖)
    GridControl相关设置
    SDK Manager.exe运行一闪而过
    “LC.exe”已退出 或者 设计器提示控件为声明
    建立管理员帐户
  • 原文地址:https://www.cnblogs.com/yuqiaopeng/p/6252158.html
Copyright © 2011-2022 走看看