SpringMvc---域之间的数据共享
SpringMvc域之间的数据交换
向request域中共享数据
在使用DispatcherServlet请求控制器处理所有请求后,是通过请求转发的形式处理请求。所以能共享request域中的数据
使用原生ServletAPI实现域对象中的数据存取
在java中
在昨天学习过,当对当前方法使用注解后,为方法添加HttpServletRequest作为参数,它代表的就是当前请求。这样就能通过Servlet API往域中添加对象
@RequestMapping("testRequestByServletAPI")
public String testRequestByServletAPI(HttpServletRequest request) {
request.setAttribute("Data", "千呼万唤始出来");
return "show";
}
在html中
这里使用的是thymeleaf的语法,通过属性【th:text】让里面的参数代替p标签的文本内容在页面上输出
<p th:text="${Data}"></p>
使用ModelAndView往域对象添加数据
在使用ModelAndView处理请求和视图时,ModelAndView必须作为处理请求的方法的返回值
在使用时,先设置域中的内容,再设置视图名称,最后返回ModelAndView对象
在java中
这个存在request域中的数据名和上面的一样,但是可以通过请求映射区分
@RequestMapping("testModelAndView")
public ModelAndView testModelAndView(){
// 创建ModelAndView
ModelAndView modelAndView = new ModelAndView();
// 首先设置model,即往域对象中存放数据
modelAndView.addObject("Data","Hello,ModelAndView");
// 设置视图
modelAndView.setViewName("show");
// 返回modelAndView对象让视图解析器解析
return modelAndView;
}
使用Model、Map、ModelMap实现域中数据共享
使用Model、Map、Model实现数据共享,在使用上都是往处理请求的方法内添加他们作为形参,然后调用方法添加数据
@RequestMapping("/testModel")
public String testModel(Model model){
// 使用model的方法添加数据
model.addAttribute("Data","hello,Model");
System.out.println(model.getClass().getName());
return "show";
}
@RequestMapping("/testMap")
public String testMap(Map<String,Object> map){
map.put("Data","hello,map");
System.out.println(map.getClass().getName());
return "show";
}
@RequestMapping("/testModelMap")
public String testModelMap(ModelMap modelMap){
modelMap.addAttribute("Data","hello,ModelMap");
System.out.println(modelMap.getClass().getName());
return "show";
}
Model、Map、ModelMap的联系
在上面使用它们在进行域中的数据共享时,通过输出全类名发现他他们最终指向的类名是BindingAwareModelMap
在使用时能发现Model和Map都是接口,所以肯定是通过实现类实现的。从ModelMap入手发现它继承了LinkedHashMap【他是Map的实现类】,打开Model Map的继承或实现结构【IDEA按ctrl+H】,于是就发现了ExtendedModelMap【被继承的modelmap】,在里面发现ExtendedModelMap继承了ModelMap实现了Model接口,而且发现BindingAwareModelMap继承了ExtendedModelMap。所以说BindingAwareModelMap可以实例化ModelMap和Model还有Map,所以就是说在实际上Model、ModelMap、Map都是BindingAwareModelMap类型的
public class ModelMap extends LinkedHashMap<String, Object> { public class ExtendedModelMap extends ModelMap implements Model { public class BindingAwareModelMap extends ExtendedModelMap {
在后续的学习使用中建议使用ModelAndView,因为它牛逼【最终都会将Model、Map、ModelMap封装为ModelAndView对象】
在源码中通过debug断点能发现当控制器方法执行完后,方法中的参数、返回值都会被封装成为一个ModelAndView。当方法执行完后最终获得一个ModelAndView对象,这个 mv就是ModelAndView的实例对象
这个是使用model进行域数据共享,如果使用ModelMap、Map时,也可以发现最后返回的【mv】的值是{view="...";model="key=value"},但是使用原生Servlet实现域之间数据共享就会发现model的值为null,因为这里没有用到model

向session域共享数据
在使用上只要将处理请求的参数换成HttpSession,调用HttpSession的方法在session中存入这个数据,在取出数据时,通过thymeleaf的内置对象session用【 . 】取出存在里面的数据就可以。
在java中
@RequestMapping("/testSession")
public String testSession(HttpSession session){
session.setAttribute("Data","hello,session");
return "show";
}
向Application域中共享数据
在使用上和session域中共享数据差不多,一样是拿HttpSession作为形参,获取ServletContext全局对象,再往里面存数据,取出就用thymeleaf的内置对象取出
在java中
@RequestMapping("/testApplication")
public String testApplication(HttpSession session){
ServletContext application = session.getServletContext();
application.setAttribute("Data","hello,Application");
return "show";
}

浙公网安备 33010602011771号