【Java】Spring Boot下的MVC

news2025/1/16 1:02:44

文章目录

  • Spring MVC程序开发
    • 1. 什么是Spring MVC?
      • 1.1 MVC定义
      • 1.2 MVC 和 Spring MVC 的关系
    • 2. 为什么学习Spring MVC?
    • 3. 怎么学习Spring MVC?
      • 3.1 Spring MVC的创建和连接
        • 3.1.1 创建Spring MVC项目
        • 3.1.2 @RequestMapping 注解介绍
        • 3.1.3 @RequestMapping是post 还是 get请求?
        • 3.1.4 @GetMapping 和 @PostMapping
      • 3.2 获取参数
        • 3.2.1 传递单个参数
        • 3.2.2 传递对象
        • 3.2.3 表单参数传递/传递多个参数
        • 3.2.4 后端参数重命名
        • 3.2.5 设置参数必传
        • 3.2.6 @RequestBody接收JSON对象
        • 3.2.7 获取URL当中的参数@PathVarible
        • 3.2.8 上传文件@RequestPart
        • 3.2.9 获取Cookie/Session/header
      • 3.3 返回数据
        • 3.3.1 返回静态页面
        • 3.3.2 请求转发和请求重定向
        • 3.3.3 @ResponseBody说明

Spring MVC程序开发

1. 什么是Spring MVC?

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

从上述定义我们可以看到两个信息:

  1. Spring MVC 是一个Web框架
  2. Spring MVC 是基于Servlet API构建的

然而要真正的搞懂Spring MVC?我们要先理解什么是MVC?

1.1 MVC定义

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

在这里插入图片描述

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

1.2 MVC 和 Spring MVC 的关系

MVC是一种思想,而Spring MVC是对MVC思想的具体实现

总结来说,Spring MVC是实现了一个MVC模式,并继承了Servlet API的Web框架。既然是Web框架,那么用户在浏览器当中输入URL之后,我们的Spring MVC项目就可以感知到用户的请求

2. 为什么学习Spring MVC?

现在绝大部分的Java项目都是基于Spring或者是(Spring Boot)的,而Spring的核心是Spring MVC也就是说Spring MVC是Spring框架的一个核心模块,而Spring Boot是Spring的脚手架。因此我们可以推断出,现在市面上的绝大部分Java项目约等于Spring MVC项目,这就是学习它的原因

在创建Spring Boot项目的时候,我们勾选的Spring Web框架其实就是Spring MVC框架,

在这里插入图片描述

简单来说,咱是所以要学习Spring MVC是因为它是一切项目的基础,我们以后创建的Spring、Spring Boot项目都是基于Spring MVC的

3. 怎么学习Spring MVC?

学习Spring MVC我们只需要掌握3个功能:

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

3.1 Spring MVC的创建和连接

Spring MVC项目创建和Spring Boot项目创建相同(Spring MVC 和Spring Boot的方式相同)在创建的时候选择Spring Web就相当于创建了Spring MVC项目

在Spring MVC当中使用@RequestMapping来实现URL路由映射,也就是浏览器连接程序的作用

3.1.1 创建Spring MVC项目

创建Spring Boot项目的时候勾选上Spring Web模块即可

@Controller
@RequestMapping("/user")
public class UserController {
    
    @RequestMapping("sayhi")
    @ResponseBody
    public String sayHi() {
        return "你好 世界";
    }
}

实现之后访问地址:http://localhost:8080/user/sayhi就可以访问了

3.1.2 @RequestMapping 注解介绍

@RequestMapping是Spring Web应用程序当中最常被用的注解之一,它是用来注册接口的路由映射的

路由映射:所谓的路由映射指的是,当用户访问一个URL时,将用户的请求对应到程序中某个类的某个方法的过程就叫做路由映射

@RequestMapping的基础使用

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
@RequestMapping("/user")
public class UserController {

    @RequestMapping("sayhi")
    @ResponseBody
    public String sayHi() {
        return "你好 世界";
    }

