SpringMVC响应数据传出

    科技2022-07-21  130

    SpringMVC输出模型数据概述

    提供了一下几种途径输出模型数据

    ModelAndView:处理方法返回值类型为ModelAndView时,方法体即可通过该对象添加模型数据Map即Model:入参为org.springframework.ui.Model、org.springframework.ui.ModelMap 或 java.uti.Map 时,处理方法返回时,Map中的数据会自动添加到模型中。@SessionAttribute:将模型中的某个属性暂时存到HttpSession中,以便多个请求之间可以共享这个属性@ModelAttribute:方法入参标注该注解后,入参的对象就会放到数据模型中

    处理模型数据之ModelAndView

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

    MoelAndView addObject(String attributeName, Object attributeValue)ModelAndView addAllObject(Map<String, ?> modelMap) 3.设置视图void setView(View view)void setViewName(String viewName)

    代码演示:

    /** * 目标方法的返回类型可以是ModelAndView类型 * 其中包含视图信息和模型数据信息 * @return */ @RequestMapping("/springMVC/testModelAndView") public ModelAndView testModelAndView(){ String viewName = "success"; ModelAndView modelAndView = new ModelAndView(viewName); //放在request域中 modelAndView.addObject("time",new Date().toString()); return modelAndView; } //index.jsp页面 <a href="springMVC/testModelAndView">ModelAndView</a> //success.jsp页面 time:${requestScope.time}

    处理模型数据之Map

    SpringMVC在内部使用了一个 org.springframework.ui.Model接口存储模型数据具体使用步骤

    SpringMVC在调用方法前会创建一个隐含的模型对象作为模型数据的存储容器。如果方法的入参为Map或Model类型,SpringMVC会将隐含模型的引用传递给这些入参在方法体内,开发者可以通过这个入参对象访问到模型中的所有数据,也可以向模型中添加新的属性数据Map集合的泛型,key为String,Value为Object,而不是String

    代码演示:

    @RequestMapping("/testMap") public String testMap(Map<String,Object> map){ //【重点】 System.out.println(map.getClass().getName()); //org.springframework.validation.support.BindingAwareModelMap map.put("names", Arrays.asList("Tom","Jerry","Kite")); return "success"; } //index.jsp页面 <a href="springmvc/testMap">testMap</a> //success.jsp页面 names: ${requestScope.names }

    处理模型数据之 SessionAttributes 注解

    若希望在多个请求之间共用某个模型属性数据,则可以在控制器类上标注一@SessionAttributes,SpringMVC将在模型中对应的属性暂存到HttpSession中 @SessionAttributes除了可以通过属性名指定需要放到会话中的属性外,还可以通过模型属性的对象类型指定哪些模型属性需要放到会话中

    ① @SessionAttributes(types=User.class) 会将隐含模型中所有类型为 User.class 的属性添加到会话中② @SessionAttributes(value={“user1”, “user2”})③ @SessionAttributes(types={User.class, Dept.class})④ @SessionAttributes(value={“user1”, “user2”}, types={Dept.class})

    @SessionAttributes注解源码

    package org.springframework.web.bind.annotation; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Inherited; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target({ElementType.TYPE}) //说明这个注解只能应用在类型上面 @Retention(RetentionPolicy.RUNTIME) @Inherited @Documented public @interface SessionAttributes { String[] value() default {}; //推荐使用 Class<?>[] types() default {}; //范围太广 }

    代码演示

    @Controller //@SessionAttributes("user") @SessionAttributes(value={"user"},types={String.class}) public class SpringMVCController { /** * @SessionAttributes * 除了可以通过属性名指定需要放到会话中的属性外(实际上是通过value指定key值), * 还可以通过模型属性的对象类型指定哪些模型属性需要放到会话中(实际上是通过types指定类型) * 注意:只能放在类的上面,不能修饰方法 */ @RequestMapping("/testSessionAttributes") public String testSessionAttributes(Map<String,Object> map){ User user = new User("Tom","123","tom@atguigu.com",22); map.put("user", user); map.put("school", "atguigu"); //默认是被存放到request 域,如果设置了@SessionAttribute注解,就同时存放到session域中 return "success"; } } //index.jsp页面 <a href="testSessionAttributes">testSessionAttributes</a> //success.jap页面 request user : ${requestScope.user } <br><br> session user : ${sessionScope.user } <br><br> request school : ${requestScope.school } <br><br> session school : ${sessionScope.school } <br><br>
    Processed: 0.009, SQL: 8