zoukankan      html  css  js  c++  java
  • SpringMVC(二)--处理数据模型、ModelAndView、Model、Map、重定向、@ModelAttribute、

    1.处理模型数据

    Spring MVC 提供了以下几种途径输出模型数据:
         – ModelAndView:处理方法返回值类型为 ModelAndView 时, 方法体即可通过该对象添加模型数据
         – Map 及 Model、ModelMap: 入参为 org.springframework.ui.Model、org.springframework.ui. ModelMap 或 java.uti.Map 时,处理方法返回时,Map 中的数据会自动添加到模型中。
       
    无论返回值是String类型,还是ModelAndView类型,SpringMVC执行Handle方法之后都会将返回值解析为ModelAndView对象
     
    我们放入到Map或者Model、ModelMap中的数据都会放入ModelAndView对象中,作为Model使用
     
         – @SessionAttributes::将模型中的某个属性暂存到HttpSession 中,以便多个请求之间可以共享这个属性
         – @ModelAttribute: 方法入参标注该注解后, 入参的对象 就会放到数据模型中.
     
    2.ModelAndView
         控制器处理方法的返回值如果为 ModelAndView, 则其既包含视图信息,也包含模型数据信息。
               添加模型数据:
              – MoelAndView addObject(String attributeName, Object attributeValue)
              – ModelAndView addAllObject(Map<String, ?> modelMap)
               设置视图:
              – void setView(View view)
              – void setViewName(String viewName)
    @RequestMapping(value="/testModelAndView")
    public ModelAndView testModelAndView(){
    	ModelAndView mv = new ModelAndView();
    	mv.setViewName(SUCCESS);//逻辑视图转化为物理视图,去找的视图解析器
    	mv.addObject("user", "张三");//与request.setAttribute("user","张三")一样作用
    	return mv;
    }
    

    3.Model、Map

         Spring MVC 在内部使用了一个 org.springframework.ui.Model 接口存 储模型数据
              具体步骤
         –     Spring MVC 在调用方法前会创建一个隐含的模型对象作为模型数据的存储容器。
         –     如果方法的入参为 Map 或 Model 类型,Spring MVC 会将隐含模型的引用传递给这些入参。在方法体内,开发者可以通过这个入参对象访问到模型中的所有数据,也可以向模型中添加新的属性数据   
    @RequestMapping(value="/testMap")
    public String testMap(Map<String,Object> map){
    	map.put("user", new Student("李四", "asd@asd.com"));
    	return SUCCESS;
    }
    @RequestMapping(value="/testModelMap")
    public String testModelMap(ModelMap model){
    	model.addAttribute("user", "hah");
    	return SUCCESS;
    }
    

    4.关于重定向

         一般情况下,控制器方法返回字符串类型的值会被当成逻辑视图名处理
         如果返回的字符串中带 forward: 或 redirect: 为前缀时,SpringMVC 会对他们进行特殊处理:将 forward: 和 redirect: 当成指示符,其后的字符串作为 URL 来处理
           – redirect:/success.jsp:会完成一个到 success.jsp 的重定向操作
           – forward:/success.jsp:会完成一个到 success.jsp 的转发操作    
     
    可以在springmvc配置文件中配置如下代码,我们的请求可以不经过controller,直接进入到另一个页面
    <mvc:view-controller path="/redirect" view-name="success"/>
    

    但是此时原来访问正常的@RequestMapping的URL不能正常访问,如要正常访问,加上如下代码

    <mvc:annotation-driven></mvc:annotation-driven>
    

    5.@ModelAttribute [使用场景]

         在方法定义上使用 @ModelAttribute 注解:Spring MVC在调用目标处理方法前,会先逐个调用在方法级上标注了@ModelAttribute 的方法。
         在方法的入参前使用 @ModelAttribute 注解:
              –     可以从隐含对象中获取隐含的模型数据中获取对象,再将请求参数绑定到对象中,再传入入参
              –     将方法入参对象添加到模型中
     
    我们每次请前求的方法之都会执行一次
    @ModelAttribute
    public void getStudent(Map<String, Object> map){
    	Student student = new Student("zhangsan","zhangsan@163.com");
    	map.put("stu", student);
    }
    	
    @RequestMapping(value="/toUpdatePage",method=RequestMethod.POST)
    public String toUpdatePage(@ModelAttribute(value="stu") Student stu){
    	System.out.println(stu);
    		eturn "success";
    }
    

    6.SpringMVC确定目标方法POJO类型入参的过程

         1.确定一个key:
              1).若目标方法的POJO类型的参数没有使用@ModelAttribute作为修饰,也是默认存在的,则key为POJO类名第一个字母的小写。
              2).若使用@ModelAttribute修饰,则key为@ModelAttribute注解的value属性值
     
         2.在implicitModel【request域】中查找key对应的对象,若存在,则作为入参传入。
            若在@ModelAttribute标记的方法中在Map保存过,且key和1确定的key一致,则会获取到!
     
         3.在implicitModel中不存在key对应的对象,则检查当前的Handler是否使用@SessionAttribute注解修饰,若使用了该注解,且@SessionAttributes注解的value属性值中包含了key,则会从HttpSession中来获取key所对应的value值,若存在则直接传入到目标方法的入参中,若不存在则将抛出异常。
     
         4.若Handler没有标识@SessionAttributes注解或者@SessionAttributes注解的value值中不包含key,则会通过反射【必须有一个无参构造器】来创建 POJO 类型的参数,传入为目标方法的参数。
        
         5.SpringMVC会把 key 和 POJO 对象保存到 implicitModel 中,进而会保存到 request 域中!
        
    注意:1.@ModelAttribute 标记的方法,会在每个目标方法执行之前被SpringMVC调用!
              2.@ModelAttribute 注解可以来修饰目标方法 POJO 类型的入参,其 value 属性值有如下作用:
                 1) SpringMVC会使用 value 属性值在 implicitModel 中查找对应的对象,若存在则会直接传入到目标方法的入参中
                 2) SpringMVC会以 value 为 key , POJO 类型的对象为 value ,存入到 request 域中。
     
    7.若希望在多个请求之间共用某个模型属性数据,则可以在控制器类上标注一个@SessionAttribute,SpringMVC将在模型中对应的属性暂存到 HttpSession 中
     - 只能标记在类上,可以使得多次请求共享某一部分数据
         values:指定放入session域中的键
         types:指定放入session域中对象的字节码
     
    以下代码实现将修改后的 stu 存在 session 中,在页面通过 EL 表达式就可以调用
     

    用 types 属性也能实现,但一般不用,麻烦易出错

     
     
     
     
  • 相关阅读:
    一款纯css3实现的翻转按钮
    一款基于jquery实现的鼠标单击出现水波特效
    一款由html5 canvas实现五彩小圆圈背景特效
    一款由css3和jquery实现的卡面折叠式菜单
    一款jquery实现的整屏切换特效
    联想笔记本Win10 F1-F12失效的解决方法
    Android笔记:如何在Fragment里使用findViewById()方法?
    java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
    Call requires API level 21(Current min is 16)
    Android笔记:DrawerLayout抽屉布局的使用
  • 原文地址:https://www.cnblogs.com/lwj-0923/p/7416339.html
Copyright © 2011-2022 走看看