04-SpringMVC-springmvc输出数据模型

    SpringMVC提供了以下种途径输出数据模型

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

  • Map与Model:处理方法的传入参数是org.springframework.ui.Model、org.springframework.uiModelMap或java.util.Map,处理方法返回时,Map中的数据会自动添加到模型中

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

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

一、ModelAndView

1、知识点

  • 处理方法的返回值是ModelAndView,则其既包含视图信息,也包含模型数据信息

  • 添加模型数据

    • public ModelAndView addObject(String attributeName, Object attributeValue)

    • public ModelAndView addObject(Object attributeValue)

  • 设置视图

    • void setView(View view)

    • void setViewName(String viewName) 

2、测试

  • 处理方法

@RequestMapping("/testModelAndView")public ModelAndView testModelAndView(){ModelAndView modelAndView = new ModelAndView();//添加模型数据到ModelAndView中		modelAndView.addObject("time",new Date());//设置视图		modelAndView.setViewName("success");return modelAndView;}
  • 请求页面

<a href="exportData/testModelAndView">测试ModelAndView</a>
  • 接受返回值页面:SpringMVC把Model中数据放到reques域对象

time:${requestScope.time }

二、Map及Model

1、知识点

  • SpringMVC在内部使用一个org.springframework.ui.Model接口存储模型数据

04-SpringMVC-springmvc输出数据模型_第1张图片

  • 处理方法的传入参数为Map或Model类型,开发者可以通过这个参数对象,来访问模型中的所有数据,也可以向模型中添加新的属性数据

2、测试

  • 控制器中的处理方法

@RequestMapping("/testMap")public String testMap(Map<String, Object> map){		map.put("name", Arrays.asList("sunwukong","zhubajie","shasheng"));return "success";}
  • 请求

<a href="exportData/testMap">测试Map</a>
  • 接受返回值页面

name:${requestScope.name }

三、@SessionAttributes

1、知识点

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

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

    • @SessionAttributes(types=User.class),会将隐含模型中所有类型为User.class的属性添加到会话中

    • @SesssionAttributes(value={"name1","name2"})。value表示的键名

    • @SesssionAttributes(types={User.class,Dept.class})

    • @SesssionAttributes(value={"name1","name2"},types={Dept.class})

  • 注:@SessionAttributes只能放在类上面,则不能修饰方法

        04-SpringMVC-springmvc输出数据模型_第2张图片

2、测试

2.1测试键名

  • 控制器

@SessionAttributes(value={"user"})@RequestMapping("/exportData")@Controllerpublic class ExportData {.../**	 * map中的key值(user)跟@SessionAttributes(value={"user"})中的value值一样	   那么SpringMVC会将这个key对应的属性值分别放入request域和session域中	 * @param map	 * @return	 */@RequestMapping("/testSessionAttributes")public String testSessionAttributes(Map<String, Object> map){User user = new User();		user.setUsername("wangsh");		user.setPassword("123456");		user.setEmail("[email protected]");		user.setAge(12);		map.put("user", user);return "success";}}
  • 请求

<a href="exportData/testSessionAttributes">测试SessionAttributes</a>
  • 接受返回值页面

request user:${requestScope.user }<br/>session user:${sessionScope.user }


2.2 测试类型

  • 控制器类

/** *  * @author wangsh *	@SessionAttributes(types={Address.class}):会将此类中所有方法,输出数据模型中包括Address类型的数据存储到sessionk, *  如果冲突,后调用的方法,会替换前面调用的方法 */@SessionAttributes(types={Address.class})@RequestMapping("/exportData")@Controllerpublic class ExportData {...@RequestMapping("/testSessionAttributes2")public String testSessionAttributes2(Map<String, Object> map){Address address = new Address();		address.setProvince("zhejiang");		address.setCity("nb");		map.put("address", address);return "success";}}
  • 请求

<a href="exportData/testSessionAttributes2">测试SessionAttributes2</a>
  • 接受返回值页面

request address:${requestScope.address }<br/>	session address:${sessionScope.address }


四、@ModelAttribute

1、@ModelAttribute注释方法

    被@ModelAttribute注释的方法会在此controller每个方法前执行,因此对于一个controller映射多个URL,要谨慎使用

1.1 @ModelAttribute注释void返回值的方法

 
 
  • 控制器

    @ModelAttributepublic void populateModel(Model model){		model.addAttribute("attributeName", "abc");}@RequestMapping(value = "/helloWorld")      public String helloWorld() {         return "success";      }
  • 请求   

<a href="testModelAttribute/helloWorld">测试返回值为void的方法</a>
  • 回显

${attributeName }

    这个例子,在获得请求/helloWorld 后,populateModel方法在helloWorld方法之前先被调用,它把请求参数(/helloWorld?abc=text)加入到一个名为attributeName的model属性中,在它执行后helloWorld被调用。

1.2 @ModelAttribute注释返回具体类的方法

  • 处理器中的方法

    @ModelAttributepublic User addUser(){User user = new User();		user.setUsername("imentors");		user.setAge(2);		user.setEmail("[email protected]");		user.setPassword("123456");return user;}

    这种情况,model属性的名称没有指定,它由返回类型隐含表示,如这个方法返回User类型,那么这个model属性的名称是user。

    这个例子中model属性名称有返回对象类型隐含表示,model属性对象就是方法的返回值。

 
 
  1. 回显页面

  2. user:${user }

1.3 @ModelAttribute(value="")注释返回具体类的方法

  • 处理器中的方法

    @ModelAttribute(value="imentors")public User addUser(){User user = new User();		user.setUsername("imentors");		user.setAge(2);		user.setEmail("[email protected]");		user.setPassword("123456");return user;}

这个例子中使用@ModelAttribute注释的value属性,来指定model属性的名称。model属性对象就是方法的返回值。

  • 回显页面

@ModelAttribute(value=""):${imentors }

1.4 @ModelAttribute和@RequestMapping同时注释一个方法

@RequestMapping("/addUser")@ModelAttribute(value="imentors")public User addUser(){User user = new User();		user.setUsername("imentors");		user.setAge(2);		user.setEmail("[email protected]");		user.setPassword("123456");return user;}
  • 这时这个方法的返回值并不是表示一个视图名称,而是model属性的值

  • 视图名称由RequestToViewNameTranslator根据请求"/addUser"转换为逻辑视图addUser。

  •  Model属性名称有@ModelAttribute(value=””)指定,相当于在request中封装了key=imentors,value=user。

相信一般开发者都不会这样用.

2.@ModelAttribute注释一个方法的参数 

2.1 从model中获取

  • 控制器

    @ModelAttributepublic User addUser(){User user = new User();		user.setUsername("imentors");		user.setAge(2);		user.setEmail("[email protected]");		user.setPassword("123456");return user;}    @RequestMapping(value = "/helloWorld")      public String helloWorld(@ModelAttribute("user") User user) {  		user.setUsername("wangsh");       return "success";      }
  •  在这个例子里,@ModelAttribute("user") User user注释方法参数,参数user的值来源于addUser()方法中的model属性。

  •     此时如果方法体没有标注@SessionAttributes("user"),那么scope为request,如果标注了,那么scope为session

2.2 从Form表单或URL参数中获取(实际上,不做此注释也能拿到user对象)

    @RequestMapping(value = "/helloWorld")      public String helloWorld(@ModelAttribute User user) {  		user.setUsername("wangsh");       return "success";      }

  注意这时候这个User类一定要有没有参数的构造函数。

五、关于重定向

1、知识点

  • 一般情况下,控制器方法返回字符串类型的值会被当成逻辑视图名处理

  • 如果返回的字符串带forward:或redirect:前缀时,SpringMVC会对他们进行特殊处理

    • redirect:success.jsp  会完成一个到success.jsp的重定向的操作

    • forward:success.jsp  会完成一个到success.jsp的转发操作

04-SpringMVC-springmvc输出数据模型_第3张图片

2、测试

@RequestMapping("/testRedirect")public String testRedirect(){System.out.println("testRedirect");return "redirect:/index.jsp";}


关注我们

    师享空间的宗旨是分享知识,传播价值。关注我们,及时获得更多信息。

04-SpringMVC-springmvc输出数据模型_第4张图片



捐赠我们
    如果您对我们的成果表示认同并且觉得对你有所帮助,欢迎您对我们捐赠^_^。

       04-SpringMVC-springmvc输出数据模型_第5张图片

你可能感兴趣的:(springMVC,ModelAndView,@ModelAttribute)