Spring学习总结 - 注解

一、@ModelAttribute

1、@ModelAttribute注释方法

@ModelAttribute注解的方法会在该Controller类中的其他方法调用之前被调用。

1.1、@ModelAttribute注释void类型的方法

如下代码中out方法被调用之前会先调用populateModel方法,在/jsp/hello页面中可直接通过${user.uid}和${user.usernmame}获取到3和xxx。

	@ModelAttribute
	public void populateModel(User user, ModelMap model) { // 没有model也可以
		user.setUid(3);
		user.setUsername("xxx");
	}

	@RequestMapping(value = "/demo", params = "method=out")
	public String out() {
		return "/jsp/hello";
	}

1.2、@ModelAttribute注释有返回值的方法

	/**
	 * 调用该方法前会先调用具有注解(@ModelAttribute)的其他方法,在这个方法中可进行初始化等操作
	 * @return
	 */
	@RequestMapping(value = "/demo", params = "method=out")
	public String out() {
		return "/jsp/hello";
	}
	
	/**
	 * 没有指定model的属性,由返回值类型隐含表示
	 * @return
	 */
	@ModelAttribute
	public User addUser() {
		User user = new User();
		user.setUid(5);
		user.setUsername("ooo");
		return user;
	}

1.3、@ModelAttribute(value="")注释有返回值的方法

	/**
	 * 通过@ModelAttribute(value="")来指定model属性的名称,及在页面中通过${attributeName.xxx}的形式来获取值,而不是${user.xxx}
	 * @param uid
	 * @param username
	 * @return
	 */
	@ModelAttribute("attributeName")
	public User sendUser(Integer uid, String username) {
		User u = new User();
		u.setUid(uid);
		u.setUsername(username);
		return u;
	}

	/**
	 * 调用该方法前会先调用具有注解(@ModelAttribute)的其他方法,在这个方法中可进行初始化等操作
	 * 
	 * @return
	 */
	@RequestMapping(value = "/demo", params = "method=out")
	public String out() {
		return "/jsp/hello";
	}

1.4、@ModelAttribute和@RequestMapping同时注释一个方法 ,注意

attributeName和其他方法中的属性相冲突,有可能会导致异常。

	/**
	 * 方法上同时使用注解RequestMapping和ModelAttribute,相当于request中封装了key=attributeName,value=hi
	 * @return 返回值不在是名称为hi的视图,视图名称由RequestToViewNameTranslator根据请求"/hello.do"转换为逻辑视图hello.jsp。
	 */
	@RequestMapping(value = "/jsp/hello.do")
	@ModelAttribute("attributeName")
	public String helloWorld() {
		return "hi";
	}


2、@ModelAttribute注释方法的参数

2.1、从model中获取

	@ModelAttribute("user")
	public User addAccount() {
		User s = new User();
		s.setUid(132);
		s.setUsername("jz");
		return s;
	}

	/**
	 * @ModelAttribute("user") User
	 * user注释参数,user的值来源addAccount()方法,scope为request,如果标注有@SessionAttributes(
	 * "user"),则scope为session
	 * 
	 * @param user
	 * @return
	 */
	@RequestMapping(value = "/hello")
	public String helloWorld(@ModelAttribute("user") User user) {
		user.setUsername("jizhou");
		return "/jsp/hello";
	}

2.2、从form表单或者URL参数中获取

	/**
	 * 从Form表单或URL参数中获取(实际上,不做此注释也能拿到user对象) 
	 * @param user
	 * @return
	 */
	@RequestMapping(value = "/helloWorld")
	public String hel(@ModelAttribute User user) {
		return "helloWorld";
	}


二、@sessionattributes详解

在默认情况下,ModelMap 中的属性作用域是 request 级别是,也就是说,当本次请求结束后,ModelMap中的属性将销毁。如果希望在多个请求中共享 ModelMap 中的属性,必须将其属性转存到 session 中,这样ModelMap 的属性才可以被跨请求访问。

/**
 * 在controller类添加注解@SessionAttributes({"a1", "a2","a3"}),这样在整个session声明周期类可以跨请求访问ModelMap中a1,a2,a3的值
 * @author liuyunlong
 *
 */
@Controller
@SessionAttributes({"a1", "a2","a3"})
public class RegisterController extends BaseContrller {
	。。。
}


你可能感兴趣的:(注解,spring)