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";
}
 

 

posted @ 2021-11-20 12:28  优质水  阅读(114)  评论(0)    收藏  举报