Spring MVC开发及使用(8000字详解)

news2024/11/27 16:53:30

如何学习 Spring MVC?

学习 SPring MVC 只需要掌握以下三个功能:

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

目录

一,SPring MVC

1,什么是SPring MVC

MVC的定义

2,MVC 和 SPring MVC 的关系

二,SPring MVC 的创建和连接

1,创建 SPring MVC 项目

 2,@RequestMapping注解介绍

2.1 @RequestMapping是post请求还是get请求

 2.2 @GetMapping 和 @PostMapping

 三,获取参数

1,传递单个参数

2,传递对象

3,参数重命名

4,接收 JSON 对象

 5,获取 URL 中的参数

6,上传文件

 7,获取Cookie

8,获取Header

 9,获取Session

 四,返回数据

1,返回静态页面

​编辑

2,返回text/html

 五,案例练习

1,实现计算器的相加功能

2,实现登录功能


一,SPring MVC

1,什么是SPring MVC

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

  • Spring MVC 是一个 Web 框架
  • Spring MVC 是基于 Servlet API 构建的(所以包含Servlet的基本属性)

MVC的定义

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

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

2,MVC 和 SPring MVC 的关系

MVC 是一种思想,而 SPring MVC 是对 MVC 思想的具体实现(这里类似于IoC是一种思想,DI是对IoC思想的具体实现);总结来说,SPring MVC 是一个实现了 MVC 模式,并继承了 Servlet API 的 Web 框架,既然是 Web 框架,那么当用户在浏览器中输入 URL 之后,我们的 SPring MVC 项目就可以感知到用户的请求。

二,SPring MVC 的创建和连接

SPring MVC 项目创建和 SPring Boot创建项目相同(SPring MVC 使用 SPring Boot 的方式创建),在创建的时候选择Spring Web 就相当于创建了 SPring MVC 的项目。在 SPring MVC 中使用 @RequestMapping 注解来是西安 URL 路由映射,也就是浏览器连接程序的作用

1,创建 SPring MVC 项目

Spring Boot 项目创建的详细过程可以参考之前的博文:SpringBoot项目的创建和使用_蜡笔小心眼子!的博客-CSDN博客

 接下来,创建一个TestController类,实现用户到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//让Spring框架启动时加载该类
@ResponseBody//返回非页面数据
public class TestController {
    @RequestMapping("/sayhi")
    //该注解是路由规则 映射浏览器输入的URL
    public String sayHi() {
        return "hello world";
    }
}

 在浏览器输入“localhost:8080/sayhi"(因为Spring MVC默认情况下的端口号是8080),就可以访问到该后端方法并打印相关信息了:

 2,@RequestMapping注解介绍

@RequestMapping 是 SPring Web 应用程序中最常被用到的注解之一,它是用来注册接口的路由映射的(路由映射:指的是当用户访问一个URL时,将用户的请求对应到程序中某个类的某个方法的过程就叫做路由映射);@RequestMapping既可以修饰类也可以修饰方法

2.1 @RequestMapping是post请求还是get请求

使用Postman测试@RequestMapping是否可以接受 Get 或 Post请求:

测试Get:

测试Post:

所以@RequestMapping既可以接收Post请求也可以接收Get请求!

 2.2 @GetMapping 和 @PostMapping

上面测试出@RequestMapping既可以接收Post请求也可以接收Get请求,那么如果只想接收某种单一的请求该怎么办呢?此时就需要用到其他注解:@GetMapping(只接收Get请求) 和 @PostMapping(只接收Post请求)或者在@RequestMapping注解中设置参数确定接收某种请求。

Get 请求的三种写法:

//写法1
@RequestMappin("/sayhi")

//写法2
@RequestMapping(value = "/sayhi",method = RequestMethod.GET)

//写法3
@GetMapping("/sayhi")

Post 请求的两种写法:

//写法1
@RequestMapping(value = "/sayhi",method = RequestMethod.Post)

//写法2
@PostMapping("/sayhi")

 三,获取参数

1,传递单个参数

@RequestMapping("/say")
    public String say(String name) {
        return "hi " + name;
    }

 注意:在say方法中的参数的类型一定要设置成引用类型,因为设置成引用类型之后即使你在url中没有传入该参数最多查询的数据为null,如果是基本类型的话则会直接报错!

