spring专题---第三部分MVC---搞懂spring MVC视图层的实现机制,让开发变得简单高效

在这里插入图片描述

本篇总结内容如下:

     前言
     spring MVC添加业务数据的几种方式
     HttpServletRequest
     Map
     Model
     ModelAndView
     @ModelAttribute
     @SessionAttributes
     总结
     分享交流

前言

     上一篇文章总结的是spring MVC的数据绑定,在项目开发中主要服务于数据前端到后端的传输,这一篇文章总结spring MVC视图层实现机制,在项目开发中主要服务于数据后端到前端的传输
     我们项目的运转通常都离不开数据,不论是用户数据到后端处理,还是后端数据到前端响应,都是需要一些机制处理的。
     用户请求的数据后端如何去接收,后端会以什么样的形式接收,是需要我们考虑的。我们可以定义基本数据类型接收,也可以定义数组类型,集合类型或是对象类型来接收。或者我们可以通过JSON数据格式来接收。
     后端的数据接收后会经过处理,有的时候还会需要返回数据给前端,那么会以什么样的类型传给前端,前端又是怎么接收这些数据的,正是本篇文章所要讲的内容。

spring MVC添加业务数据的几种方式

     •HttpServletRequest
     •Map
     •Model
     •ModelAndView
     •@ModelAttribute
     •@SessionAttributes

HttpServletRequest

     我们之前可能写过java web的项目,用的是servlet,我们可以回想一下,当时写数据处理的时候,后端是如何将数据传给前端的,我们是在方法定义处添加HttpServletRequest,在方法体中直接对request对象进行操作,如下所示:

@Controller
public class Test {

    @RequestMapping("/test")
    public String hello(HttpServletRequest request){
        User user=new User();
        user.setName("lisi");
        user.setId(101);
        request.setAttribute("user",user);
        return "hello";
    }
}

创建hello.jsp

<body>
hi
${user.id}
${user.name}
</body>

运行tomcat,访问http://localhost/test
在这里插入图片描述
     业务数据绑定到request域对象,前端通过el表达式获取${}。

    Spring MVC在内部使用Model接口存储业务数据,在调用业务方法前会创建一个隐含的对象,作为业务数据的存储容器。我们在项目中所写的Map,Model等等都是在设置业务方法的入参类型,Spring MVC会将隐含对象的引用传递给入参,从而使开发者可以对模型中的所有数据进行管理,包括访问和添加。我们只需要在业务方法添加相应类型的入参,方法体中便可通过入参的操作来完成对业务数据的添加。

Map

     我们设置业务方法的入参为Map类型。

    @RequestMapping("/test1")
    public String test1(Map<String,Object> map){
        User user=new User();
        user.setId(1001);
        user.setName("张三");
        map.put("user",user);
        return "hello";
    }

在这里插入图片描述

Model

    @RequestMapping("/test2")
    public String test2(Model model){
        User user=new User();
        user.setId(1002);
        user.setName("李四");
        model.addAttribute("user",user);
        return "hello";
    }

在这里插入图片描述

ModelAndView

     与Map和Model不同的是,ModelAndView不仅包含业务数据,也包含了视图信息,如果用ModelAndView处理业务数据,业务方法的返回值必须是ModelAndView对象。
     业务方法对ModelAndView进行两个操作:填充业务数据,绑定视图信息。
关于ModelAndView的使用有8种方式,具体操作如下:

    @RequestMapping("/test3")
    public ModelAndView test3(ModelAndView modelAndView){
        User user=new User();
        user.setId(1003);
        user.setName("王五");
        modelAndView.addObject("user",user);
        modelAndView.setViewName("hello");
        return modelAndView;
    }

在这里插入图片描述
     这里只演示一种项目中最常用的,其余七种我没在这里演示,主要是这八种相差不是很大,我觉得没必要去记其余七种。

@ModelAttribute

     spring MVC还可以通过@ModelAttribute注解的方式添加业务数据,具体使用分两个步骤:
(1)定义一个方法,该方法用来返回填充到业务数据的对象;
(2)给该方法添加@ModelAttribute注解,注意,该方法并不是影响相应请求的方法。

    @RequestMapping("/test4")
    public String test4(){
        return "hello";
    }
    @ModelAttribute
    public User getUser(){    //注意该业务方法不会影响响应请求
        User user=new User();
        user.setId(1004);
        user.setName("赵六");
        return user;
    }

在这里插入图片描述
     添加@ModelAttribute注解的方法,会在spring MVC调用任何一个业务方法之前自动调用。因此在执行test4业务方法之前,会先调用@ModelAttribute注解的方法getUser,获取返回值user对象,spring MVC会自动将该对象值填充到业务数据中,进而绑定到域对象中。
     域对象中的数据都是以键值对(key-value)的形式保存的,那么此时的key是什么呢?默认取业务数据对应类的首字母小写之后的类名,例如上边例子业务数据的对应类名为User,则key为user。
     如果getUser没有返回值,则必须手动在该方法中填充业务数据,使用Map或Model均可。

    @RequestMapping("/test4")
    public String test4(){
        return "hello";
    }
    @ModelAttribute
    public void getUser(Map<String,Object> map){
        User user=new User();
        user.setId(1004);
        user.setName("赵六");
        map.put("user",user);
    }
    @RequestMapping("/test4")
    public String test4(){
        return "hello";
    }
    @ModelAttribute
    public void getUser(Model model){
        User user=new User();
        user.setId(1004);
        user.setName("赵六");
        model.addAttribute("user",user);
    }

@SessionAttributes

     以上几个方法都是将业务数据保存在request对象中,如果需要将业务数据保存在session对象中,只需要在类定义出添加@SessionAttributes(value=“xxx”)注解即可,如下所示:

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

    //省略业务方法代码
}    

     此时,无论通过上面哪种方式执行业务代码,将业务数据绑定到request对象中的同时,也会将业务数据绑定到session对象中,也就是说request和session对象中会同时存在业务数据。
@SessionAttributes除了可以通过key值绑定,也可以通过业务数据的数据类型进行绑定,如下所示:

@Controller
@SessionAttributes(types = User.class)
public class Test {

    //省略业务方法代码
}  

@SessionAttributes可同时绑定多个业务数据,如下所示:

通过key值绑定:

@Controller
@SessionAttributes(value = {"user","address"})
public class Test {

    //省略业务方法代码
}  

通过业务数据的数据类型进行绑定:

@Controller
@SessionAttributes(types = {User.class,Address.class})
public class Test {

    //省略业务方法代码
}  

总结

     spring MVC的业务数据解析,具体是指将控制器的业务方法处理结果响应给客户端的过程,及C(controller)–V(view)的映射,可以使用spring MVC自带的ModelAndView组件同时将业务数据和视图信息进行绑定,这种方式是我们开发中常用的,同时也可以使用Model或Map来完成业务数据得解析。

分享交流

     以上便是我对这一部分的理解,如果有错误或者你有其他疑惑都可以留言给出,我都会一一进行回复,希望对你有所帮助,如果写的不好也请您多多包涵。欢迎在下方补充留言哟。
     对SSM框架感兴趣的童鞋,可以移步这里,在这里你可以快速的搭建好一个SSM框架。
     如果你在写项目的时候,遇到一些不寻常的问题,也可以关注我的博客园,上边会发布一些我在写项目中遇到的各种问题以及解决方式。

发布了21 篇原创文章 · 获赞 27 · 访问量 4280

猜你喜欢

转载自blog.csdn.net/llllxxxxyyyy/article/details/104116863