当前位置: 首页 > news >正文

快速入门SpringMVC 学习

目录

SpringMVC 定义

MVC定义

创建SpringMVC项目

SpringMVC掌握功能

一、连接功能

@RequestMapping(请求映射)

@GetMapping 和 @PostMapping

二、获取参数功能

传递单个参数/多个参数

注意点:

@RequestParam(前后端参数映射)

前后端参数映射

@RequestParam特性:设置参数必传

 @RequestParam特性:设置参数为非必传

传递对象 

@RequestBody 接收JSON对象

获取URL中参数@PathVariable

上传文件@RequestPart

获取Cookie/Session/header

@CookieValue

@RequestHeader

@SessionAttribute

三、返回数据功能

返回静态页面

请求重定向和请求转发

请求重定向与请求转发区别

请求转发

请求重定向

前后端交互

使用form表单传递参数

使用ajax传递参数给后端


SpringMVC 定义

SpringMVC是一个Web框架,基于Servlet的API构建的。

MVC定义

MVC是Model、View和Controller的缩写,分别代表着模型 、视图和控制器。

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

创建SpringMVC项目

SpringMVC 项目是基于SpringBoot项目创建的基础创建的

创建SpringBoot项目时候勾选SpringWeb即可创建SpringMVC项目。

SpringMVC掌握功能

1、连接功能:用户(浏览器端)与项目程序建立连接,即输入一个URL能够访问到我们的程序代码结果

2、获取参数功能:后台程序能够获取到用户输入的参数(前端传递)

3、输出数据功能:后台程序接收到用户访问所输入的数据,经过业务逻辑的处理后,需要将处理的数据结果传递给前端,返回给用户。

一、连接功能

        连接功能需要建立路由映射,实现用户与程序之间的连接,这里就需要使用到注解有@RequestMapping(请求映射)

@RequestMapping(请求映射)

此注解可以实现路由映射,通过输入一个URL来访问我们的项目程序。

 @RequestMapping 的最小请求单元是方法 。

        因此使用该注解必须要添加在方法上。同时该注解也可以加在类上即一级目录,加在方法上为二级目录 (也可以直接修饰方法)。

        通常用户在获取我们程序结果的时候,还需要搭配2个注解来配合@RequestMapping来使用,这两个注解就是:

@ResponseBody (告诉程序返回的是数据而不是前端页面) 

@Controller (让框架启动的时候加载当前类,只有加载的类才能被用户访问到)

这两个注解也可以使用一个组合注解@RestController来代替

  @RestController = @ResponseBody + @Controller

示例代码如下:

@RequestMapping("/hello") // 一级路由目录
@Controller // 让框架启动的时候加载当前类
@ResponseBody //告诉程序返回的是数据而非页面
public class UrlSpringMVC {@RequestMapping("/hi") // 二级路由目录public String func(){return "你好,SpringMVC";}
}

@GetMapping 和 @PostMapping

        @RequestMapping注解既可以支持Get请求,也支持Post请求 ,默认情况下仅支持Get请求

        如果需要指定只支持Get请求或者只支持Post请求,可以修改@RequestMapping中的方法进行定义仅支持Get请求或者仅支持Post请求。

修改方法如下:

@RequestMapping(value ="/hi" ,method = RequestMethod.GET) 
@RequestMapping(value = "/he",method = RequestMethod.POST)

        方式二:可以直接使用@GetMapping  或者@PostMapping

注意点:@GetMapping 和@PostMapping 需要直接加载在方法上

@GetMapping("/hi")

@PostMapping("/hi")

二、获取参数功能

传递单个参数/多个参数

用户从前端返回参数给后端,后端接收用户输入的数据进行处理

@RequestMapping("/hello") // 一级路由目录
@Controller // 让框架加载的时候启动当前类
@ResponseBody //告诉程序返回的是数据而非页面public class UrlSpringMVC {@GetMapping("/hi")public String func(String name,String password){return "名字:" + name + "  密码:"+ password;}
}

注意点:

1)后端接收参数是按照参数名称进行匹配的,与参数顺序没有关系

示例如下:

 2)后端在接收前端返回参数时,需要用包装类进行接收,防止前端没有传参数导致后端没有接收到参数而发生程序异常