2,传递对象

@Data   //包含了lombok的多个注解
public class Userinfo {
    private int id;
    private String name;
    private int age;
}


@RequestMapping("userinfo")
    public Userinfo getUserinfo(Userinfo userinfo) {
        log.info(String.valueOf(userinfo));
        return userinfo;
    }

 注意:返回的对象在前端页面中是以JSON的格式进行展示的!

3,参数重命名

假设前端输入的参数名是username,后端不想使用该参数名,可以通过重命名的方式(使用@RequestParam注解)将其改成自己想要的参数名如:name

@RequestMapping("/sayhi2")
    public String sayHi2(@RequestParam(value = "username", required = false) String name,
                         @RequestParam(value = "pass", required = false) String password) {
        //required = false 表示url中输入的参数名不匹配时默认为null
        return "name: " + name + " password: " + password;
    }

 注意:@RequestParam注解中可以设置required变量为false(说明如果没有输入username这个变量就会返回null,默认是true,此时没有输入变量的情况下会直接报错,所以一般都会将其设置成false)

4,接收 JSON 对象

JSON对象需要通过Postman进行构造

@RequestMapping("/getjson")
    //接受 JSON 格式的数据必须加上 @RequestBody 注解
    public Object getJson(@RequestBody Userinfo userinfo) {
        log.info(String.valueOf(userinfo));
        return userinfo;
    }

 注意:获取JSON格式的数据时必须在参数名前面加上 @RequestBody否则获取到的则是默认零值!

 5,获取 URL 中的参数

@RequestMapping("/geturl/{name}/{password}")
    public String getUrl(@PathVariable String name, @PathVariable String password) {
        return "name: " + name + " password: " + password;
    }

 注意:

  • 在路由中需要用{}设置参数名;
  • 在参数名前要加上@PathVariable注解.

6,上传文件

假设此时需要上传一张图片,需要在配置文件中设置需要保存的地址然后通过Postman来进行上传

//配置文件
imgpath:D:\\Users\\date\\

//从配置文件中读取到文件的保存路径
    @Value("${imgpath}")
    private String imgpath;

    @RequestMapping("/upimg")
    public boolean upimg(Integer id, @RequestPart("img") MultipartFile file) {
        boolean result = false;
        //1.目录
        //2.图片名称(图片名不能重复)[UUID]
        //3.获取原上传图片的格式
        String fileName = file.getOriginalFilename();//得到原图片的名称
        fileName = fileName.substring(fileName.lastIndexOf("."));//得到图片后缀
        fileName = UUID.randomUUID().toString() + fileName;
        //保存图片到本地目录
        try {
            file.transferTo(new File(imgpath + fileName));
            result = true;
        } catch (IOException e) {
            log.error("图片上传失败: " + e.getMessage());
        }
        return result;
    }

 

 7,获取Cookie

获取Cookie之前需要提前在控制台(F12打开控制台)输入一个Cookie,方式如下:

//方法一:通过 HttpServletRequest 获取所有的cookie
    @RequestMapping("/cookie")
    public void getCookie(HttpServletRequest request) {
        //获取所有的cookie
        Cookie[] cookies = request.getCookies();
        for (Cookie item: cookies) {
            log.info("CookieName: " + item.getName() + " CookieValue: " + item.getValue());
        }
    }
    //方法二:通过注解获取指定cookie
    @RequestMapping("/cookie2")
    public String getCookie2(@CookieValue("bit") String cookie) {
        return "CookieValue: " + cookie;
    }

方式一:

 方式二:

8,获取Header

    //方法一:通过 HttpServletRequest
    @RequestMapping("/header")
    public String getHeader(HttpServletRequest request) {
        return request.getHeader("User-agent");
    }
    //方法二:通过注解
    @RequestMapping("/header2")
    public String getHeader2(@RequestHeader("User-agent") String userAgent) {
        return userAgent;
    }

 方式一:

 方式二:

 9,获取Session

