• SpringMvc:处理模型数据


    SpringMvc提供了以下途径输出模型数据:

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

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

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

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

    具体做法如下:

    package com.seven.demos;
    
    import com.seven.entity.User;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.SessionAttributes;
    import org.springframework.web.bind.support.SessionStatus;
    import org.springframework.web.servlet.ModelAndView;
    
    import java.util.Arrays;
    import java.util.Date;
    import java.util.Map;
    
    /**
     * Created by hu on 2016/4/2.
     */
    @SessionAttributes(types = User.class)//将类型为User的模型数据放在HttpSession中去。
    @Controller
    @RequestMapping("/SpringMvcTest1")
    public class SpringMvcTest1 {
        @RequestMapping("/test1")
        public ModelAndView test1(){
            //定义视图的名字,将会定位到“hujingwei.jsp”
            String viewName="hujingwei";
            //初始化一个ModelAndView对象
            ModelAndView modelAndView=new ModelAndView(viewName);
            //向ModelAndView中添加数据对象
            modelAndView.addObject("time", new Date());
            return modelAndView;
        }
        /*
        * SpringMvc在调用方法前会创建一个隐含的模型对象作为模型数据存储容器
        * 如果方法的入参为Map或Model类,SpringMvc会将隐含模型的引用传递给这些入参,
        * 在方法体内,开发者可以通过这些入参对象访问到模型中的所有数据,也可以向
        * 模型中添加新的属性数据。
        * */
        @RequestMapping("/test2")
        public String test2(Map<String,Object> map){
            map.put("name", Arrays.asList("Tom","Jack","Mike"));
            //从模型中取得数据
            User user= (User) map.get("user");
            return "hujingwei";
        }
        /*
        * 若想在多个请求之间共用某个模型属性数据,则可以在控制器类上标注一个@SessionAttributes,SpringMvc将在模型中
        * 对应的属性暂存在HttpSession中;@SessionAttributes除了可以通过属性名指定需要放到会话中的属性外,还可以通过
        * 模型属性的对象类型指定哪些模型属性需要放到会话中去。
        * @SessionAttributes(types = User.class)会将隐含模型中所有类型为User的属性添加到HttpSession中去
        * @SessionAttributes(value={"user1","user2"})会将隐含模型中属性名为"user1","user2"的属性添加到HttpSession中去
        * 还可以有以下组合:
        * @SessionAttributes(value={"user1","user2"},types={Department.class})
        * 注: @SessionAttributes不能放在类级别上
        * */
        @RequestMapping("/test3")
        public String test3(Map<String,Object> map,SessionStatus sessionStatus){
            map.put("name", Arrays.asList("Tom","Jack","Mike"));
            //从模型中取得数据
            User user= (User) map.get("user");
            return "hujingwei";
        }
        /*
        * @ModelAtrribute
        * 在方法的定义上使用@ModelAtrribute注解,那么就可以从隐含的模型数据中获取对象,再将参数绑定到对象中,再传入入参。
        * 将方法入参对象添加到隐含模型中。
        * 注:@ModelAtrribute也可以修饰目标方法中POJO类型的入参。
        * */
        /*
        * 由@SessionAttributes引发的异常
        * 如果在类定义处标注了@SessionAttributes("xx"),则会从会话中获取该属性,并将其赋给该入参,然后再利用请求消息填充该
        * 入参对象。如果在会话中找不到对应的对象,则抛出HttpSessionRequiredException异常。
        * 如何避免这个异常?如下:假如@SessionAttributes("user")
        *     @ModelAtrribute("user")
        *     //该方法会往隐含模型中添加一个名为user的模型属性
        *     public User getUser(){
        *          User user=new User();
        *          return user;
        *     }
        * */
    }
    

      

  • 相关阅读:
    致歉
    [公告]博客园正在对网站程序进行性能优化
    [公告]调整默认发布选项
    网站情况继续汇报
    定制“Server Too Busy”错误信息
    可恶的垃圾广告
    博客园分站服务器故障
    很值得期待—SharePoint "V3.0"新特性
    安装Vistual Studio 2005的小问题
    安装智能陈桥五笔时请小心
  • 原文地址:https://www.cnblogs.com/hujingwei/p/5347457.html
Copyright © 2020-2023  润新知