Spring MVC/Web

1.Spring MVC 的介绍

Spring Web MVC是基于Servlet API构建的原始Web框架,也是Spring框架的一部分。它提供了灵活可扩展的MVC架构,方便开发者构建高性能的Web应用程序,并与 Spring 生态系统无缝集成。

2.MVC 设计模式

MVC(Model-View-Controller)是一种常见的软件设计模式,用于将应用程序的逻辑分离成三个独立的组件:

  • 模型(Model):模型是应用程序的数据和业务逻辑的表示。它负责处理数据的读取、存储和操作,以及业务规则的处理。模型通常是独立于用户界面的,可以在不同的视图和控制器之间共享和重用。
  • 视图(View):视图是用户界面的呈现部分,负责展示数据给用户,并接收用户的输入。视图通常是根据模型的数据进行渲染和更新的,它可以是Web页面、图形界面或命令行界面等。
  • 控制器(Controller):控制器是模型和视图之间的协调者,负责接收用户的输入并根据输入调用相应的模型逻辑。控制器将用户的请求转发给模型进行处理,并将处理结果传递给视图进行展示。控制器还可以处理视图的事件和状态变化

    MVC是一种思想,而Spring MVC是一种实现

    • 1.连接的功能:将⽤户(浏览器)和 Java 程序连接起来,也就是访问⼀个地址能够调⽤到我们的 Spring 程序。
    • 2.获取参数的功能:⽤户访问的时候会带⼀些参数,在程序中要想办法获取到参数。
    • 3.输出数据的功能:执⾏了业务逻辑之后,要把程序执⾏的结果返回给⽤户

      连接

      想要实现路由注册必须需要@Controller控制器注解

      给类设置路由需要@RequesMapping注解 提供路由地址

      @ResponseBody是说明返回的是一个非静态页面

      而@RestController注解是@Controller和@ResponseBody

      //只有Controller控制器才能实现路由注册
      //RestController和Controller能实现连接
      //@Controller //控制器 在spring启动时 加载并注册
      //@ResponseBody //返回的是一个非静态页面
      @RestController//是一个控制器 返回的是一个非静态数据 组合注解
      @RequestMapping("/web") //给当前类设置路由  当访问/web时 可以访问到当前类
      public class Demo1 {
      //    @ResponseBody //返回的是一个非静态页面
      //    @RequestMapping("/tweb") //可以支持get、post请求
          @RequestMapping(value = "/tweb",method = RequestMethod.GET) //指定get方法
          public Object test(){
              return "二级路由访问";
          }
      }

      返回一个静态页面 很少用得到

      @Controller
      public class Demo2 {
          @RequestMapping("/test2")
          public Object test2(){
              return "/index.html";
          }
      }

      static里需要此页面

      Get请求方法

      @RequestMapping("/tweb") //可以支持get、post请求
      @RequestMapping(value = "/tweb",method = RequestMethod.GET) //指定get方法
      @GetMapping("/tweb1")

      获取单个数据

      //这两种都支持获取单个参数 多个参数也可以
      //在Spring MVC中默认内置隐藏两个参数 一个是Request Response  如果想要使用 只需要在方法中声明即可
      //方式一
      @GetMapping("/tweb1") //只支持get方法
          public Object test1(HttpServletRequest request){
              return request.getParameter("name");
          }
      //方式二  推荐
          @GetMapping("/tweb2")
      //int不支持参数为空 Integer支持为空
          public Object test2(/*int*/ Integer age){//参数名必须相同 才能获取到
              return age;
          }
      @GetMapping("/tweb2")
      public String test2(/*int*/ Integer age,String name){//参数顺序不同不影响 只要保证key准确就可以
          return name+" "+age;
      }

      获取参数是对象形式

      参数请求类型

      • URL传参

      • Ajax传参

      • Form表单传参

        URL传参

        Form传参

        //使用参数
        @GetMapping("tweb4")
            public String test4(String name,Integer password){
                return name+" "+password;
            }
        //使用对象
        @GetMapping("/tweb4")
        public String test4(Student student){//保证前端传来的数据 类内有即可
            return student.toString();
        }

        Ajax传参

        @GetMapping("/tweb5")
        public Object tese5(String name,Integer password){
            User user=new User();
            user.setName(name);
            user.setPassword(password);
            return user;
        }

        普通得URL传参和JSON的格式是不同的

        url是在url传参,而JSON是在body内

        如果后端想接受JSON格式的,就需要使用@RequestBody注解 获取JSON格式

        后端接收前端传来的文件

        @GetMapping("/tweb6")
        //                   (key的名字 不是图片的名字) 获取key为myfile的文件 赋值给这个file
        public String test6(String name, @RequestPart("myfile") MultipartFile file) throws IOException {
            file.transferTo(new File("D:\\Spring Boot\\SpringMVCDemo1\\src\\main\\resources\\img.png"));
            return "success";
        }

        获取cookie

        //获取cookie
        @GetMapping("/tweb7")
                            //获取key为cookie的值 赋值给cookie
        public String test7(@CookieValue("cookie") String cookie){
            return cookie;
        }

        这里可以设置Cookie

        设置session

        //设置session
        @GetMapping("tweb9")
        public String test9(HttpServletRequest request){
            HttpSession session=request.getSession();
            if(session==null){
                session.setAttribute("username","wangwu");
            }
            return "创建成功";
        }

        获取/创建session

        @GetMapping("tweb8")
        //                                   如果有则返回 没有则创建 值为null
        public String test8(@SessionAttribute(value = "session",required = false) String session){
            return "session: "+session;
        }

        获取请求头内的数据

        //获取请求头内的数据
        @GetMapping("tweb10")
        //                   获取请求头内key为 Host的数据
        public String test10(@RequestHeader("Host") String head){
            return "head"+head;
        }

        获取URL内的参数

        只能获取层级的参数 无法获取?后面的参数

        更改URL参数

        //更改URL参数
        //当前的传的参数名不准确 可以通过后端来更正 (前端参数依旧是改不了 只是改了后端)
        @GetMapping("tweb11")
        // 前端参数名为a 当再传a时 识别成user               设置成false 非必传参数 这个参数不穿可以可以的
        //默认为true 必传参数         这时只能识别名为a的参数 依旧无法识别user的参数
        public String test11(@RequestParam(value = "a",required = false) String user){
            return "user: "+user;
        }

        请求转发和请求重定向的区别

        请求转发通常发生在服务器端,当一个服务器接收到请求后,它可能会将这个请求转发给另一个服务器或者服务来处理。这个过程对于客户端来说是透明的,客户端并不知道请求被转发了。转发过程发生在服务器之间,客户端只与第一个服务器通信。

        请求重定向发生在客户端和服务器之间的交互中。当服务器接收到一个请求后,它可能会告诉客户端需要重新向另一个URL发送请求。客户端接收到这个重定向指令后,会根据服务器提供的新URL重新发起请求。