获取Session之前需要先存储一个Session,代码如下:

    //session的存储
    @RequestMapping("/setsess")
    public boolean setSession(HttpServletRequest request) {
        boolean result = false;
        HttpSession session = request.getSession(true);//没有就创建一个会话
        session.setAttribute("userinfo","张三");
        result = true;
        return result;
    }

获取Session代码如下:

    //方法一:通过 HttpServletRequest 获取
    @RequestMapping("/getsess")
    public String getSession(HttpServletRequest request) {
        String result = null;
        HttpSession session = request.getSession(false);
        if(session != null && session.getAttribute("userinfo") != null) {
            result = (String) session.getAttribute("userinfo");
        }
        return result;
    }
    //方法二:通过注解获取
    @RequestMapping("/getsess2")
    public String getSession2(@SessionAttribute(value = "userinfo",required = false) String userinfo) {
        return userinfo;
    }

方式一:

 方式二:

 四,返回数据

通过上面的学习,默认请求下无论是 Spring MVC 或者是 Spring Boot 返回的是视图 (xxx.html),而现在都是前后端分离的,后端只需要返给给前端数据即可,这个时候我们就需要使用@ResponseBody 注解了。

1,返回静态页面

创建前端页面 hello.html

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.
0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>hello,spring mvc</title>
    <script src="index.js"></script>
</head>
<body>
<h1>Hello,Spring MVC.</h1>
</body>
</html>

2,返回text/html

  @RequestMapping("/aaa")
    public String print() {
        return "<h1>Hello Spring MVC</h1>";
    }

 五,案例练习

1,实现计算器的相加功能

可使用Postman传递参数,或使用form表单的方式提交参数;

前端页面:

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.
0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>计算器示例</title>
</head>
<body>
<form action="/calc">
    <h1>计算器</h1>
    数字1:<input name="num1" type="text"><br>
    数字2:<input name="num2" type="text"><br>
    <input type="submit" value=" 点击相加 ">
</form>
</body>
</html>

后端代码:

package com.example.demo.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class CalcController {
        @RequestMapping("/calc")
        public String calc(Integer num1,Integer num2) {
                if(num1 == null || num2 == null) {
                        return "<h1>参数错误!</h1><a href='javascript:history.go(-1);'>返回</a>";
                }
                return "<h1>结果: " + (num1 + num2) + "</h1><a href='javascript:history.go(-1);'>返回</a>";
        }
}

2,实现登录功能

前端使用ajax,后端返回json给前端;

前端代码:

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <script src="js/jquery-1.9.1.min.js"></script>
    <title>Document</title>
    <script>
        // ajax 提交
        function mysub(){
            // 1.判空
            var username = jQuery("#username");
            var password = jQuery("#password");
            if(jQuery.trim(username.val())==""){
                alert("请先输入用户名!");
                username.focus(); // 光标重制到此元素
                return;
            }
            if(jQuery.trim(password.val())==""){
                alert("请先输入密码!");
                password.focus(); // 光标重制到此元素
                return;
            }
            jQuery.ajax({
                url:"/user/login3",
                type:"POST",
                contentType:"application/json",
                data:JSON.stringify({"username":username.val(),
            "password":password.val()}),
                success:function(result){
                    alert(JSON.stringify(result));
                }
            });
        }
    </script>
</head>
<body>
<div style="text-align: center;">
    <h1>登录</h1>
    用户:<input id="username">
    <br>
    密码:<input id="password" type="password">
    <br>
    <input type="button" value=" 提交 " onclick="mysub()" style="margin-top: 20px;margin-left: 50px;">
</div>
</body>
</html>

后端代码:

 @RequestMapping(value = "/login")
 @ResponseBody
 public HashMap<String,Object> login(String username, String password){
     HashMap<String,Object> res = new HashMap<>();
     int succ = 200;
     if(username!=null && password!=null &&
     username.equals("admin") && password.equals("admin")){
         res.put("msg","登录成功");
     } else{
         res.put("msg","登录失败");
     }
     res.put("succ",succ);
     return res;
 }

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

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

相关文章

颜色空间转换RGB-YCbCr

