Lesson7:SpringMVC

目录

一、SpringMVC定义 

1.1 MVC定义

1.2 SpringMVC定义

1.3 MVC和SpringMVC的关系

1.4 学习目标

二、SpringMVC创建和连接

2.1 创建SpringMVC项目

2.2 设置SpringBoot热部署(使用IDEA自动部署最新的代码)

2.2.1 添加dev-tool框架支持

2.2.2 开启IDEA中当前项目的自动编译

2.2.3 开启运行时的热部署

2.2.4 使用debug来启动项目,而不是run (划重点)

2.3 创建一个UserController类,实现用户和Spring程序之间的连接

2.4 RequestMapping注解

2.4.1 RequestMapping 既可以修饰类,也可以修饰方法

2.4.2 RequestMapping默认情况下既支持GET请求,也支持POST请求

2.4.3 显示指定RequestMapping支持的请求(method="")

2.5 GET请求和POST请求的其他写法(@GetMapping 和 PostMapping)

2.5.1 GET请求的三种写法

2.5.2 POST请求的三种写法

三、获取参数

3.1 传递单个参数(直接使用方法里的参数实现传参)

3.2 传递对象

3.3 表单参数传递

3.4 后端参数重命名(@RequestParam)

3.5 设置参数必传和非必传(@RequestParam的required属性)

3.6 接收JSON对象(@RequestBody)

3.8 获取URL中的参数(@PathVariable)

3.9 上传文件(@RequestPart)

​3.10 获取Cookie、Session和header

四、返回数据

4.1 返回静态页面

4.2 返回text/html(@ResponseBody)

4.3 返回JSON对象

4.4 请求转发或请求重定向

4.5 @ResponseBody说明

4.6 组合注解@RestController

五、总结


一、SpringMVC定义 

1.1 MVC定义

MVC 是 Model View Controller 的缩写,它是软件⼯程中的⼀种软件架构模式,它把软件系统分为模型、视图和控制器三个基本部分。

Model (模型):是应用程序中用于处理应用程序数据逻辑的部分。通常模型对象负责在数据库中存取数据。
View (视图):是应用程序中处理数据显示的部分。通常视图是依据模型数据创建的。
Controller (控制器):是应用程序中处理用户交互的部分。通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。

1.2 SpringMVC定义

Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,从⼀开始就包含在 Spring 框架中。它 的正式名称“Spring Web MVC”来⾃其源模块的名称(Spring-webmvc),但它通常被称为“Spring MVC” 。

1.3 MVC和SpringMVC的关系

MVC 是⼀种思想,而Spring MVC 是对 MVC 思想的具体实现。 总结来说,Spring MVC 是⼀个实现了 MVC 模式,并继承了 Servlet API 的 Web 框架。既然是 Web 框架,那么当⽤户在浏览器中输⼊了 url 之后,Spring MVC 项⽬就可以感知到⽤户的请求。

1.4 学习目标

绝⼤部分的 Java 项⽬都是基于 Spring(或 Spring Boot)的,而 Spring 的核⼼就是 Spring MVC。因此,我们需要掌握SpringMVC的基础使用,主要包含三个方面:

连接:将用户(浏览器)和Java程序连接起来。是指通过一个url地址能够调用Spring程序。

从请求中获取参数:用户访问时会带一些参数,在处理请求时需要获取这些参数。

返回响应:执行了业务逻辑后,要把程序的执行结果返回给用户。

二、SpringMVC创建和连接

2.1 创建SpringMVC项目

SpringMVC可以基于SpringBoot创建。在创建SpringMVC时,勾选上SpringBoot模块即可。

2.2 设置SpringBoot热部署(使用IDEA自动部署最新的代码)

2.2.1 添加dev-tool框架支持

2.2.2 开启IDEA中当前项目的自动编译

2.2.3 开启运行时的热部署

2.2.4 使用debug来启动项目,而不是run (划重点)

修改代码后,等个3s左右,程序就会自动运行。 

2.3 创建一个UserController类,实现用户和Spring程序之间的连接

