Administrator
发布于 2022-10-12 / 41 阅读
0
0

SpringMVC数据输出

前言

鉴于现在开发多是返回json数据为主,以下的知识点应该只做了解即可。

问:SpringMVC除过在方法上传入原生的request和session外还能怎么样把数据带给页面?

SpringMVC 输出模型数据分类

ModelAndView: 
处理方法返回值类型为 ModelAndView 时, 方法体即可通过该对象添加模型数据

Map、Model、ModelMap: 入参为 org.springframework.ui.Model、
			org.springframework.ui.ModelMap 或 java.uti.Map 时,
            处理方法返回时,Map 中的数据会自动添加到模型中。

@SessionAttributes: 
将模型中的某个属性暂存到 HttpSession 中,以便多个请求之间可以共享这个属性

@ModelAttribute:
方法入参标注该注解后, 入参的对象就会放到数据模型中

ModelAndView

控制器处理方法的返回值如果为 ModelAndView, 则其既包含视图信息,也包含模型数据信息。

添加模型数据方法:
image-1665565307464


添加视图方法:
image-1665565341609

eg:

    @RequestMapping("/handle04")
    public ModelAndView handle04(@ModelAttribute("book") Book book
    ){
        ModelAndView mv = new ModelAndView();
        //设置返回的视图名称
        mv.setViewName("success");
        //添加要返回的信息
        mv.addObject("msg","modelandview");
        return mv;

    }

ModelMap、Model、Map

 *
 * 1)、在方法处传入Map、或者Model或者ModelMap。
 *      给这些参数里面保存的所有数据都会放在请求域中。可以在页面获取

 *   关系:

 *      Map,Model,ModelMap:最终都是BindingAwareModelMap在工作;
 *      相当于给BindingAwareModelMap中保存的东西都会被放在请求域中;
 *
 *      Map(interface(jdk))      Model(interface(spring)) 
 *          ||                          //
 *          ||                         //
 *          \/                        //
 *      ModelMap(class)               //
 *                  \\              //
 *                   \\            //
 *                  ExtendedModelMap
 *                          ||
 *                          \/
 *                  BindingAwareModelMap

eg:

@RequestMapping("/handle01")
    public String handle01(Map map){
        map.put("msg","map测试");
        //class org.springframework.validation.support.BindingAwareModelMap
        System.out.println(map.getClass());
        map.put("book",new Book());
        return "success";
    }

    @RequestMapping("/handle02")
    public String handle02(Model model){
        model.addAttribute("msg","model测试");
        //class org.springframework.validation.support.BindingAwareModelMap
        System.err.println(model.getClass());
        return "success";
    }

    @RequestMapping("/handle03")
    public String handle03(ModelMap modelMap){
        modelMap.put("msg","modelmap测试");
        //class org.springframework.validation.support.BindingAwareModelMap
        System.err.println(modelMap.getClass());
        return "success";
    }

SessionAttributes 注解

若希望在多个请求之间共用某个模型属性数据,
则可以在控制器类上标注一个 @SessionAttributes, 
Spring MVC 将在模型中对应的属性暂存到 HttpSession 中。

@SessionAttributes 除了可以通过属性名指定需要放到会话中的属性外,
还可以通过模型属性的对象类型指定哪些模型属性需要放到会话中

如果满足类型或者value值,则会在session域中也存放一份设置的键值对

eg:

value:指对应属性名的值
type:对应属性的类型,只要是这种类型的值,都会被放入session中

@SessionAttributes(value = {"book"},types = {String.class})

ps:这个注解不建议和下面说到的ModelAttribute使用,因为如果你标注了某个value的值存在于session中,且如果某个参数标注了ModelAttribute注解,如果在隐含模型中取不到这个参数的数据,那么就会在session中取,这时候也取不到的话会报错。

eg:


    @RequestMapping("/handle04")
    //标注@ModelAttribute告诉springmvc先在隐含模型中找haha这个对象,
    //找不到---->去session中找
    如果你还标注了@SessionAttributes(value = {"book","haha"})
    就相当于告诉Springmvc在session中一定有haha这个对象,但如果session中压根没有的话
    会报错
    public ModelAndView handle04(@ModelAttribute("haha") Book book
    ){
        ModelAndView mv = new ModelAndView();
        mv.setViewName("success");
        System.err.println(book);
        mv.addObject("msg","modelandview");
        return mv;

    }

image-1665568148800

所以使用这个注解,要么就一定要有某个属性值,要么就不要标,不标的话SpringMVC还可以自动new一个对象
 

SessionAttribute注解

这个注解和上一个注解很像,就多了一个s,但此注解只作用在参数上

  注释将方法参数绑定到会话属性。 主要动机是通过可选/必选检查和转换到目标方法参数类型,
  提供对现有的永久会话属性(例如,用户身份验证对象)的方便访问。 
  对于需要添加或删除会话属性的用例,考虑将org.springframework.web.context.request.WebRequest或javax.servlet.http.HttpSession注入到控制器方法中。
  
   对于在会话中临时存储模型属性作为控制器工作流的一部分,请考虑使用SessionAttributes代替
  
  总结就是:这个是从session中取对象的,建议用在用户验证方面,可以设置是否为必须,但不提供添加删除功能
  
  eg:@SessionAttribute(value="book") Book book
  从session中获取名为book的Book对象,没有就抛异常。可以设置required = false

ModelAttribute注解

作用:

  在方法定义上使用 @ModelAttribute 注解:
  Spring MVC 在调用目标处理方法前,会先逐个调用在方法级上标注了 @ModelAttribute 的方法。

  在方法的入参前使用 @ModelAttribute 注解:
  可以从隐含对象中获取隐含的模型数据中获取对象,再将请求参数绑定到对象中,再传入入参

  将方法入参对象添加到模型中

eg:

	同上:
    这个注解不用深入了解,知道就可以。作用就是从隐含模型中提前取出数据进行绑定,
    就不使用mvc的自动new一个对象,以至于什么属性都没有,或者说使某个方法在标注,
    可以使某个方法提前运行

评论