    @ResponseBody
    @RequestMapping(method = RequestMethod.POST, value = "/sayhi2")
    public String sayHi2() {
        return "你好,世界";
    }
}

@RequestMapping既可以就是类,也可以修饰方法,当修饰类和方法的时候,访问的地址是类 + 方法

3.1.3 @RequestMapping是post 还是 get请求?

经过测试之后,我们可以发现是都可以支持的

我们可以指定方法类型

在这里插入图片描述

3.1.4 @GetMapping 和 @PostMapping

三种实现方式:

@RequestMapping("sayhi")
@ResponseBody
public String sayHi() {
    return "你好 世界";
}

@ResponseBody
@RequestMapping(method = RequestMethod.POST, value = "/sayhi2")
public String sayHi2() {
    return "你好,世界";
}

@ResponseBody
@PostMapping("/sayhi3")
public String sayHi3() {
    return "你好,世界3 ";
}

3.2 获取参数

3.2.1 传递单个参数

在Spring MVC中可以直接用方法中的参数来实现传参,比如以下代码

@ResponseBody
@RequestMapping("/getuserinfoid")
public UserInfo getUserInfoId(Integer id) {
    UserInfo userInfo = new UserInfo();
    userInfo.setId(id);
    userInfo.setName("张三");
    userInfo.setAge(18);
    userInfo.setPassword("1234");
    return userInfo;
}

访问的结果是:

在这里插入图片描述

3.2.2 传递对象

Spring MVC可以自动实现参数对象的赋值

@ResponseBody
@RequestMapping("/reg")
public UserInfo reg(UserInfo userInfo) {
    return userInfo;
}

3.2.3 表单参数传递/传递多个参数

@ResponseBody
@RequestMapping("/login")
public String login(String name, String password) {
    return "name: " + name + "password: " + password;
}

3.2.4 后端参数重命名

某些情况下,前端传递的参数key和后端接收的key可以不一致

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

3.2.5 设置参数必传

默认情况下,是必须要传递的,

我们可以设置成非必传参数

如果我们的实际业务前端的参数是一个非必传参数,我们可以这样操作

在这里插入图片描述

3.2.6 @RequestBody接收JSON对象

在这里插入图片描述

如果没有加上这一个注解,就会接收不到

在这里插入图片描述

3.2.7 获取URL当中的参数@PathVarible

代码实现:

@RequestMapping("/hero/{id}/{name}")
public String getHeroInfo(@PathVariable String id, @PathVariable String name) {
    return "id" + id + "name" + name;
}

地址填写方法:

在这里插入图片描述

3.2.8 上传文件@RequestPart

@RequestMapping("/upimg")
public boolean upImg(Integer uid, @RequestPart("img") MultipartFile file) {
    boolean result = false;
    String fileName = file.getOriginalFilename();// 得到图片名字
    fileName = fileName.substring(fileName.lastIndexOf(".")); // 得到后缀
    fileName = UUID.randomUUID().toString() + fileName;
    try {
        file.transferTo(new File ("D://"));
        result = true;
    } catch (IOException e) {
        e.printStackTrace();
        log.error("上传错误" + e.getMessage());
    }
    return result;
}

3.2.9 获取Cookie/Session/header

获取cookie:

@ResponseBody
@RequestMapping("/cookie")
public String getCookie(@CookieValue("bit") String bite) {
    return bite;
}

获取header:

使用注解:@RequestHeader

Session的存储和获取:

Session的存储我们只能使用传统的方式,但是Session的获取我们可以使用注解完成@SessionAttribute

3.3 返回数据

3.3.1 返回静态页面

在这里插入图片描述

这时候如果要返回一个“hello.html”,这时候返回的是一个同名的页面。所以我们在使用的时候都要加上一个注解ResponseBody

这里我们设置一个实用的技巧:热部署

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

3.3.2 请求转发和请求重定向

forward VS redirect

