Spring Web MVC入门

目录

[学习Spring MVC](#学习Spring MVC)

一、建立连接

@RestController和@RequestMapping

[@RequestMapping 使用](#@RequestMapping 使用)

访问地址:类路径+方法路径

既支持Get请求又支持Post请求

⭐️指定GET方法类型

🌙指定POST方法类型

二、请求

1️⃣传递单个参数

2️⃣传递多个参数

​3️⃣传递对象

4️⃣后端参数重命名(后端参数映射)

非必传参数设置

5️⃣传递数组

6️⃣传递集合

7️⃣传递JSON数据

JSON字符串和Java对象互转

​传递JSON对象

传递对象和传递JSON的区别

8️⃣获取URL中参数@PathVariable

​ 参数重命名

9️⃣上传文件@RequestPart

​ 参数重命名

[🔟 获取Cookie/Session](#🔟 获取Cookie/Session)

[​📝面经: Cookie 和 Session 的区别](#📝面经: Cookie 和 Session 的区别)

获取Cookie

🍃传统获取Cookie

​🍂简洁获取Cookie:@CookieValue

Session存储

获取Session

🍈方式一:

🍒方式二:

[🥥方式三: @SessionAttribute](#🥥方式三: @SessionAttribute)

1️⃣1️⃣获取Header

[🌭传统获取 header](#🌭传统获取 header)

[🍔简洁获取 Header:@RequestHeader](#🍔简洁获取 Header:@RequestHeader)

三、响应

返回静态页面:@Controller

前端代码

后端代码

返回数据:@ResponseBody

返回HTML代码片段

返回JSON

设置状态码

设置Header (了解)

设置Content-Type

设置其他Header


Spring Web MVC咱们简称之为: Spring MVC

Spring MVC 是⼀个实现了 MVC 模式的 Web 框架

学习Spring MVC

一、建立连接

将用户(浏览器)和 Java 程序连接起来,也就是访问⼀个地址能够调用到我们的Spring 程序

@RestController和@RequestMapping

java 复制代码
@RestController
public class UserController {
    @RequestMapping("/hello")
    public String sayHello() {
        return "Hello Spring";
    }
}

@RequestMapping 使用

访问地址:类路径+方法路径
java 复制代码
@RestController
@RequestMapping("/user")
public class UserController {
    @RequestMapping("/hello")
    public String sayHello() {
        return "Hello Spring";
    }
}
既支持Get请求又支持Post请求
⭐️指定GET方法类型
java 复制代码
@RestController
@RequestMapping("/user")
public class UserController {
    @RequestMapping(value = "/hello", method = RequestMethod.GET)
    public String sayHello() {
        return "Hello Spring";
    }
}

@GetMapping

java 复制代码
@RestController
@RequestMapping("/user")
public class UserController {
    @GetMapping("/hello")
    public String sayHello() {
        return "Hello Spring";
    }
}
🌙指定POST方法类型
java 复制代码
@RestController
@RequestMapping("/user")
public class UserController {
    @RequestMapping(value = "/hello", method = RequestMethod.POST)
    public String sayHello() {
        return "Hello Spring";
    }
}

@PostMapping

java 复制代码
@RestController
@RequestMapping("/user")
public class UserController {
    @PostMapping("/hello")
    public String sayHello() {
        return "Hello Spring";
    }
}

二、请求

用户请求的时候会带⼀些参数,在程序中要想办法获取到参数,所以请求这块主要是获取参数的功能

传递的普通参数,默认类型为String,后端接收时,会根据后端定义的类型来转换

1️⃣传递单个参数

java 复制代码
@RequestMapping("/param")
@RestController
public class ParamController {
    @RequestMapping("/p1")
    public String p1(String name) {
        return "接收到参数 name:" + name;
    }
}

2️⃣传递多个参数

java 复制代码
@RequestMapping("/param")
@RestController
public class ParamController {
    @RequestMapping("/p2")
    public String p2(String name, Integer age) {
        return "接收到参数,age:" + age + ", name:" + name;
    }
}

3️⃣传递对象

java 复制代码
public class User {
   private String name;
   private Integer age;
   private Integer gender;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Integer getGender() {
        return gender;
    }

    public void setGender(Integer gender) {
        this.gender = gender;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", gender=" + gender +
                '}';
    }
}

java 复制代码
@RequestMapping("/param")
@RestController
public class ParamController {
    @RequestMapping("/p3")
    public String p3(User user) {
        return "user:" + user;
    }
}

4️⃣后端参数重命名(后端参数映射)

java 复制代码
@RequestMapping("/param")
@RestController
public class ParamController {
    @RequestMapping("/p4")
    public String p4(@RequestParam("userName") String name, Integer age) {
        return "接收到参数,age:" + age + ", name:" + name;
    }
}

使用@RequestParam进行参数重命名时,请求参数只能和@RequestParam声明的名称一

致,才能进行参数绑定和赋值.

使用@RequestParam进行参数重命名时,参数就变成了必传参数.

非必传参数设置
java 复制代码
@RequestMapping("/param")
@RestController
public class ParamController {
    @RequestMapping("/p4")
    public String p4(@RequestParam(value = "userName", required = false) String name, Integer age) {
        return "接收到参数,age:" + age + ", name:" + name;
    }
}

5️⃣传递数组

java 复制代码
@RequestMapping("/param")
@RestController
public class ParamController {
    @RequestMapping("/p5")
    public String p5(String[] arr) {
        return "arr:" + List.of(arr);
    }
}

6️⃣传递集合

java 复制代码
@RequestMapping("/param")
@RestController
public class ParamController {
    @RequestMapping("/p6")
    public String p6(@RequestParam List<String> list) {
        return "list:" + list;
    }
}

7️⃣传递JSON数据

JSON字符串和Java对象互转
java 复制代码
package com.example.demo;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

public class JsonTest {
    public static void main(String[] args) throws JsonProcessingException {
        ObjectMapper objectMapper = new ObjectMapper();

        User user = new User();
        user.setName("lisi");
        user.setAge(18);
        user.setGender(1);

        // 对象转json
        String s = objectMapper.writeValueAsString(user);
        System.out.println(s);

        //json转对象
        User user1 = objectMapper.readValue(s, User.class);
        System.out.println(user1);
    }
}

传递JSON对象

@RequestBody

java 复制代码
@RequestMapping("/param")
@RestController
public class ParamController {
    @RequestMapping("/p7")
    public String p7(@RequestBody User user) {//从请求正文中
        return "User:" + user;
    }
}
传递对象和传递JSON的区别

8️⃣获取URL中参数@PathVariable

java 复制代码
@RequestMapping("/param")
@RestController
public class ParamController {
    @RequestMapping("/article/{articleId}")
    public String p8(@PathVariable("articleId") String articleId) {//从请求正文中
        return "articleId:" + articleId;
    }
}
参数重命名
java 复制代码
@RequestMapping("/param")
@RestController
public class ParamController {
    @RequestMapping("/article/{articleId}/{name}")
    public String p8(@PathVariable("articleId") String id, @PathVariable String name) {//从请求正文中
        return "articleId:" + id + ",name:" + name;
    }
}

如果方法参数名称和需要绑定的URL中的变量名称一致时,可以简写, 不用给@PathVariable的属性赋值

如果方法参数名称和需要绑定的URL中的变量名称不一致时, 需要给@PathVariable的属性value赋值

9️⃣上传文件@RequestPart

java 复制代码
@RequestMapping("/param")
@RestController
public class ParamController {
    @RequestMapping("/p9")
    public String p9(MultipartFile file) {
        System.out.println(file.getOriginalFilename());
        return "文件名称:" + file.getOriginalFilename();
    }
}
参数重命名
java 复制代码
@RequestMapping("/param")
@RestController
public class ParamController {
    @RequestMapping("/p9")
    public String p9(@RequestPart("fileName") MultipartFile file) {
        System.out.println(file.getOriginalFilename());
        return "文件名称:" + file.getOriginalFilename();
    }
}

🔟 获取Cookie/Session

●Cookie是客户端保存用户信息的一种机制.Session是服务器端保存用户信息的一种机制.

●Cookie和Session之间主要是通过Sessionld关联起来的,Sessionld是Cookie和Session之间的桥梁

●Cookie和Session经常会在一起配合使用.但是不是必须配合.

o 完全可以用Cookie来保存一些数据在客户端.这些数据不一定是用户身份信息,也不一定是Sessionld

o Session中的sessionld也不需要非得通过Cookie/Set-Cookie传递,比如通过URL传递.

获取Cookie
🍃传统获取Cookie
java 复制代码
@RestController
@RequestMapping("/header")
public class HeaderController {
    @RequestMapping("/getCookie")
    public String getCookie(HttpServletRequest request) {
        Cookie[] cookies = request.getCookies();
        if (cookies != null) {
            for (Cookie cookie : cookies) {
                System.out.println(cookie.getName() + ":" + cookie.getValue());
            }
        }
        return "获取cookie成功";
    }
}

🍂简洁获取Cookie:@CookieValue

java 复制代码
@RestController
@RequestMapping("/header")
public class HeaderController {
    @RequestMapping("/getCookie")
    public String getCookie2(@CookieValue("baidu") String baidu) {
        return "从Cookie中获取信息,baidu:" + baidu;
    }
}
Session存储
java 复制代码
@RestController
@RequestMapping("/header")
public class HeaderController {
    @RequestMapping("/setSession")
    public String setSession(HttpServletRequest request) {
        HttpSession session = request.getSession();
        session.setAttribute("userName", "zhangsan");
        session.setAttribute("age", "15");
        return "设置session成功";
    }
}
获取Session
🍈方式一:
java 复制代码
@RequestMapping("/getSession")
    public String getSession(HttpServletRequest request) {
        HttpSession session = request.getSession();
        if (session != null) {
            String userName = (String) session.getAttribute("userName");
            System.out.println(session.getAttribute("age"));
            return "从session中获取信息,userName:" + userName;
        }
        return null;
    }
🍒方式二:
java 复制代码
@RequestMapping("/getSession")
    public String getSession(HttpSession session) {
        if (session != null) {
            String userName = (String) session.getAttribute("userName");
            System.out.println(session.getAttribute("age"));
            return "从session中获取信息,userName:" + userName;
        }
        return null;
    }
🥥方式三: @SessionAttribute
java 复制代码
@RequestMapping("/getSession")
    public String getSession(@SessionAttribute("userName") String userName) {
        return "从session中获取信息,userName:" + userName;
    }

1️⃣1️⃣获取Header

🌭传统获取 header
java 复制代码
@RestController
@RequestMapping("/header")
public class HeaderController {
    @RequestMapping("/getHeader")
    public String getHeader(HttpServletRequest request) {
        String uesrAgent = request.getHeader("User-Agent");
        return "uesrAgent:" + uesrAgent;
    }
}
🍔简洁获取 Header:@RequestHeader
java 复制代码
@RestController
@RequestMapping("/header")
public class HeaderController {
    @RequestMapping("/getHeader")
    public String getHeader(@RequestHeader("User-Agent") String uesrAgent) {
        return "uesrAgent:" + uesrAgent;
    }
}

三、响应

返回静态页面:@Controller

前端代码
后端代码
java 复制代码
@RequestMapping("/response")
@Controller
public class ResponseController {
    @RequestMapping("/returnHtmlPage")
    public String returnHtmlPage() {
        return "/hello.html";
    }
}

返回数据:@ResponseBody

java 复制代码
@RequestMapping("/response")
@Controller
@ResponseBody
public class ResponseController {
    @RequestMapping("/returnHtmlPage")
    public String returnHtmlPage() {
        return "/hello.html";
    }
}

返回HTML代码片段

java 复制代码
@RequestMapping("/response")
@Controller
@ResponseBody
public class ResponseController {
    @RequestMapping("/returnHtml")
    public String returnHtml() {
        return "<h1>returnHtml<h1>";
    }
}

返回JSON

java 复制代码
@RequestMapping("/response")
@Controller
@ResponseBody
public class ResponseController {
    @RequestMapping("/returnJson")
    public User returnJson() {
        User user = new User();
        user.setName("zhangsan");
        user.setAge(18);
        return user;
    }
}

设置状态码

java 复制代码
@RequestMapping("/response")
@Controller
@ResponseBody
public class ResponseController {
    @RequestMapping("/setStatus")
    public User setStatus(HttpServletResponse response) {
        User user = new User();
        user.setName("zhangsan");
        user.setAge(18);
        response.setStatus(500);
        return user;
    }
}

设置Header (了解)

设置Content-Type
java 复制代码
@RequestMapping("/response")
@Controller
@ResponseBody
public class ResponseController {
    @RequestMapping("/setHeader")
    public String setHeader() {
        return "{\"success\":true}";
    }
}

java 复制代码
@RequestMapping("/response")
@Controller
@ResponseBody
public class ResponseController {
    @RequestMapping(value = "/setHeader",produces = "application/json")
    public String setHeader() {
        return "{\"success\":true}";
    }
}
设置其他Header
java 复制代码
@RequestMapping("/response")
@Controller
@ResponseBody
public class ResponseController {
    @RequestMapping("/setHeader")
    public String setHeader(HttpServletResponse response) {
        response.setHeader("myKey", "myValue");
        return "success";
    }
}
相关推荐
我爱996!1 小时前
Spring IoC&DI
java·后端·spring
我命由我123453 小时前
Spring Boot 项目问题:Web server failed to start. Port 5566 was already in use.
java·前端·jvm·spring boot·后端·spring·java-ee
_码农121384 小时前
使用mybatis生成器生成实体类mapper和查询参数文件,简单spring mvc 项目。使用log4j输出日志到控制台和文件中。使用配置文件注册Bean
spring·mvc·mybatis
拷斤锟5 小时前
使用Excel解析从OData API获取到的JSON数据
数据库·json·excel
励志成为糕手6 小时前
深入剖析Spring IOC容器——原理、源码与实践全解析
java·开发语言·spring
杨DaB9 小时前
【SpringMVC】拦截器,实现小型登录验证
java·开发语言·后端·servlet·mvc
小宋102113 小时前
多线程向设备发送数据
java·spring·多线程
鹦鹉00715 小时前
SpringMVC的基本使用
java·spring·html·jsp
橘子编程18 小时前
SpringMVC核心原理与实战指南
java·spring boot·spring·tomcat·mybatis
程序猿小D19 小时前
Java项目:基于SSM框架实现的校园活动资讯网管理系统【ssm+B/S架构+源码+数据库+毕业论文+远程部署】
java·数据库·mysql·spring·毕业设计·ssm框架·校园活动