代码改变世界

5、处理模型数据ModelAndView、Map、Model以及@SessionAttributes注解

2015-11-09 22:30  宏愿。  阅读(961)  评论(0编辑  收藏  举报


Spring MVC提供了以下几种途径输出模型数据
  —— ModelAndView: 处理方法返回值类型为ModelAndView时,方法体即可通过该对象添加模型数据。数据会添加到request域中。在页面上可以获取到该数据。
  —— Map 及 Model:入参为 org.springframework.ui.Model、org.springframework.ui.ModelMap 或 java.uti.Map 时,处理方法返回时,Map中的数据会自动添加到模型中。数据放在request域中。
  —— @SessionAttributes:将模型中的某个属性暂存到HttpSession中,以便多个请求之间可以共享这个属性。只能使用在类定义处。
  —— @ModelAttribute:方法入参标注该注解后,入参的对象就会放到数据模型中。可以使用在方法定义和入参处。

 

这里介绍一下@SessionAttributes这个注解:

  ①、它只能使用在类定义处,@Target({ElementType.TYPE})。

  ②、它有两个属性:String[] value() default {} 和 Class<?>[] types() default {} 。所以,可以通过名字和类型来指定哪个数据对象应该放置在session域中

 

下面是一个实例,说明前三种途径的用法。最后的@ModelAttribute在后面单独说:

package com.springmvc.modelAndView_7;

import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Map;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.servlet.ModelAndView;

import com.springmvc.pojoParam_6.User;

@Controller
@RequestMapping("/ModelAndView")
@SessionAttributes(value={"school"}, types={User.class})
public class ModelAndViewTest {
    
    private static final String SUCCESS = "success";
    
    /**
     * 1、处理方法的返回值为ModelAndView类型
     * 目标方法的返回值可以是ModelAndView类型,其中可以包含视图和模型信息
     * SpringMVC会把ModelAndView中model中的数据放入到request域对象中
     */
    @RequestMapping("/testModelAndView")
    public ModelAndView testModelAndView(){
        String viewName = SUCCESS;
        
        ModelAndView modelAndView = new ModelAndView(viewName);
        //添加模型数据到ModelAndView中,目标页面中在请求域中获取${requestScope.time }
        modelAndView.addObject("time", new Date());
        
        return modelAndView;
    }
    
    /**
     * 2、入参为Map类型的实现,也是放在请求域中
     * 目标方法可以添加Map类型(实际上也可以是Model类型,或ModelMap类型)的参数实现
     */
    @RequestMapping("/testMap")
    public String testMap(Map<String, List<String>> map){
        map.put("names", Arrays.asList("Tom", "Jerry", "Mike"));
        
        return SUCCESS;
    }
    
   /**
     * 3、@SessionAttributes注解方式实现
     * 在类上面放置@SessionAttributes注解,这样就能够将注解中指定的属性放置到session域中。
     *
     * 在这个处理方法中,将user和school放入到map中。单从方法本身来看,和上面的testMap做法没有任何区别。
     * 但是,为什么这里的user和school就能够放置到session域中,而上面的names只能放置在request域中呢??
     * 原因在于在控制器类定义处使用了 @SessionAttributes(value={"school"}, types={User.class})
     * 这个注解。该注解规定了:“名字为school” 和  “类型为User” 的都放置在session域中。
     */ @RequestMapping(
"/testSessionAttributes") public String testSessionAttributes(Map<String, Object> map){ User user = new User("jerry", "123456", 16, "123@126.com"); map.put("user", user); map.put("school", "HNedu"); return SUCCESS; } }

 

  在/WEB-INFO/views/success.jsp页面中可以获取到request域或者是session域中的数据:

<body>

    <h1>hello world success!!!</h1>
    <br/>
    
    模型视图方式,ModelAndView实现,requestScope time:${requestScope.time }
    <br/>
    模型视图方式,ModelAndView实现,sessionScope time:${sessionScope.time }
    <br/><br/>
    
    模型视图方式,Map实现,requestScope names:${requestScope.names }
    <br/>
    模型视图方式,Map实现,sessionScope names:${sessionScope.names }
    <br/><br/>
    
    模型视图方式,@SessionAttributes注解实现:
    <br/>
    request school: ${requestScope.school }
    <br/>
    session school: ${sessionScope.school }
    <br/>
    request user: ${requestScope.user }
    <br/>
    session user: ${sessionScope.user }
    <br/>

</body>

  现在发送三个请求,验证结果:

  ①:http://localhost:8080/springMVC/ModelAndView/testModelAndView 说明处理方法返回ModelAndView时,将数据放置在request域中

  ②:http://localhost:8080/springMVC/ModelAndView/testMap 将数据放置在request域中。

  ③、http://localhost:8080/springMVC1/ModelAndView/testSessionAttributes 说明将数据放在request和session域中。