SpringMVC作用域操作详解

SpringMVC作用域操作总结

SpringMVC中提供的作用域操作非常多样,这里总结了8种

ModelMap

作用:代替Request作用域,数据存入ModelMap,数据就会自动放入Request作用域
获得ModelMap:直接在方法参数声明ModelMap类型的参数mm即可
存入方法 :mm.addAttribute(“name”,要存放的数据);
JSP页面获取:直接用el表达式获得即可${requestScope.name}

以上是操作Request作用域,而如果将数据存入session作用域,只需在控制器类上添加@SessionAttribute({“modelmap数据的name”})就行了。该注解的作用:将对应modelmap中的数据自动copy到Session作用域中
SpringMVC作用域操作详解_第1张图片

Model

该类操作作用域的方式使用上和上一种ModelMap可以说是完全一样,这里就不做赘述了

ModelAndView

作用:model的作用+跳转路径的作用
获得:参数声明ModelAndView mav
向Request作用域中存值
mav.addObject(“作用域数据的name”,值);
设置跳转路径
mav.setViewName(“跳转方式:/目标资源的url-pattern”);
使用

public ModelAndView xxx(ModelAndView mav){
	//1.向Request作用域中存入一个数据
	mav.addObject("name",值);
	//2.跳转到xxx.jsp
	mav.setViewName("跳转方式:/目标资源的url-pattern");
	return mav;
}

该方法操作session的方法也和ModelMap一样

Map

就是java.util包下的map集合
向Request作用域中存值map.put(“name”,值);
而对session作用域的操作也和ModelMap一样

以上4种方法只提供了向作用域中存入值的方法,却没有提供如何在其他控制器类中从作用域中将存入其中的值取出来,而我在网上搜了一下只发现了一种方式,就是在控制器方法声明中用@ModelAttribute(“存入作用域中取得name”),如下代码,就会直接从session作用域中将user对象取出赋值给参数,当然取值也不能少了@SessionAttributes(“user”)注解:

@SessionAttributes("user")
public class MyController {

	@Autowired
	private TriageService ts;

	@RequestMapping("/add")
	public String add(@ModelAttribute("user")User user) {
		
	}
}

除了上述的几种方法外,SpringMVC还提供支持servlet相关的对象可以使用HttpServletRequest,HttpServletResponse,HttpSession等servlet相关的类进行作用域操作

1.在控制器方法参数中声明servlet相关的类

SpringMVC作用域操作详解_第2张图片

2.允许直接从spring工厂中获得,就是使用属性注入的方式

SpringMVC作用域操作详解_第3张图片
原理
从spring工厂中,获得的所有为的HttpSession HttpServletRequest,其实是spring提供的代 理对象。 通过在代理对象方法内部,获得真正的session和request,调用对应的方法。

RequestContextHolder,可以获得servlet相关的类来间接操纵作用域,也可以直接进行作用域操作。所有可以总结为两种

RequestAttributes attris = RequestContextHolder.getRequestAttributes(); // RequestAttributes作用:可以获得httpServletReq HttpServletResp对象。
 ServletRequestAttributes attrs = (ServletRequestAttributes) attributes; 
 attrs.getRequest();//获得request对象。
  attrs.getResponse();//获得response对象。
 
//RequestAttributes作用:可以操作request和session作用域 
attrs.setAttribute("user1", "哈哈哈", RequestAttributes.SCOPE_SESSION);;//将数据 存入session作用域 
attrs.setAttribute("user1", "哈哈哈", RequestAttributes.SCOPE_REQUEST);//将数据 存入request作用域
 
attrs.getAttribute("name",RequestAttributes.SCOPE_SESSION);//从session作用域中获 得name对应的数据。

你可能感兴趣的:(SpringMVC)