【SpringMVC笔记】3、处理模型数据及ModelAttribute等注解的使用

1.处理模型数据
如果跳转时需要带数据:V、M,则可以使用以下方式:
ModelAndView、ModelMap  、Map、Model   -数据放在了request作用域 

@RequestMapping(value="testModelAndView")
		public ModelAndView testModelAndView() {//ModelAndView:既有数据,又有视图
			//ModelAndView:Model -M     View-V
			ModelAndView mv = new ModelAndView("success");//view:  views/success.jsp 
			
			Student student = new Student() ;
			student.setId(2);
			student.setName("zs");
			
			mv.addObject("student", student);//相当于request.setAttribute("student", student);
			return mv;
		}
		
		@RequestMapping(value="testModelMap")
		public String testModelMap(ModelMap mm) {//success
			
			Student student = new Student() ;
			student.setId(2);
			student.setName("zs");
			
			mm.put("student2", student);//request域
			
			return "success";  //view
		}
		
		@RequestMapping(value="testMap")
		public String testMap(Map<String,Object> m) {
			
			Student student = new Student() ;
			student.setId(2);
			student.setName("zs");
			m.put("student3", student);//request域
			
			return "success";
		}
		
		@RequestMapping(value="testModel")
		public String testModel(Model model) {
			
			Student student = new Student() ;
			student.setId(2);
			student.setName("zs");
			model.addAttribute("student4",student);//request域
			return "success";
		}

@SessionAttributes、@ModelAttribute

示例:
public String testModel(Model model|Map<String,Object> m) {

m.put(x,".."); 就会将x对象 放入request域中


如何将上述数据放入session中?@SessionAttributes(..)

@SessionAttributes(value="student4")  //如果要在request中存放student4对象,则同时将该对象 放入session域中
@SessionAttributes(types= {Student.class,Address.class})  //如果要在request中存放Student类型的对象,则同时将该类型对象 放入session域中

@ModelAttribute 
i.经常在更新时使用
ii.在不改变原有代码的基础之上,插入一个新方法。通过@ModelAttribute修饰的方法 ,会在每次请求前先执行;
并且该方法的参数map.put()可以将 对象 放入 即将查询的参数中;
必须满足的约定:
map.put(k,v) 其中的k必须是即将查询的方法参数类型,首字母小写
           testModelAttribute(Student xxx)  ,即student;
如果不一致,需要通过@ModelAttribute声明。如下:

		@ModelAttribute//在任何一次请求前,都会先执行@ModelAttribute修饰的方法
		//@ModelAttribute  在请求 该类的各个方法前 均被执行的设计是基于一个思想:一个控制器 只做一个功能
		public void queryStudentById(Map<String,Object> map) {
			//StuentService stuService = new StudentServiceImpl();
			//Student student = stuService.queryStudentById(31);
			//模拟调用三层查询数据库的操作
			Student student = new Student();
			student.setId(31);
			student.setName("zs");
			student.setAge(23);
//			map.put("student", student) ;//约定:map的key 就是方法参数 类型的首字母小写
			map.put("stu", student) ;//约定:map的key 就是方法参数 类型的首字母小写
		}
		
		//修改:Zs-ls
		@RequestMapping(value="testModelAttribute")
		public String testModelAttribute(@ModelAttribute("stu")Student student) {
			//student.setName(student.getName());//将名字修改为ls,name和前端id值“name”一致,自动set
			System.out.println(student.getId()+","+student.getName()+","+student.getAge());
			return "success";
		}

一个Servlet 对应一个功能:
增删改查  对应于 4个Servlet

@ModelAttribute会在 该类的每个方法执行前 均被执行一次,因为使用时需要注意。设计是基于一个思想:一个控制器只做一个功能。

猜你喜欢

转载自blog.csdn.net/kuaileky/article/details/89679795