(重要的事情说三遍:使用包装类传递参数、使用包装类传递参数、使用包装类传递参数)

示例代码如下:

@RequestMapping("/hello") // 一级路由目录
@Controller // 让框架加载的时候启动当前类
@ResponseBody //告诉程序返回的是数据而非页面public class UrlSpringMVC {@GetMapping("/hi")public String func(int  number){return  "前端传入参数:"+number;}
}

情况一:当前端正常返回参数,后端使用基本数据类型接收传递的参数

情况二:当前端没有传入参数时,后端使用基本数据类型来接收传递参数,此时导致后端没有收到参数而发生程序异常

 

 解决方法:后端接收参数使用包装类来接收参数,防止前端没有传入参数,

                当前端没有传入参数时,后端可以输出结果为null,程序就不会发生异常了

修正代码运行:

@GetMapping("/hi")public String func(Integer  number){  //使用包装类来接收传入参数return  "前端传入参数:"+number;}

 

@RequestParam(前后端参数映射)

前后端参数映射

        有时候前段传递的参数key值与后端接收参数的key值不一样 ,就比如说前端传入两个数字key值使用的是number1、number2,而后端接收数字的key值是number3和number4,此时就会发生参数无法接收不到的情况了。

        此时就需要使用注解@RequestParam来进行前后端参数映射 

 @RequestMapping("/m1")//前端传入参数key值是number1、number2,后端接收参数key值是number3和number4//使用@RequestParam 将number1映射成number3,将number2映射成number4public String test(@RequestParam("number1") Integer number3,@RequestParam("number2") Integer number4){return "后端接收参数number3为:"+ number3 +", number4:"+ number4;}}

 

@RequestParam特性:设置参数必传

 查看源码可知@RequestParam默认设置参数为必传,如果前端没有传递参数时就会发生程序异常

 @RequestParam特性:设置参数为非必传

        在项目中我们传递的参数为非必要传递参数,此时就需要对@RequestParam 属性进行修改,将required修改为false即可设置为参数为非必传

  @RequestMapping("/m1")public String test(@RequestParam(value="number1",required = false) Integer number3,@RequestParam(value = "number2",required = false) Integer number4){return "后端接收参数number3为:"+ number3 +", number4:"+ number4;}

传递对象 

定义对象代码

import lombok.Data;@Data
public class Student {private int id;private String name;private String password;
}

后端返回参数代码

  @RequestMapping("/n1")public String people(Student student){return "id号:"+ student.getId()+" 姓名:"+ student.getName()+" 密码:"+ student.getPassword();}

@RequestBody 接收JSON对象

@RequestBody可以用来接收前端传来的JSON对象,用法与传递对象类似,示例如下:

注意:@RequestBody 必须要求是post映射

@Data
public class Student {private int id;private String name;private String password;
}
  @PostMapping("/n11")  //@RequestBody 必须要求是post映射public String method(@RequestBody Student student){return student.toString();}

获取URL中参数@PathVariable

使用@PathVariable可以更加简洁的从URL获取参数

 @RequestMapping("/n2/{username}/{password}")public String people1(@PathVariable String username,@PathVariable String password){return username + " : "+ password ;}

 其中{username}{password}为必须传递的参数,否则访问出现404

上传文件@RequestPart

 @RequestMapping("/upFile")public String myupFile(@RequestPart("file")MultipartFile file) throws IOException {//根目录String path = "F:\\upFile\\";//根目录 + [唯一的文件名]path += UUID.randomUUID().toString().replace("-","");// 根目录 + [唯一的文件名] + 【文件的后缀】 ex:.pngpath += file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));file.transferTo(new File(path));return path;}

 

获取Cookie/Session/header

@CookieValue

获取cookie就需要使用到此注解@CookieValue

@RequestMapping("/cookie")public String getMyCookie(@CookieValue("cookies") String getCookie){return "Cookie :" + getCookie;}

@RequestHeader

获取Header信息使用该注解

 @RequestMapping("header")public String getHead(@RequestHeader("User-Agent") String userAgent) {return "User-Agent;"+userAgent;}

@SessionAttribute

存储Session

@RequestMapping("/cunSession")public String setsess(HttpServletRequest request) {// 获取 HttpSession 对象,参数设置为 true 表示如果没有 session 对象就创建⼀个 sessionHttpSession session = request.getSession(true);if(session!=null){session.setAttribute("username","SpringMVC"); //SpringMVC为创建的Session}return "session 存储成功";}

获取session 简洁方式,直接使用@SessionAttribute

   @RequestMapping("/Session")public String getSession(@SessionAttribute(value = "username" ,required = false) String userSession){return "获取Session:" + userSession;}

 

三、返回数据功能

返回静态页面

        在第一个功能:连接功能已经关于@ResponseBody说明该注解的功能:告诉程序返回的是数据而不是前端页面

        使用@ResponseBody返回的是一个数据而非前端页面,如果不使用该注解,则返回的是一个前端页面

创建test.html前端文件:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body>这是前端页面HTML !!!
</body>
</html>

使用@ResponseBody效果:

@RequestMapping("/yemian")@ResponseBody //告诉程序返回的是数据而非页面public String func(){return "test.html";}

不使用@ResponseBody效果:

@RequestMapping("/yemian")public String func(){return "test.html";}

请求重定向和请求转发

请求重定向:forward

请求转发:redirect

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

请求重定向与请求转发区别

1、请求转发:请求转发是客户端向服务器发送请求,服务器来转发这个请求,执行对象是服务器

2、请求重定向:请求重定向是客户端向服务器发送请求,服务器告诉客户端一个新的资源地址,客户端再去完成,执行对象是客户端

3、请求重定向与直接访问新地址效果⼀样,不存在原来的外部资源不能访问;请求转发服务器端转发有可能造成原外部资源不能访问。

请求转发

 @RequestMapping("/re")public String func1(){return "redirect:test.html";}

请求转发是客户端让服务器转发地址,地址不发生变化

请求重定向

  @RequestMapping("/fo")public String func2(){return "forward:test.html";}

请求重定向是客户端重新发送新的地址,地址发生了变化

前后端交互

使用form表单传递参数

示例:实现计算器功能

前端代码:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>计算器</title>
</head>
<body><form action="http://localhost:8080/hello/jishuang"><h1>计算器</h1>数字1:&nbsp;&nbsp;<input name="num1" type="text"><br>数字2:&nbsp;&nbsp;<input name="num2" type="text"><br><input type="submit" value=" 点击相加 "></form></body>
</html>

后端代码:

 @RequestMapping("/jishuang")@RestControllerpublic String func(Integer num1,Integer num2){if(num1 == null || num2 == null){return "数据不可为空,请重新输入<a href='javascript:history.go(-1);'>返回</a>";}else{return "<h2>计算结果为:"+(num1+num2)+"</h2><a href='javascript:history.go(-1);'>返回</a>";}}

 

相关文章:

快速入门SpringMVC 学习

目录 SpringMVC 定义 MVC定义 创建SpringMVC项目 SpringMVC掌握功能 一、连接功能 RequestMapping(请求映射) GetMapping 和 PostMapping 二、获取参数功能 传递单个参数/多个参数 注意点&#xff1a; RequestParam(前后端参数映射) 前后端参数映射 RequestParam特…...

leetcode96--不同的二叉搜索树[java]

不同的二叉搜索树 leetcode 96 题 不同的二叉搜索树题目描述暴力递归解题思路代码演示执行效率 递归 缓存解题思路代码演示执行效率 动态规划专题 leetcode 96 题 不同的二叉搜索树 原题链接: 难度—中等 https://leetcode.cn/problems/unique-binary-search-trees/ 题目描述 …...

【Spring 项目的创建和使用】

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f93a;&#x1f93a;&#x1f93a; 目录 1. 创建 Spring 项目 2. 创建一个 普通 Maven…...

数据类型.

数据类型 数据类型分类 数值类型 tinyint类型 数值越界测试&#xff1a; mysql> create table tt1(num tinyint); Query OK, 0 rows affected (0.02 sec)mysql> insert into tt1 values(1); Query OK, 1 row affected (0.00 sec)mysql> insert into tt1 values(128…...

深入了解JavaScript中的Promise

在JavaScript中&#xff0c;异步编程是必不可少的。过去&#xff0c;我们通常使用回调函数来处理异步操作&#xff0c;但回调地狱&#xff08;callback hell&#xff09;和复杂的错误处理使得代码难以维护。为了解决这些问题&#xff0c;ES6引入了Promise&#xff0c;它是一种更…...

Solidity基础六

生活本来就是平凡琐碎的&#xff0c;哪有那么多惊天动地的大事&#xff0c;快乐的秘诀就是不管对大事小事都要保持热情 目录 一、Solidity的特殊变量(全局) 二、Solidity的不可变量 immutable的赋值方式 三、Solidity的事件与日志 事件和日志加深理解 四、Solidity的异常…...

自学网络安全解决问题方法

自学网络安全很容易学着学着就迷茫了&#xff0c;找到源头问题&#xff0c;解决它就可以了&#xff0c;所以首先咱们聊聊&#xff0c;学习网络安全方向通常会有哪些问题&#xff0c;看到后面有惊喜哦 1、打基础时间太长 学基础花费很长时间&#xff0c;光语言都有几门&#xf…...

Java之旅(七)

Java 异常 Java异常&#xff08;Exception&#xff09;是在程序运行过程中出现错误或异常情况时&#xff0c;由程序自动抛出&#xff0c;导致程序无法正常运行&#xff0c;用于向上层调用程序传递错误信息或中断程序执行的一种机制。 异常与错误不同&#xff0c;错误是由于程…...

测试报告模板二

项目名称 系统测试报告 平台测试小组 2023年x月xx日 文档信息 文档名称: 作者:...

C语句概述

1 、 C 语句分类&#xff1a; ①控制语句&#xff1a;二个分支语句&#xff08; if-else 、 switch &#xff09;&#xff0c;三个循环语句&#xff08; for 、 while 、 do - while &#xff09;&#xff0c;四个转移语句&#xff08; continue 、 break 、 goto 、 return…...

C++ [STL之vector模拟实现]

本文已收录至《C语言和高级数据结构》专栏&#xff01; 作者&#xff1a;ARMCSKGT STL之vector模拟实现 前言正文空间结构默认成员函数构造函数拷贝构造函数赋值重载析构函数关于数据拷贝问题 迭代器容量操作查询容量容量操作 数据访问下标访问头尾数据访问 数据增删尾插尾删重…...

【算法竞赛进阶指南】141.周期 题解 KMP 最小循环节

题目描述 一个字符串的前缀是从第一个字符开始的连续若干个字符&#xff0c;例如 abaab 共有 5 5 5 个前缀&#xff0c;分别是 a&#xff0c;ab&#xff0c;aba&#xff0c;abaa&#xff0c;abaab。 我们希望知道一个 N N N 位字符串 S S S 的前缀是否具有循环节。 换言之…...

【Springboot 入门培训 】#19 Spring Boot 组件扫描与bean生命周期

目录 1 什么是组件扫描2 何时使用组件扫描3 扫描整个包basePackages与 includeFilters4 Spring boot 的 Bean 生命周期4.1 生命周期4.2 Bean 生命周期4.3 周期各个阶段 首先&#xff0c;我想先为你介绍一下“Spring”&#xff0c;这是一个开放源代码的设计模式解决方案和轻量级…...

Linux printf 函数输出问题

printf 函数并不会直接将数据输出到屏幕&#xff0c;而是先放到缓冲区中&#xff0c;只有一下三种情况满足&#xff0c;才会输出到屏幕。 1&#xff09; 缓冲区满 2&#xff09; 强制刷新缓冲区 fflush 3&#xff09; 程序结束时 1 #include<stdio.h>2 #include<st…...

皮卡丘Unsafe Fileupload

1.不安全的文件上传漏洞概述 文件上传功能在web应用系统很常见&#xff0c;比如很多网站注册的时候需要上传头像、上传附件等等。当用户点击上传按钮后&#xff0c;后台会对上传的文件进行判断 比如是否是指定的类型、后缀名、大小等等&#xff0c;然后将其按照设计的格式进行…...

最优化简明版(上)

引言 本文简单地介绍一些凸优化(Convex Optimization)的基础知识&#xff0c;可能不会有很多证明推导&#xff0c;目的是能快速应用到机器学习问题上。 凸集 直线与线段 设 x 1 ≠ x 2 x_1 \neq x_2 x1​x2​为 R n \Bbb R^n Rn空间中的两个点&#xff0c;那么具有下列形…...

MySQL的一些介绍

1. SQL的select语句完整的执行顺序 SQL Select语句完整的执行顺序&#xff1a; 1、from子句组装来自不同数据源的数据&#xff1b; 2、where子句基于指定的条件对记录行进行筛选&#xff1b; 3、group by子句将数据划分为多个分组&#xff1b; 4、使用聚集函数进行计算&am…...

unity发布webGL后无法预览解决

众所周知&#xff0c;unity发布成webgl后是无法直接预览的。因为一般来说浏览器默认都是禁止webgl运行的。 直接说我最后的解决方法&#xff1a;去vscode里下载一个live server ,安装好。 下载vscode地址Visual Studio Code - Code Editing. Redefined 期间试过几种方法都不管…...

Flume和Kafka的组合使用

一.安装Kafka 1.1下载安装包 通过百度网盘分享的文件&#xff1a;复制链接打开「百度网盘APP 即可获取」 链接&#xff1a;https://pan.baidu.com/s/1vC6Di3Pml6k1KMbnK0OE1Q?pwdhuan 提取码&#xff1a;huan 也可以访问官网&#xff0c;下载kafka2.4.0的安装文件 1.2解…...

JSONSQL:使用SQL过滤JSON类型数据(支持多种数据库常用查询、统计、平均值、最大值、最小值、求和语法)...

1. 简介 在开发中&#xff0c;经常需要根据条件过滤大批量的JSON类型数据。如果仅需要过滤这一种类型&#xff0c;将JSON转为List后过滤即可&#xff1b;如果相同的条件既想过滤数据库表中的数据、也想过滤内存中JSON数据&#xff0c;甚至想过滤Elasticsearch中的数据&#xff…...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展&#xff1a;显示创建时间8. 功能扩展&#xff1a;记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端&#xff0c;同时完善学生端的构建。本次工作主要包括&#xff1a; 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

JVM垃圾回收机制全解析

Java虚拟机&#xff08;JVM&#xff09;中的垃圾收集器&#xff08;Garbage Collector&#xff0c;简称GC&#xff09;是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象&#xff0c;从而释放内存空间&#xff0c;避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

若依登录用户名和密码加密

/*** 获取公钥&#xff1a;前端用来密码加密* return*/GetMapping("/getPublicKey")public RSAUtil.RSAKeyPair getPublicKey() {return RSAUtil.rsaKeyPair();}新建RSAUti.Java package com.ruoyi.common.utils;import org.apache.commons.codec.binary.Base64; im…...

【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅!

【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅! 🌱 前言:一棵树的浪漫,从数组开始说起 程序员的世界里,数组是最常见的基本结构之一,几乎每种语言、每种算法都少不了它。可你有没有想过,一组看似“线性排列”的有序数组,竟然可以**“长”成一棵平衡的二…...

ArcPy扩展模块的使用(3)

管理工程项目 arcpy.mp模块允许用户管理布局、地图、报表、文件夹连接、视图等工程项目。例如&#xff0c;可以更新、修复或替换图层数据源&#xff0c;修改图层的符号系统&#xff0c;甚至自动在线执行共享要托管在组织中的工程项。 以下代码展示了如何更新图层的数据源&…...

从零手写Java版本的LSM Tree (一):LSM Tree 概述

&#x1f525; 推荐一个高质量的Java LSM Tree开源项目&#xff01; https://github.com/brianxiadong/java-lsm-tree java-lsm-tree 是一个从零实现的Log-Structured Merge Tree&#xff0c;专为高并发写入场景设计。 核心亮点&#xff1a; ⚡ 极致性能&#xff1a;写入速度超…...

CVE-2023-25194源码分析与漏洞复现(Kafka JNDI注入)

漏洞概述 漏洞名称&#xff1a;Apache Kafka Connect JNDI注入导致的远程代码执行漏洞 CVE编号&#xff1a;CVE-2023-25194 CVSS评分&#xff1a;8.8 影响版本&#xff1a;Apache Kafka 2.3.0 - 3.3.2 修复版本&#xff1a;≥ 3.4.0 漏洞类型&#xff1a;反序列化导致的远程代…...