return 不但可以返回一个视图,还可以实现跳转,跳转的方式有两种:

  • forward 是请求转发
  • redirect 请求重定向

“转发”和“重定向”的理解:在中国官方发布的内容越少事情越大,“转发”和“重定向“也是一样:字越少,责任越大。转发是服务器帮忙转发的,而重定向是让浏览器重新请求另一个地址

具体区别如下:

  1. 请求重定向(redirect)将请求重新定位到资源;请求转发(forward)服务器端转发
  2. 请求重定向地址发生变化,请求转发地址不发生变化
  3. 请求重定向与直接访问新地址效果一致,不存在原来的外部资源不能访问;请求转发服务器端转发有可能造成外部资源不能访问

3.3.3 @ResponseBody说明

@ResponseBody返回的值如果是字符会变成text/html,如果是对象会转成appllcation/json返回给前端

@ResponseBody可以用来修饰方法或者修饰类,修饰类表示类中的所有方法都会返回html或者JSON而不是视图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/387643.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1 网关介绍

网关介绍 在微服务架构中,一个系统会被拆分为很多个微服务。那么作为客户端要如何去调用这么多的微服务呢?如果没有网关的存在,我们只能在客户端记录每个微服务的地址,然后分别去调用。这样的话会产生很多问题,例如&a…

Threejs 创建的透明球体与模型前后看起来重叠解决方案

