Spring @SessionAttributes注解 @ModelAttribute注解

一、@SessionAttribute详解

如果多个请求之间需要共享数据,就可以使用@SessionAttribute。

 

配置的方法:

在控制器类上标注@SessionAttribute。

配置需要共享的数据范围。

这样,就可以将model中的属性同步到session中了。

 

注意:

默认情况,SpringMVC会将model的数据存放在request域中。

此时,当一个请求结束之后,数据将会失效

因此,当数据需要跨页面使用时,就需要将数据存放到session中。

@SessionAttributes就是将指定的model中的数据拷贝到session中。

 

使用方法:

@SessionAttribute中,

value指定需要放入会话的属性名称

type指定需要放入会话的属性类型

@SessionAttributes(types=User.class)会将model中所有类型为 User的属性添加到会话中。

@SessionAttributes(value={“user1”, “user2”}) 会将model中属性名为user1和user2的属性添加到会话中。

@SessionAttributes(types={User.class, Dept.class}) 会将model中所有类型为 User和Dept的属性添加到会话中。

@SessionAttributes(value={“user1”,“user2”},types={Dept.class})会将model中属性名为user1和user2以及类型为Dept的属性添加到会话中。

@SessionAttributes(value={"user"})
@Controller
public class UserController {

    @RequestMapping("/testSessionAttributes")
    public String testSessionAttributes(Model model){
        User user = new User("jack","123456");
        model.addAttribute("user", user);
        return "success";
    }
} 

 

在前端取值: 

${requestScope.user}

${sessionScope.user}

 

二、@ModelAttribute详解

主要的作用:

将数据添加到model对象中,用于视图页面展示的时候使用。

@ModelAttribute注解的方法,在controller中每个处理方法被调用之前,都会按照先后顺序被执行一次。

因此,当一个controller映射多个URL,使用该注解需要谨慎。

 

注解使用情形:

(1)  @ModelAttribute 注释没有返回值的方法:
@Controller
@RequestMapping(value="/")
public class TestModelAttributeController {
	
	@RequestMapping(value="/result")
	public String login(Model model) {
		//如果测试成功,控制台输出true
		System.out.println(model.containsAttribute("username"));
	    System.out.println(model.containsAttribute("pwd"));
		return "result"; 
	}
	@ModelAttribute
	public void user(
			@RequestParam("username") String username,
			@RequestParam("pwd") String pwd,Model model) {
		 model.addAttribute("username", username);
		 model.addAttribute("pwd", pwd);
	}
}  

在@RequestMapping注解的方法被调用时,在这个方法之前,@ModelAttribute方法将会先被执行。

model.addAttribue("key",value)绑定键值。

上面这种情况,当URL或者post没有传递参数时,会报错。

 

(2) @ModelAttribute 注释返回具体类的方法
@ModelAttribute
public User userModel(@RequestParam("username") String username,@RequestParam("pwd") String pwd){
    User  user = new User(username,pwd);
    return user;
}

这里,model属性的名称没有指定。

由返回类型隐含表示。

属性名称是user。

 

(3)@ModelAttribute(value="")注释返回具体类的方法
@Controller
@RequestMapping(value="/")
public class TestModelAttributeController{
	
	@RequestMapping(value="result")
	public String login(Model model) {
		model.containsAttribute("username");
		return "result";
	}
    /*
    * 返回的是username的值
    *相当于model.addAttribute("username", username);
    */
	@ModelAttribute(value="username")
	public String userModel(@RequestParam("username") String username) {
		return username;
	}
}

  

(4)@ModelAttribute和@RequestMapping同时注释一个方法
@Controller
@RequestMapping(value="/")
public class TestModelAttributeController{
	
	@ModelAttribute("username")
	@RequestMapping(value="/result")
	public String login(@RequestParam("username") String username,Model model) {
		
		System.out.println(model.containsAttribute("username"));
		return username;	
	}
}

@ModelAttribute(“xxx”)的属性值作为model的attributeName,login方法返回值作为attributeName的属性值;

RequestMapping("/yyy")作为请求路径,也同时作为视图名,即跳转页面的名称

posted on 2019-08-23 11:32  青柠锦鲤  阅读(804)  评论(0编辑  收藏  举报