package com.example.demo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller  // 将UserController类加载到Spring容器中
@ResponseBody  // 让返回的响应是text/html,如果不加这个注解,默认返回的是一个网页的地址
@RequestMapping("/user")
public class UserController {
    @RequestMapping("/hello")
    public String sayHello(){
        return "<h1>hello springmvc</h1>";
    }
}

2.4 RequestMapping注解

从上面写的UserController类中可以看到,RequestMapping是用来配置路由的。

2.4.1 RequestMapping 既可以修饰类,也可以修饰方法

package com.example.demo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller  // 将UserController类加载到Spring容器中
@ResponseBody  // 让返回的响应是text/html,如果不加这个注解,默认返回的是一个网页的地址

public class UserController {
    @RequestMapping("/hello")
    public String sayHello(){
        return "<h1>hello springmvc</h1>";
    }
}

2.4.2 RequestMapping默认情况下既支持GET请求,也支持POST请求

2.3.1中举得例子就是发送的是get请求,接下来,使用PostMan发送一个post请求。观察RequestMapping是否支持。

因此可以得到结论,RequestMapping默认情况下既支持GET请求,也支持POST请求。

2.4.3 显示指定RequestMapping支持的请求(method="")

举个例子:显示指定RequestMapping只支持GET请求。

package com.example.demo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller  // 将UserController类加载到Spring容器中
@ResponseBody  // 让返回的响应是text/html,如果不加这个注解,默认返回的是一个网页的地址
public class UserController {
    @RequestMapping(value = "/user",method = RequestMethod.GET)
    public String sayHello(){
        return "<h1>hello springmvc</h1>";
    }
}

当使用PostMan发送一个POST请求,会出现404.证明此时只能接收到get请求。

2.5 GET请求和POST请求的其他写法(@GetMapping 和 PostMapping)

2.5.1 GET请求的三种写法

// 写法1
    @RequestMapping(value = "/user",method = RequestMethod.GET)
    public String sayHello1(){
        return "<h1>hello springmvc</h1>";
    }

    // 写法2
    @RequestMapping("/user2")
    public String sayHello2(){
        return "<h1>hello springmvc2</h1>";
    }

    // 写法3
    @GetMapping("/user3")
    public String sayHello3(){
        return "<h1>hello springmvc3</h1>";
    }

2.5.2 POST请求的三种写法

    // 写法1
    @RequestMapping(value = "/user",method = RequestMethod.POST)
    public String sayHello1(){
        return "<h1>hello springmvc</h1>";
    }

    // 写法2
    @RequestMapping("/user2")
    public String sayHello2(){
        return "<h1>hello springmvc2</h1>";
    }

    // 写法3
    @PostMapping("/user3")
    public String sayHello3(){
        return "<h1>hello springmvc3</h1>";
    }

三、获取参数

3.1 传递单个参数(直接使用方法里的参数实现传参)

    @RequestMapping("/getUsername")
    public String getUsername(String username){
        return "请求中的username = " + username;
    }

 注意:

3.2 传递对象

step1:先创建一个User类

package com.example.demo.controller;
import lombok.Data;
@Data
public class User {
    private String userName;
    private String password;
    private int age;
}

step2:传递对象代码

    @RequestMapping("/getUserInfo")
    public String getUserInfo(User user){
        return user.toString();
    }

step3:前端访问结果

3.3 表单参数传递

    @RequestMapping("/login1")
    @ResponseBody
    public String login(String username,String password){
        return "username="+username + "  password=" + password;
    }

 

3.4 后端参数重命名(@RequestParam)

在某些特殊的情况下,前端传递的参数和后端接收的参数可以不一样。如果不做任何操作,就会导致参数接收不到。我们需要使用@RequestParam来重命名前后端的参数值。

    @RequestMapping("/getUsername3")
    public String getUsername3(@RequestParam("username") String name){
        return "请求中的username = " + name;
    }

3.5 设置参数必传和非必传(@RequestParam的required属性)

    // 参数非必传
    @RequestMapping("/getUsername3")
    public String getUsername3(@RequestParam(value = "username",required = false) String name){
        return "请求中的username = " + name;
    }
    // 参数必传
    @RequestMapping("/getUsername4")
    public String getUsername4(@RequestParam(value = "username",required = true) String name){
        return "请求中的username = " + name;
    }