颜色空间 RGB、YUV和YCbCr都是人为规定的彩色模型或颜色空间&#xff08;有时也叫彩色系统或彩色空间&#xff09;。它的用途是在某些标准下用通常可接受的方式对彩色加以说明。本质上&#xff0c;彩色模型是坐标系统和子空间的阐述。 YCbCr与RGB的相互转换 RGB->YCbCr Y …

2023五一杯数学建模竞赛ABC题思路解析+代码+论文

AB题见文末&#xff0c;下面是C C题&#xff1a;“双碳”目标下低碳建筑研究 “双碳”即碳达峰与碳中和的简称&#xff0c;我国力争2030年前实现碳达峰&#xff0c;2060年前实现碳中和。“双碳”战略倡导绿色、环保、低碳的生活方式。我国加快降低碳排放步伐&#xff0c;大力推…

金陵科技学院五年一贯制专转本电路分析考试大纲

金陵科技学院五年一贯制专转本电路分析考试大纲 专业名称&#xff1a;自动化 考试科目&#xff1a;专业基础课 一、考试要求 掌握电路分析的基本概念、基本原理和基本方法&#xff0c;提高分析电路的思维能力与计算能力&#xff0c;以便为学习后继课程奠定必要的基础。 二…

R 安装函数包及绘制图形

R语言绘制简单条形图 一、载入数据1.安装函数包2.导入文件3.读取数据&#xff08;.csv文件&#xff09; 二、绘制图形绘制简单条形图 一、载入数据 1.安装函数包 在控制台console输入命令&#xff1a; install.packages("bruceR")查看是否安装成功 library(bruce…

【二】MATLAB矩阵处理

【二】MATLAB矩阵处理 1 常用的特殊矩阵函数 zeros函数&#xff1a; zeros(m):产生mm零矩阵 zeros(m,n):产生mn零矩阵 zeros(size(A)):产生与矩阵A相同大小的零矩阵 ones函数&#xff1a; 产生4阶全1矩阵 ones(4) eye函数&#xff1a; 产生对角线为1的矩阵&#xff0c…

分享随机数和唯一ID的工具类

随机数一般也是会被常使用到的&#xff0c;比如在造一些模拟测试数据的场景&#xff0c;或者说是非高端应用的场景会被使用。而全局唯一ID的使用则相反&#xff0c;应用场景更广&#xff0c;更专业&#xff0c;更科学&#xff0c;比如在批量保存数据时&#xff0c;需要提前生成…

CVE漏洞复现-CVE-2016-10033-远程命令执行

CVE-2016-10033-远程命令执行 PHPMailer是一个基于PHP语言的邮件发送组件&#xff0c;被广泛运用于诸如WordPress、Drupal、1CRM、SugarCRM、Yii、Joomla等用户量巨大的应用与框架中。 CVE-2016-10033是PHPMailer中存在的高危漏洞&#xff0c;这个高危漏洞是由 class.phpmail…

Java 17 新特性尝鲜

JDK 17更新了包括14个特性&#xff0c;具体如下表所示&#xff1a; Restore Always-StrictFloating-Point Semantics 恢复始终严格模式&#xff08;Always-Strict&#xff09;的浮点语义EnhancedPseudo-Random Number Generators 增强型伪随机数生成器New macOS RenderingPipe…

Spring boot结合SkyWalking-Trace工具类实现日志打印请求链路traceid

背景&#xff1a; 随着业务的复杂化、解耦化&#xff0c;运维人员和开发人员需要对请求链路跟踪来快速发现和定位问题&#xff0c;基于应用已经集成了SkyWalking的前提下&#xff0c;如何通过获取SkyWalking生成的统一traceId并加入打印日志中&#xff0c;方便开发人员能够根据…

露营好物推荐:极米轻薄投影仪Z6X Pro

温度回升&#xff0c;春意萌动&#xff0c;很多人开始计划春游、露营&#xff0c;打算和家人、朋友一起享受大自然的春日场景。漫天星光下&#xff0c;吃着美食、喝着小酒,再加上一场露天电影,逃离了城市的喧嚣,在大自然中尽情撒野,又有谁会不喜欢呢&#xff1f;如今众多露营爱…

matlab 实现常用的混沌映射(Tent, Sine, Sinusoidal, Piecewise, Logistic, Cubic, Chebyshev)

