zoukankan      html  css  js  c++  java
  • SpringBoot系列: Spring MVC视图方法的补充

    SpringMVC 视图方法的参数, 已经在这个文章中写得非常清楚了, 链接为 https://www.cnblogs.com/morethink/p/8028664.html

    这篇文章做一些补充. 被@RequestMapping 注解的方法的签名非常灵活, Spring会自动注入各种类型的实参, 另外返回值类型也可以有多种选择.


    =============================
    View 方法的形式参数
    =============================
    View 形参种类和数量可以非常多, 这里仅列几种重要的类型:
    1. ServletRequest 或 HttpServletRequest 类型的形参, 在运行时Spring MVC会自动注入 request 实参.
    2. HttpSession 类型的形参, 在运行时Spring MVC会自动注入 session 实参.
    3. java.util.Map/org.springframework.io.Model/org.springframework.ui.ModelMap 类型的参数, 该参数会被Spring自动注入, 我们可以通过该参数进一步控制视图层模型(向FreeMarker模版传参). 推荐使用 Model 或者 ModelMap 类型, 它们比 java.util.Map 更好用.
    4. 处理 request 模版变量的参数, 这类参数需要加上 @PathVariable 注解.
    5. 处理 request header的参数, 这类参数需要加上 @CookieValue 或 @RequestHeader 注解.
    6. 处理 request paramater的参数, 这类参数需要加上 @RequestParam 注解, 该注解其实是调用 Request.getParameter() 获取request 参数值, 它既可获取GET的 queryString, 也可以POST的body data值. 但需要说明的是该注解修饰的参数只能是简单类型, 不能是复杂的用户定义类.
    7. 处理 request body的参数, 这类参数需要加上 @RequestBody 注解, 该注解多用于 Restful 接口.
    8. 处理 request body的参数, 也可以使用 @ModelAttribute 注解, @ModelAttribute 用法较复杂, 参见 https://www.cnblogs.com/morethink/p/8028664.html

    -----------------------------------
    @PathVariable示例
    -----------------------------------
    @PathVariable注解虽然可以加上required参数, 但即使加了 required=false 的话, 对应的参数也不能缺省, 也许Spring未来版本会改进点吧.
    测试url为:
    http://localhost:8080/pathVariableDemo1/1111/harry

        @RequestMapping("/pathVariableDemo1/{userId}/{userName}")
        @ResponseBody
        public String pathVariableDemo(HttpSession session, @PathVariable String userId, @PathVariable String userName) {
            return "userId:"+userId+", userName:"+userName;
        }
        

    -----------------------------------
    @RequestParam 示例1
    -----------------------------------
    @RequestParam, 可以加上 required 参数, 并可以指定缺省值.
    测试url为:
    http://localhost:8080/requestParamDemo?userId=1111&userName=harry
    http://localhost:8080/requestParamDemo?userId=1111&userName=
    http://localhost:8080/requestParamDemo?userId=1111

        @RequestMapping("/requestParamDemo")
        @ResponseBody
        public String requestParamDemo(HttpSession session, 
                @RequestParam(name = "userId", required = true) String userId,
                @RequestParam(name = "userName", required = false, defaultValue = "unamed") String userName) {
            return "userId:" + userId + ", userName:" + userName;
        }

    -----------------------------------
    @RequestParam 示例2
    -----------------------------------
    @RequestParam 也可以注解数组或List容器类型的参数
    测试url为:
    http://localhost:8080/requestParamDemo2?userId=1111&roles=Admin,User
    http://localhost:8080/requestParamDemo2?userId=1111

        @RequestMapping("/requestParamDemo2")
        @ResponseBody
        public String requestParamDemo2(HttpSession session, 
                @RequestParam(name = "userId", required = true) String userId,
                @RequestParam(name = "roles", required = false, defaultValue = "Guest,UnknownRole") List<String> roles) {
            return "userId:" + userId + ", roles:" + String.join(",", roles);
        }

    ============================= 
    View 方法的返回类型
    ============================= 
    Spring MVC的view函数支持多种返回值类型:
    1. [非restful]返回值类型为 String 时: 返回值即为目标视图名, 完整的目标视图是: prefix前缀+返回值字符串+suffix后缀名.
    2. 返回值类型为 void/Map/Model/ModelMap 时: 真正的目标视图是: prefix前缀+方法名称+suffix后缀名. 
    3. 返回值类型为 ModelAndView 时: 真正的视图是通过 ModelAndView 对象设置的. 
    4. [restful]返回值类型为 String 时: 直接将string返回给 API 客户端
    5. [restful]返回值类型为 ResponseEntity<T> 时: 将返回对象json序列化后返回给API客户端.

    ============================= 
    View 方法如何向FreeMarker模版传值?
    ============================= 
    我们至少有两个方式可以向FreeMarker模版传值:
    1. 将任意类型对象压到Model/ModelMap/ModelAndView/Map中, 可以完成简单值/自定义对象/集合等的传值. 
    2. 通过 session.setAttribute() 或者 request.setAttribute(), 同样, 可以完成简单值/自定义对象/集合等的传值. 
    如果上面两个方式同时被使用, 优先取Model和ModelMap的传值(Model和ModelMap是同一个东西,谁最后赋值的就取谁的), 然后是request, 最后是从session中获取.

    request.getSession().setAttribute("test", "haiwei2Session");
    request.setAttribute("test", "haiwei1request"); 
    map.addAttribute("test", "haiweiModelMap");
    model.addAttribute("test", "haiweiModel");

    =============================
    页面跳转
    =============================
    常用的页面跳转方式有:
    1. 视图方法返回类型为 ModelAndView, 直接在 ModelAndView 返回值中设置目标页面
    2. 视图方法返回类型为 String, 直接用返回值确定目标页面
    3. 视图方式返回值类似于 "redirect:another_view", 重定向至 another_view 视图取进一步处理
    4. 视图方式返回值类似于 "forward:another_view", 请求转发至 another_view 视图取进一步处理

    redirect(重定向) 和 forward(请求转发) 简单区别:
    redirect 相当于有两次request. 要向给第二次request传值, 只能通过url传参方式为第二次request传值. 另外, 最后浏览器的url地址是重定向后的地址,
    forward 可以看作只有一次服务器和浏览器之间的 request. 请求转发全过程都在服务器端完成, 所以在转发之前, 可以通过request.setAttribute() 传值. 另外, 最后浏览器的url地址是最初的请求地址.

    @GetMapping("index/")
    public String index() {
        return "redirect:/form";
    }
        
    
    @GetMapping("index2/")
    public String index2() {
        return "forward:/form2";
    }   

    =============================
    参考
    =============================
    1. springMVC 返回类型选择 以及 SpringMVC中model,modelMap.request,session取值顺序 https://blog.csdn.net/zb0567/article/details/7921155
    2. @RequestParam @RequestBody @PathVariable 等参数绑定注解详解 https://blog.csdn.net/walkerJong/article/details/7946109
    3. Spring MVC@RequestMapping 方法所支持的参数类型和返回类型详解 https://www.tianmaying.com/tutorial/request-mapping-parameter-type
    4. SpringMVC强大的数据绑定(2)——第六章 注解式控制器详解——跟着开涛学SpringMVC http://jinnianshilongnian.iteye.com/blog/1705701
    5. freemarker迭代list、map等常规操作 https://blog.csdn.net/wickedvalley/article/details/65937189
    6. http://www.cnblogs.com/Hymen/p/3296952.html
    7. https://blog.csdn.net/xiangwanpeng/article/details/53069533
    8. https://www.jianshu.com/p/b4b2c38d31ee

  • 相关阅读:
    Kubernetes学习之路(十)之资源清单定义
    Kubernetes学习之路(十一)之Pod状态和生命周期管理
    Kubernetes学习之路(七)之Coredns和Dashboard二进制部署
    Kubernetes学习之路(九)之kubernetes命令式快速创建应用
    Kubernetes学习之路(八)之Kubeadm部署集群
    Ceph学习之路(三)Ceph luminous版本部署
    Kubernetes学习之路(六)之创建K8S应用
    Redis学习之路(二)之Redis入门基础
    Redis学习之路(一)之缓存知识体系
    OpenStack入门篇(二十二)之实现阿里云VPC的SDN网络
  • 原文地址:https://www.cnblogs.com/harrychinese/p/springboot_mvc_view_function2.html
Copyright © 2011-2022 走看看