Spring Web MVC

目录

[一.什么是Spring Web MVC ?](#一.什么是Spring Web MVC ?)

[二.什么是Spring MVC ?](#二.什么是Spring MVC ?)

[2.1 MVC定义:](#2.1 MVC定义:)

[2.2 Spring MVC 主要关注有两个点:](#2.2 Spring MVC 主要关注有两个点:)

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

[3.1学习Spring MVC的重点:](#3.1学习Spring MVC的重点:)

[3.2 建立连接:](#3.2 建立连接:)

[3.3 请求:](#3.3 请求:)

[3.3.1 传递单/多个参数](#3.3.1 传递单/多个参数)

[3.3.2 传递对象](#3.3.2 传递对象)

[3.3.3 传递数组](#3.3.3 传递数组)

[3.3.3 传递集合](#3.3.3 传递集合)

[3.3.4 传递JSON数据](#3.3.4 传递JSON数据)

[3.3.5 获取URL中参数@PathVariable](#3.3.5 获取URL中参数@PathVariable)

3.3.6上传⽂件@RequestPart

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

3.4响应

3.4.1返回静态界面:

[3.4.2 返回数据@ResponseBody](#3.4.2 返回数据@ResponseBody)

[3.4.3 返回JSON](#3.4.3 返回JSON)

[3.4.4 设置状态码](#3.4.4 设置状态码)

[3.4.5 设置Header (了解)](#3.4.5 设置Header (了解))


一.什么是Spring Web MVC ?

Spring Web MVC是基于Servlet API构建的原始Web框架(简单来说 Spring Web MVC是一个Web框架 )------ 简称:Spring MVC

二.什么是Spring MVC ?

2.1 MVC定义:

Mvc是 Model View Controller 的缩写,分为三基本部分:(控制器 模型 视图****)****

MVC可以说是一种思想,而Spring实现了这个思想称为Spring MVC

MVC的设计模式(图一):

图1

2.2 Spring MVC 主要关注有两个点:

  1. MVC
  2. Web框架

Spring MVC 全称是 Spring Web MVC

总结来说,Spring MVC 是⼀个实现了 MVC 模式的 Web 框架

Spring MVC设计模式(图二

图二

三.学习Spring MVC

3.1学习Spring MVC的重点:

如何通过浏览器和用户程序进行交互

重点主要分为三方面:

  1. 建立连接:将用户 (浏览器)和Java程序连接起来,通过访问地址能调用Spring程序
  2. 请求:Spring程序接收请求,获取参数的功能
  3. 响应:执行完业务逻辑后,把执行后的结果返回给用户,就是响应

3.2 建立连接:

通过 @RequestMapping 来实现URL路由映射, 浏览器连接程序的关键

@RequestMapping 既可修饰类,也可以修饰⽅法 ,当修饰类和⽅法时,访问的地址是类路径 + ⽅法路径.

java 复制代码
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.util.Arrays;
import java.util.List;


@RestController
public class RequestController{
    @RequestMapping("/r1")
    public String r1(){
        return "hello";
    }
}

⽅法名和路径名称⽆需⼀致

访问: http://127.0.0.1:8080/r1 可以查看程序返回的数据

java 复制代码
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.util.Arrays;
import java.util.List;

@RequestMapping("/calc")
@RestController
public class RequestController{
    @RequestMapping("/r1")
    public String r1(){
        return "hello";
    }
}

访问: http://127.0.0.1:8080/calc/r1 可以查看程序返回的数据

@RequsetMapping 即支持Get请求,又支持Post请求(也支持其他请求)

3.3 请求:

访问不同的路径,就是发送不同的请求, 发送请求时,可能需要传递参数。
所以学习Spring的请求, 主要是学习如何传递参数到后端以及后端如何接收

3.3.1 传递单/多个参数

java 复制代码
  @RequestMapping("/r4")
    public String r4(Integer id ,String name){
        return "接收参数 id:"+id+"  name: "+name;
    }

  @RequestMapping("/r9")
    public String r9(String name){
        return "接收参数:"+name;
    }

无论单个参数还是多个参数 双方名称必须一致

3.3.2 传递对象

java 复制代码
@RequestMapping( "/r3")
    public String r3(@RequestParam Student student){

        return "接收参数:"+student;
    }

//@RequestParam 必须传参

3.3.3 传递数组

Spring MVC可以自动绑定数组参数的赋值

java 复制代码
  @RequestMapping("/r2")
    public String r2(String [] name){
        return Arrays.toString(name);
    }

3.3.3 传递集合

跟传递数组基本差不多3.3.4

java 复制代码
@RequestMapping("/r6")
    //@RequestParam 必传参数
    public String r6(@RequestParam List<String> list){
        return "接收参数 list::"+list;
    }

3.3.4 传递JSON数据

JSON: JavaScript Object Notation 的缩写

JSON :本质是字符串,却有自己的风格和语法,使⽤⽂本表⽰⼀个对象或数组的信息

java 复制代码
  //RequestBody: 请求正⽂,意思是这个注解作⽤在请求正⽂的数据绑定,请求参数必须在写在请求正⽂中    
    @RequestMapping("/r10")
    public String r9(@RequestBody Student student){
        return "接收参数:"+student.toString();
    }

JSON字符串和JAVA对象互转 :

readValue:把JSON字符串转成对象

writeValueAsString:把对象转为JSON字符串

java 复制代码
public class JsonText {
    public static void main(String[] args) throws JsonProcessingException {
        ObjectMapper objectMapper = new ObjectMapper();
        String json ="{\"id\":10,\"name\":\"niha\",\"age\":5}";
        //JSON字符串转对象
        Student student = objectMapper.readValue(json, Student.class);
        System.out.println(student);
        //对象转字符串
        String s =objectMapper.writeValueAsString(student);
        System.out.println(s);
    }
}

JSON优点:
1.简单易用:语法简单,易于理解和编写,可以快速地进行数据交换
2. 跨平台支持:JSON可以被多种编程语言解析和生成,可以在不同的平台和语言之间进行数据交换和传输
3. 轻量级:相较于XML格式,JSON数据格式更加轻量级,传输数据时占用带宽较小,可以提高数据传输速度
4.易于扩展:JSON的数据结构灵活,支持嵌套对象和数组等复杂的数据结构,便于扩展和使用
5.安全性:JSON数据格式是一种纯文本格式,不包含可执行代码,不会执行恶意代码,因此具有较高的安全性

3.3.5 获取URL中参数@PathVariable

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

3.3.6上传⽂件@RequestPart

java 复制代码
   /*
     * 上传文件
     * @RequestParam("File")重命名
     * */
    @RequestMapping("/r8")
    public String r8(@RequestPart("File") MultipartFile jpgFile){
        String originalFilename = jpgFile.getOriginalFilename();
        return "接收到文件名称::"+originalFilename;
    }

3.3.7 获取Cookie/Session

首先要知道HTTP属于 "无状态" 协议

无状态的含义指:HTTP协议下的客户端和服务器的这次连接,与下次通信没有直接连接

HttpServletRequest , HttpServletResponse 是Servlet提供的两个类,是SpringMVC方法的内置对象.需要时直接在方法中添加声明即可.

HttpServletRequest 对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象提供的方法,可以获得客户端请求的所有信息.

HttpServletResponse 对象代表服务器的响应.HTTP响应的信息都在这个对象中,比如向客户

端发送的数据,响应头,状态码等.通过这个对象提供的方法,可以获得服务器响应的所有内容
获取Session:

java 复制代码
//设置session
    @RequestMapping("/setSess")
    public String setSession(HttpServletRequest  request ){
        //从cookie中获取SessionId,根据sessionId获取session对象,如果没有获取到,会创建一个session对象
        HttpSession session = request.getSession();

        session.setAttribute("name","zhangsan");


        return "设置session成功";
    }
    /*
获取session方法一
* */
    @RequestMapping("/getSess")
    public String getSession(HttpServletRequest  request ){
        HttpSession session = request.getSession();
        String name =(String) session.getAttribute("name");
        return "从session获取name:"+name;
    }
    /*
   获取session方法二
   HttpSession:封装获取sesionId方法
   * */
    @RequestMapping("/getSess2")
    public String getSession2(HttpSession session ){
        String name =(String) session.getAttribute("name");
        return "从session获取name:"+name;
   }
   /*
   获取session方法三
   注解@SessionAttribute:把获取sessionId和session对象全部封装在一起了
   * */
    @RequestMapping("/getSess3")
    public String getSession3(@SessionAttribute String name){
        return "从session获取name:"+name;
   }

获取Cookie :

java 复制代码
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import org.springframework.web.bind.annotation.*;

import java.util.Arrays;

@RestController
@RequestMapping("/session")
public class SessionController {
    @RequestMapping("/getCk")
    /*
    获取cookie方法一
    * */
    public String getCookie(HttpServletRequest request, HttpServletResponse response){
        String name = request.getParameter("name");
        Cookie[] cookies = request.getCookies();
        if(cookies != null){

            Arrays.stream(cookies).forEach(ck -> System.out.println(ck.getName()+": "+ck.getValue()));
        }
        return "获取cookie";
    }

    @RequestMapping("/getCk2")
    /*
    获取cookie方法二
    * */
    public String getCookie(@CookieValue("cookie") String cookie){
        
        return "获取cookie:  "+cookie;
    }
}

获取header:

java 复制代码
  /*
   * 获取header信息
   * */
    @RequestMapping("/getheader")
   public  String getHeader(@RequestHeader("User-Agent") String UserAgent){
       return "从header中获取信息:"+UserAgent;
   }

3.4响应

在我们前面的代码例子中,都已经设置了响应数据,Http响应结果可以是数据,也可以是静态页面,也可以针对响应设置状态码,Header信息等

3.4.1返回静态界面:

创建前端⻚⾯calc.html(注意路径)

  • @Controlller:返回视图
  • @ResponseBody:返回数据
  • @RestController = @Controlller + @ResponseBody

随着前后端分离,后端不需要处理页面,只需要返回页面所需要的数据

想要返回视图 ,我们需要把@Restcontroller改为@Controller

3.4.2 返回数据@ResponseBody

3.4.3 返回JSON

java 复制代码
/*
    * 返回JSON
    * */
    @RequestMapping("/returnJson")
    @ResponseBody
    public HashMap<String,String> returnJosn(){
        HashMap<String, String> map = new HashMap<>();
        map.put("Java", "Java Value");
        map.put("MySQL", "MySQL Value");
        map.put("Redis", "Redis Value");
        return map;
    }

3.4.4 设置状态码

SpringMVC会根据我们方法的返回结果自动设置响应状态码,程序员也可以手动指定状态码
通过SpringMVC的内置对象HttpServletResponse提供的方法来进行设置

java 复制代码
  /*
     * 设置状态码
     * */
    @RequestMapping(value = "/setStatus")
    @ResponseBody
    public String setStatus(HttpServletResponse response){
       response.setStatus(401);
       return "设置状态码成功 ";
    }

3.4.5 设置Header (了解)

Http响应报头也会向客户端传递一些附加信息,比如服务程序的名称,请求的资源已移动到新地址等,如:Content-Type, Local等.

这些信息通过 @RequestMapping 注解的属性来实现

1️⃣.设置Content-Type

java 复制代码
 @RequestMapping(value = "/returnJson2",produces = "application/json")
    @ResponseBody
    public String returnJson2() {
        return "{\"success\":true}";
    }
相关推荐
莫惊春4 分钟前
HTML5 第七章
前端·html·html5
莫惊春9 分钟前
HTML5 第六章
前端·html·html5
m0_7482565642 分钟前
前端新手教程:HTML、CSS 和 JavaScript 全面详解及实用案例
前端·css·html
幽兰的天空44 分钟前
HTML 基本语法
前端·html
啊松同学1 小时前
【Spring】使用@Async注解后导致的循环依赖问题
java·后端·spring
亦世凡华、2 小时前
从模型到视图:如何用 .NET Core MVC 构建完整 Web 应用
前端·经验分享·c#·mvc·.netcore
恋猫de小郭2 小时前
Flutter Web 正式移除 HTML renderer,只支持 CanvasKit 和 SkWasm
前端·flutter·html
CoderLiu2 小时前
用Rust写了一个GitLib代码分析工具
前端·git·rust
杨荧3 小时前
【开源免费】基于Vue和SpringBoot的图书进销存管理系统(附论文)
前端·javascript·vue.js·spring boot·spring cloud·java-ee·开源
:mnong3 小时前
从EXCEL表格到WEB TABLE的实践
前端