在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”必须要包含一个大写字母,经我试验,完全没有必要啊!

努力努力再努力!

时间: 2024-10-26 07:34:38

在SpringMVC中使用@SessionAttributes和@ModelAttribute将数据存储在session域中的相关文章

Android应用之——不要将数据存储在Application类中

前言:最近在开发中发现了一个比较严重的问题,当我们将应用按home键放入后台运行,一段时间后,当我们再次打开应用的时候,十有八九会出现一个NullPointException的空指针异常,根据logcat的日志,就会定位到一个去全局性到变量去,这是什么原因呢?原来,是因为我们我们将很多数据放入了application中作为全局变量,导致了问题的产生,下面来说下为什么不能将数据放在application中. 一.application类的简介 Application和Activity,Servic

把ArrayList集合的字符串存储到文本文件/把文本文件的数据存储到ArrayList集合中

把ArrayList集合的字符串存储到文本文件 分析: 1.ArrayList集合存储的是字符串 2.遍历ArrayList,获取数据 3.把数据存储到文本文件 4.由文本文件可知要用字符流 代码 package cn.idcast4; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; public class Day1

单片机中C语言的程序与数据存储

单片机中C语言的程序与数据存储 一.五大内存分区: 内存分成5个区,它们分别是堆.栈.自由存储区.全局/静态存储区和常量存储区. 1.栈区(stack):FIFO就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区.里面的变量通常是局部变量.函数参数等. 2.堆区(heap):就是那些由new分配的内存块,它们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete.如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收. 3.自由存储区:就是那些

Android中Activity执行restart过程中涉及到的四种数据存储恢复的方法

我们知道,当Configuration Change发生的时候(比如横竖屏切换等),会导致Activity重启,即先destroy,然后会restart,一般情况下restart的时间比较短,为了保证一致的用户体验,我们应该在Activity重启前将一些数据存储下来,然后在restart的时候重新根据这些数据更新UI.当然你可能想将这些数据写到物理文件或数据库中,但是这样有缺点,因为IO操作时耗时操作,会影响restart的过程,甚至导致ANR程序无响应,本文将介绍几种将数据缓存在内存中以便re

iOS -- 图片浏览器3(将数据存储到plist文件中)

// 将数据存入plist文件中#define IconKey @"icon"#define DescKey @"desc"#import "ViewController.h"@interface ViewController ()- (IBAction)previous;- (IBAction)next;@property (weak, nonatomic) IBOutlet UIButton *previousBtn;@property (w

Excel中判断一个表中的某一列的数据在另一列中是否存在

  A B C D 1 10   3 有 2 6   e 无 3 3   6 有 判断c列的值在A列中是否存在(假定C列为需要判断列,A列为目标列) 在D1中输入以下公式,然后下拉公式即可 =IF(COUNTIF(A:A,C1)>0,"有","无") =IF(COUNTIF(目标列,判断列首个单元格)>0,"是","否")

K3中添加的一条新数据,其在数据库中的位置

最近研究将K3系统与生产管理系统结合起来,减少工作量,但如何确定其各自后台数据库的构成,其对应数据各自位于那张表内,总结了一下: 1.从百度搜索,查看表结构,然后找到目标表    另:K3数据库中单独有一个表记录有数据库中全部的表及其与功能的对应关系 2.查看数据库日志记录,新插入一条记录,分析那些表发生了变化,感觉这种方法更观察的更全面        另:如何确定K3数据库的名称,从[账套管理]中查看

更新数据前jquery如何填充数据到表单域中

$("#p_city option[value='${project.city}']").attr("selected","selected"); $("#p_projectType option[value='${project.projectType}']").attr("selected","selected"); $("#p_voltageLevels option[v

C语言中链表任意位置怎么插入数据?然后写入文件中?

链表插入示意图:(图是个人所画)因为链表指针指来指去,难以理解,所以辅助画图更加方便. 定义的结构体: struct student { char ID[11]; //学生学号 char name[20]; //学生姓名 struct student *next; //next 指针 指向 struct student 类型的变量 }stu; 看我写的代码,代码中有详细解释: /*************** 函数功能: 插入出勤学生 返回:指向链表表头的指针 /***************/