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";
    }
}
相关推荐
小钊(求职中)4 小时前
Java开发实习面试笔试题(含答案)
java·开发语言·spring boot·spring·面试·tomcat·maven
林的快手8 小时前
伪类选择器
android·前端·css·chrome·ajax·html·json
拾忆,想起8 小时前
Spring 和 Spring MVC 的关系是什么?
java·spring boot·spring·spring cloud·微服务
best_virtuoso10 小时前
Mybatis MyBatis框架的缓存 一级缓存
spring·缓存·mybatis
逸狼12 小时前
【JavaEE进阶】Spring MVC(2)
spring·java-ee·mvc
m0_7482338813 小时前
使用 Logback 的最佳实践:`logback.xml` 与 `logback-spring.xml` 的区别与用法
xml·spring·logback
快乐就好ya13 小时前
Dfs分布式文件存储
java·spring boot·分布式·后端·spring·spring cloud
hong_zc15 小时前
Spring IoC
java·后端·spring
zhyhgx16 小时前
【Spring】详解Spring IOC&DI
java·spring boot·后端·spring·java-ee·intellij-idea
指尖下的技术17 小时前
SpringCloud面试题----为什么会产生Eureka的自我保护, 如何关闭自我保护机制
spring·spring cloud·eureka