大部分混沌映射的系数是有限制的, 针对每个模型最优的混沌系数是不一样的, 因此混沌系数要根据自己的模型来定. 下面的系数都是根据我自己的模型而设定的. 混沌映射 1 Tent 映射2 Sine 映射3 Sinusoidal 映射4 Piecewise 映射5 Logistic 映射6 Cubic 映射7 Chebyshev 映射 1 Te…

松下机器人进行数据备份与恢复的具体方法

松下机器人进行数据备份与恢复的具体方法 数据备份 如下图所示,找到备份选项,按确认, 如下图所示,选择保存,按确认键, 如下图所示,选择USB存储设备,选择存储路径,按确认键, 选择需要备份的数据,如下图所示,默认情况下是勾选“全部数据”, 如下图所示,显…

马云的创业故事及他人生中的摆渡人-卖掉中国黄页去北漂(五)

马云北上是在外经贸部一位名叫王建国的朋友牵线之下&#xff0c;受邀担任外经贸部下属的中国国际电子商务中心&#xff08;下面简称EDI&#xff09;总经理&#xff0c;负责搭建外经贸部官网和网上中国商品交易市场。 马云团队在潘家园租了房子&#xff0c;白天上班&#xff0c…

C++ + QT (不使用QT插件模式)的heic图片显示。

1.首先确定的是&#xff0c;要想C读取或者显示heic图片。光用ffmpeg没有heic的解码器。所以此时就要用上libheif了。通过查资料发现&#xff0c;一个比较常见的 C 解析解码 heic 格式图片的开源库是 libheif&#xff0c;而这个库对 h265 的解码过程又依赖于另一个开源 C 库 lib…

木牛科技发布高性价比的5R方案 助力智能驾驶的科技平权

从3月开始升温的车市价格战&#xff0c;蔓延到了4月上海车展&#xff0c;多款新车再次刷新了价格“下限”。随着价格战的白热化&#xff0c;车企们也开始反思&#xff0c;需要给消费者输出稳定的价值&#xff0c;价格需要回归到价值本身&#xff0c;而市场真正应该打响的是倡导…

【超全】在OAK深度AI相机上部署用户神经网络模型的三种方法

编辑&#xff1a;OAK中国 首发&#xff1a;oakchina.cn 喜欢的话&#xff0c;请多多&#x1f44d;⭐️✍ 内容可能会不定期更新&#xff0c;官网内容都是最新的&#xff0c;请查看首发地址链接。 ▌前言 Hello&#xff0c;大家好&#xff0c;这里是OAK中国&#xff0c;我是助手…

CDH Hive Metastore canary

现象:CDH平台突然报错,报错信息为:The Hive Metastore canary failed to create a database 排查一下两点都未发现问题: 检查hiveServer2日志(hadoop-cmf-hive-HIVEMETASTORE.log.out)无异常检查元数据依赖的数据库(我安装是mysql),无异常发现 于是在网上搜索,发现很有可能是…

【CMake】2. 使用CMake添加一个库

2. 使用CMake添加一个库 1. 什么是 library&#xff08;库&#xff09;&#xff1f; 库 函数库&#xff0c;所谓库&#xff0c;就是将函数封装成库来供我们使用&#xff0c;包含静态库和动态库。 对于代码到可执行程序的过程&#xff0c;这里简单复习一下&#xff1a; 源文…

TMM 22 | 像拆玩具一样的点云预训练

文章题目&#xff1a;Self-supervised Point Cloud Representation Learning via Separating Mixed Shapes 作者&#xff1a;Chao Sun, Zhedong Zheng, Xiaohan Wang, Mingliang Xu and Yi Yang 论文链接&#xff1a;https://www.zdzheng.xyz/files/TMM_3D_Pre_Training.pdf …

openGauss DBMind自治运维系统的安装和部署

目录 1、安装准备 1.1 环境信息 1.2 安装包 1.3 数据库用户 2、安装DBMind 3、部署DBMind 3.1 自动部署--推荐 手动配置--推荐 交互式配置 3.2 手动部署 规划配置 4、启动DBMind DBMind作为openGauss数据库的一部分&#xff0c;为openGauss数据库提供了自动驾驶能力…