创建了球体透明的位置在后面例如 x: -2.2, y: 6, z: 0, 加载的模型在前面x: 2, y: 1, z: 13 ,创建的发光精灵 let spriteMaterial new THREE.SpriteMaterial({ map: spriteTexture, color: object.color, transparent: true, depthWrite: false, //深度写入属性 d…

SpringMVC中JSON数据的设置、RestFul风格

Java知识点总结:想看的可以从这里进入 目录3.4、JSON数据3.4.1、前端使用3.4.2、后端使用1、Jackson2、fastjson3.5、RestFul风格3.5.1、简介3.5.2、使用3.4、JSON数据 3.4.1、前端使用 前端在JavaScript中有封装的JSON对象,可以直接用来操作JSON数据。…

JavaSE之集合篇

文章目录前言一、集合概述集合继承结构图二、Collection接口中常用方法2.1Collection中存放什么元素?2.2常用方法2.3迭代器三、List接口中常用的方法四、ArrayList初始化容量及扩容五、Vector六、Map接口常用方法七、Properties前言 由于在刷题过程中,经…

大型三甲医院云HIS系统源码 强大的电子病历+完整文档

医院HIS系统源码云HIS系统:SaaS运维平台多医院入驻强大的电子病历完整文档 有源码,有演示 一、系统概述 采用主流成熟技术,软件结构简洁、代码规范易阅读,SaaS应用,全浏览器访问前后端分离,多服务协同&am…

使用AppSmith(PagePlug )低代码平台快速构建小程序应用实践

文章目录一、入门(一)介绍(二)功能特性(三)体验一下(四)参考教程二、使用Appsmith构建商城微信小程序(一)说明(二)应用配置&#xff0…

安卓逆向_5 --- jeb 和 AndroidStudio 动态调试 smali

Jeb 工具的使用 :https://www.52pojie.cn/forum.php?modviewthread&tid742250:https://zhuanlan.zhihu.com/p/302856081动态调试 smali 有两种方法: Jeb 调试AndroidStudio smalidea 插件动态调试。1、Jeb 动态调试 smali ​JEB是一个…

LeetCode 236.二叉树的最近公共祖先

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖…

Modbus协议初探(C#实现)

由于作者水平有限,如有写得不对得地方请指正 趁着今天休息,就折腾一下Modbus协议,之前零零散散的看过几篇博客,听说搞上位机开发的要会这个协议,虽然我不是搞上位机开发的,但个人对这个比较感兴趣。按照我个…

开发一个看番app[樱花动漫移动端app]

使用react-native开发,功能: 支持看番支持历史记录浏览支持追番 项目地址: https://github.com/HGGshiwo/Sakura 界面: 首页分类用户界面播放界面历史记录搜索界面全部动漫追番

OpenAI Whisper and ChatGPT 语音助手

OpenAI Whisper and ChatGPT ASR Gradio Web UI一 环境准备1.1 python1.2 windows二 导入所需要的包三 加载模型四 定义openai和whisper接口五 生成Gradio Web UI麦克风输入,展示三种结果输入ASR结果输出文本输出TTS结果 一 环境准备 1.1 python gradio3.19.1 gTT…

ubuntu 如何搭建git远程仓库

ubuntu 安装git sudo apt-get install git配置用户名和邮箱 git config --global user.name “xxx” git config --global user.email “邮箱地址”关于远程仓库 Git是分布式版本控制系统,同一个Git仓库,可以分布到不同的机器上。这就需要一台电脑充当…

打印名片-课后程序(Python程序开发案例教程-黑马程序员编著-第一章-课后作业)

实例2:打印名片 名片是标示姓名及其所属组织、公司单位和联系方法的纸片,也是新朋友互相认识、自我介绍的快速有效的方法。本实例要求编写程序,模拟输出效果如图1所示的名片。 图1 名片样式 实例目标 掌握print()函数的用法 实例分析 名片…

【办公类-19-01-02】办公中的思考——Python,统计教职工的姓名中那些字最多?

背景需求:上一篇计算了教职工的姓氏谁最多,col[0]]这一篇统计教职工的(姓氏名字)里面哪些字出现最多。材料准备:1、下载所有员工名单写代码。py 包含”姓氏名字“的重字率统计from pandas import DataFrame, Series im…

DevOps践行

DevOps 是开发 (Dev) 和运营 (Ops) 的复合词,它将人、流程和技术结合起来,不断地为客户提供价值。 DevOps 对团队意味着什么? DevOps 使以前孤立的角色(开发、IT 运营、质量工程和安全)可以协调和协作,以生…

二次封装element plus (el-select-v2远程搜索组件)

根据项目需求,需要给每个对应的搜索字段进行 远程搜索项目中有跟多地方都需要使用,所以进行二次封装会很方便.创建一个ElSelectV2文件夹> index.vue<template><div><el-select-v2v-model"valueName"filterableremote:remote-method"remoteMet…

tomcat启动流程以及线程池配置

一、启动流程 二、 线程池配置 Tomcat的maxConnections、maxThreads、acceptCount三大配置&#xff0c;分别表示最大连接数&#xff0c;最大线程数、最大的等待数&#xff0c;可以通过application.yml配置文件来改变这个三个值&#xff0c;一个标准的示例如下&#xff1a; se…

Linq的底层原理探讨

前言有一篇文章ABP-引入SqlSugar很多人都在催促我&#xff0c;出下一章因为工作忙一直没写。现在开第二节课Linq的底层原理探讨。一起探讨完&#xff0c;看看有没有引起SqlSugar的新思路。这文章叫linq的底层原理。从哪里开始说呢&#xff1f;Linq To SQL、Linq To Objects、Li…

计算机的学习路线

本文是介绍如何成为一个Geek&#xff0c;一个真正的计算机高手。 适合有成为IT领域技术大牛的人参考。 写给大一新生和所有向深耕IT领域的人&#xff0c;避免走一些弯路。 第一门入门的必备功课-语法与算法 什么是计算机&#xff1f; 用来做运算的机器 电子计算机在运算方面…

[1.3_1]计算机系统概述——操作系统的运行机制

文章目录第一章 计算机系统概述操作系统的运行机制前提知识&#xff1a;程序是如何运行的内核程序与应用程序特权指令与非特权指令内核态与用户态小结第一章 计算机系统概述 操作系统的运行机制 操作系统的运行机制&#xff0c;也就是操作系统在计算机上是怎样运行的问题。 操…