3.6 接收JSON对象(@RequestBody)

    @RequestMapping("/getJson")
    public String getJson(@RequestBody User user){
        return user.toString();
    }

注意:必须使用一个对象来接收json请求。 

3.8 获取URL中的参数(@PathVariable)

    @PostMapping("getpara/{name}/{password}")
    public String getParaURL(@PathVariable String name,
                             @PathVariable String password){
        return name+password;
    }

 3.9 上传文件(@RequestPart)

    @RequestMapping("/upfile")
    public String upfile(Integer id , @RequestPart("photo") MultipartFile file) throws IOException {
        // 生成一个唯一的UUID
        String fileName = UUID.randomUUID().toString();
        // 得到文件的后缀名
        String fileType = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
        fileName  += fileType;
        file.transferTo(new File("D:\\"+fileName));
        return id+"上传成功";
    }

3.10 获取Cookie、Session和header

传统的获取Cookie、Session和header的方法和servlet提供的方法一致,是指从req中获取对应的参数,这种方法比较复杂。利用注解可以更简单的获取这三个参数。

    // 获取Cookie
    @RequestMapping("/getCookie")
    public String getCookie(@CookieValue String name){
        return name;
    }
    // 获取Header
    @RequestMapping("/getHeader")
    public String getHeader(@RequestHeader String header){
        return header;
    }
    // 获取Session
    @RequestMapping("/getSession")
    public String getSession(@SessionAttribute(value = "username",required = false) String username){
        return username;
    }

四、返回数据

4.1 返回静态页面

以前前后端不分离,默认请求下Spring MVC和Spring Boot返回的都是页面。现在前后端已经分离了,因此,后端只需要返回给前端数据即可。此时需要用到@ResponseBody注解。

不加@ResponseBody,返回的就是静态页面。

    @RequestMapping("/staticPage")
    public String returnStatic(){
        return "/login.html";
    }

4.2 返回text/html(@ResponseBody)

    @RequestMapping("/htmlPage")
    @ResponseBody
    public String returnHtml(){
        return "<h1>六一快乐</h1>";
    }

4.3 返回JSON对象

    @RequestMapping("/htmlJson")
    @ResponseBody
    public HashMap<String,String> returnJson(){
        HashMap<String,String> hashMap = new HashMap<>();
        hashMap.put("a","apple");
        hashMap.put("b","boy");
        return hashMap;
    }

4.4 请求转发或请求重定向

return不仅可以返回一个视图,还可以实现页面跳转。跳转的方式有两种:forward(请求转发)、redirect(请求重定向)

    @RequestMapping("/forwardTry")
    public String forwardTry(){
        return "forward:/login.html";
    }

    @RequestMapping("/redirectTry")
    public String redirectTry(){
        return "redirect:/login.html";
    }

对比:

①请求重定向(redirect)将请求重新定位到资源;请求转发(forward)服务器端转发。

②请求重定向地址发⽣变化,请求转发地址不发⽣变化。

③请求重定向与直接访问新地址效果一样,不存在原来的外部资源不能访问;请求转发服务器端转发有可能造成原外部资源不能访问。

4.5 @ResponseBody说明

@ResponseBody 返回的值如果是字符会转换成 text/html,如果返回的是对象会转换成

application/json 返回给前端。

@ResponseBody 可以⽤来修饰⽅法或者是修饰类,修饰类表示类中的所有⽅法都会返回 html 或者 json,⽽不是视图。

4.6 组合注解@RestController

@RestController = @Controller + @ResponseBody

五、总结

介绍了SpringMVC的概念,即SpringMVC是基于Servlet的原始框架。
介绍了SpringMVC项目的构建和连接,介绍了如何设置SpringBoot热部署,即使用IDEA自动部署最新的代码。
介绍了使用@RequestMapping、@GetMapping、@PostMapping三种注解处理get和post请求。
介绍了传递单个参数、传递对象、传递表单参数、传递Json对象、传递文件、URL、Cookie、Session、header这些参数的获取方法。
介绍了如何返回静态页面、text/html、JSON对象以及重定向和转发。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘减减

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值