Spring MVC程序开发(JavaEE进阶系列3)

目录

前言:

1.什么是Spring MVC

1.1MVC的定义

1.2MVC和Spring MVC的关系

1.3为什么要学习Spring MVC

2.Spring MVC项目的创建

3.Spring MVC框架的使用

3.1连接的功能

3.1.1@RequestMapping

3.1.2@GetMapping 

3.1.3@PostMapping

3.2获取参数的功能

3.2.1获取单个参数

3.2.2获取对象

3.2.3上传文件

3.2.4获取Cookie

3.2.5获取Session

3.2.6获取Header

3.2.7从url的path(非参数部分)获取参数

3.3输出数据的功能

结束语:


前言:

在前几节中小编给大家分享了有关于Spring Boot的项目的创建和使用,那么在接下来小编将会给大家分享一些有关于Spring MVC的的程序的开发,以及什么是Spring MVC。

1.什么是Spring MVC

Spring MVC本质是Spring Web MVC他是基于Servlet API构建的原始Web框架,从一开始就包含在Spring框架中。从上面的一段描述中我们可以看出来Spring MVC是一个Web框架,Spring MVC是基于Servlet API构建的。

1.1MVC的定义

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

解释:

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

MVC的执行流程:

  • 用户的请求首先到Controller。
  • Controller将请求转发给Model。
  • Model处理业务并将数据结构给Controller。
  • Controller会将数据给View引擎。
  • View转换数据生成最终的页面给用户。

1.2MVC和Spring MVC的关系

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

1.3为什么要学习Spring MVC

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

2.Spring MVC项目的创建

和我们之前的创建Spring Boot项目的方式一样只不过是在我们选择项目依赖的时候需要对其进行多选择一个依赖,具体如下所示:

3.Spring MVC框架的使用

学习Spring MVC我们只需要掌握以下三个功能:

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

3.1连接的功能

接下来我们就来实现客户端和程序之间的“连接”。

3.1.1@RequestMapping

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

它是Spring Web应用程序中最常被用到的注解之一,它是用来注册接口的路由映射的所谓路由映射指的是当用户在访问一个url时将用户的请求对应到某个类的某个方法的过程就叫做路由映射。

代码展示:

package com.example.demo.controller;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/test")
public class TestController {@RequestMapping("/sayhi")public String sayHi() {return "你好 Spring MVC";}
}

结果展示:

注意:从上面的代码中我们可以看出来@RequestMapping既可以修饰类又可以修饰方法。  

那么@RequestMapping是GET请求呢还是POST氢气呢?这里我们可以使用PostMan来进行验证。 

由上可以得知@RequestMapping即是GET请求又是POST请求。 

3.1.2@GetMapping 

使用@GetMapping实现HTTP连接,但只支持GET类型的请求。

代码展示:

package com.example.demo.controller;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/test_get")
public class GetController {//写法一:@RequestMapping("/get1")public String sayHi1() {return "你好 Spring MVC1";}//写法二:@RequestMapping(value = "/get2",method = RequestMethod.GET)public String sayHi2() {return "你好 Spring MVC2";}//写法三:@GetMapping("/get3")public String sayHi3() {return "你好 Spring MVC3";}
}

结果展示:

同样我们也可以使用PostMan来进行验证一下看是不是只是支持GET请求。

当我们发送的是一个GET请求的时候是可以访问到的。

当我们发送的是POST的时候就访问不到了,所以证明了当我们使用@GetMapping的时候确实是只是支持GET类型的。

3.1.3@PostMapping

使用@PostMapping实现HTTP连接,但只支持POST类型的请求。

代码展示:

package com.example.demo.controller;import org.springframework.web.bind.annotation.*;@RestController
@RequestMapping("test_post")
public class PostController {//写法一:@RequestMapping("/post1")public String sayHi1() {return "你好 Spring MVC1";}//写法二:@RequestMapping(value = "/post2",method = RequestMethod.POST)public String sayHi2() {return "你好 Spring MVC2";}//写法三:@PostMapping("/post3")public String sayHi3() {return "你好 Spring MVC3";}}

结果展示:

注意:这里在代码中的写法一是可以通过浏览器正常访问到的,但是写法二和写法三是不可以的,因为浏览器默认是使用GET类型的。

这里虽然在浏览器上看不出来效果但是我们可以使用PostMan来进行模拟。

同样这里也可以使用PostMan来验证是否是只能使用POST。 

3.2获取参数的功能

3.2.1获取单个参数

获取单个参数时可以使用以下两种方法来进行参数的传递。

代码展示:

package com.example.demo.controller;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletRequest;@RestController
@RequestMapping("/getname")
public class TestController2 {//方法一:@RequestMapping("/getname1")public String getName1(HttpServletRequest request) {return "Name: " + request.getParameter("name");}//方法二:@RequestMapping("/getname2")public String getName2(String name) {return "Name: " + name;}
}

结果展示:

3.2.2获取对象

在此之前我们先来创建出一个User实体类。

代码如下所示(PS:这里我们使用了Lombok里面的@Data注解)

package com.example.demo.model;import lombok.Data;@Data
public class User {private int id;private String name;private int age;
}

那么接下来我们就尝试着获取User这个对象。 

代码展示:

package com.example.demo.controller;import com.example.demo.model.User;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/user")
public class TestController3 {@RequestMapping("add1")public User add(User user) {return user;}@RequestMapping("/add2")public User addByJson(@RequestBody User user) {return user;}
}

结果展示:

使用JSON格式的对象。 

 

3.2.3上传文件

如果我们想要将一张图片上传至本地磁盘中,我们就可以使用以下的方式来进行上传。

代码展示:

package com.example.demo.controller;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;import java.io.File;
import java.io.IOException;@RestController
@RequestMapping("/test4")
public class TestController4 {@RequestMapping("/upload")public String upload(@RequestPart("myfile")MultipartFile file) throws IOException {String path = "D:\\image\\img.png";//保存文件file.transferTo(new File(path));return path;}
}

结果展示:

在Postman中进行演示:

3.2.4获取Cookie

代码展示:

package com.example.demo.controller;import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/Cookie")
public class TestController5 {@RequestMapping("/getcookie")public String getCookie(@CookieValue(value = "java",required = false) String ck) {return ck;}
}

注意:在上述中的代码中我们设置了@RequestParma中的required=false,这样就可以满足我们的实际业务前端的参数是一个非必传的参数了。

3.2.5获取Session

代码展示:

package com.example.demo.controller;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.SessionAttribute;@RestController
@RequestMapping("/Session")
public class TestController6 {@RequestMapping("/getsession")public String getsession(@SessionAttribute(required = false,value = "1") String name) {return name;}
}

3.2.6获取Header

代码展示:

package com.example.demo.controller;import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/Header")
public class TestController7 {@RequestMapping("/header")public String header(@RequestHeader("User-Agent") String userAgent) {return "userAgent: " + userAgent;}
}

3.2.7从url的path(非参数部分)获取参数

代码展示:

package com.example.demo.controller;import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/url")
public class TestController8 {@RequestMapping("/urlpath/{name}/{age}")public String geturl(@PathVariable String name, @PathVariable String age) {return name + age;}
}

结果展示:

 

 

3.3输出数据的功能

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

创建一个index.html:

代码展示:

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
@RequestMapping("/p")
public class indexController {@RequestMapping("/index")public String index(){return "/index.html";}@RequestMapping("/m")@ResponseBodypublic String index2() {return "<h1>Hello Spring MVC</h1>";}
}

结果展示:

如果我们想要直接在页面中显示的就是我们返回的数据那么就可以直接使用上述的@RestController这个注解。 

结束语:

好了这节小编就给大分享到这里啦,希望这节对大家有关于Spring MVC的基础知识的了解有一定帮助,想要学习的同学记得关注小编和小编一起学习吧!如果文章中有任何错误也欢迎各位大佬及时为小编指点迷津(在此小编先谢过各位大佬啦!)

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Error string: Could not load library

启动Rivz时&#xff0c;报错&#xff1a; Error string: Could not load library (Poco exception libg2o_csparse_extension.so.0.1: cannot open shared object file: No such file or directory) [ERROR] [1696572310.529059051]: Failed to load nodelet [/radar_graph_s…

Dubbo 融合 Nacos 成为注册中心

Nacos 作为 Dubbo 生态系统中重要的注册中心实现&#xff0c;本文将会介绍如何进行 Dubbo 对接 Nacos 注册中心的工作。 预备工作 请确保后台已经启动 Nacos 服务 快速上手 Dubbo 融合 Nacos 成为注册中心的操作步骤非常简单&#xff0c;大致步骤可分为“增加 Maven 依赖”…

【C++设计模式之原型模式:创建型】分析及示例

简介 原型模式&#xff08;Prototype Pattern&#xff09;是一种创建型设计模式&#xff0c;它允许通过复制已有对象来生成新的对象&#xff0c;而无需再次使用构造函数。 描述 原型模式通过复制现有对象来创建新的对象&#xff0c;而无需显式地调用构造函数或暴露对象的创建…

flink处理函数--副输出功能

背景 在flink中&#xff0c;如果你想要访问记录的处理时间或者事件时间&#xff0c;注册定时器&#xff0c;或者是将记录输出到多个输出流中&#xff0c;你都需要处理函数的帮助&#xff0c;本文就来通过一个例子来讲解下副输出 副输出 本文还是基于streaming-with-flink这本…

c#设计模式-行为型模式 之 责任链模式

&#x1f680;简介 又名职责链模式&#xff0c;为了避免请求发送者与多个请求处理者耦合在一起&#xff0c;将所有请求的处理者通过前一对 象记住其下一个对象的引用而连成一条链&#xff1b;当有请求发生时&#xff0c;可将请求沿着这条链传递&#xff0c;直到有对象处理它为…

sigmoid和softmax函数有什么区别

Sigmoid函数和Softmax函数都是常用的激活函数&#xff0c;但它们的主要区别在于应用场景和输出结果的性质。 Sigmoid函数&#xff08;也称为 Logistic函数&#xff09;&#xff1a; Sigmoid函数将输入值映射到0到1之间的连续实数范围&#xff0c;通常用于二元分类问题。 Si…

重置Jetson设备的Ubuntu密码:通过挂载根目录到另一个Linux系统

在本文中&#xff0c;我们将介绍如何在忘记Ubuntu 20.04密码的情况下重置密码。我们将通过将Ubuntu的根目录挂载到另一个Linux系统来实现这一目的。我们还将介绍chroot命令的功能。 1. 背景 最近&#xff0c;我们研发团队遇到了一个棘手的问题。一台用于研发&#xff0c;多人使…

小黑上午参加婚礼,下午去姥姥家帮着看店学习人情世故的leetcode之旅:213. 打家劫舍 II

动态规划 class Solution:def rob(self, nums: List[int]) -> int:# 数组长度n len(nums)if n 1:return nums[0]# 打家劫舍1中的函数def rob1(start, end):if start end:return nums[start]# 动态规划指针first 0second nums[start]third nums[start]# 动态规划操作f…

【C++】:类和对象(2)

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下有关Linux的基础知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门到精通 数…

信息学奥赛一本通-编程启蒙3330:【例56.1】 和为给定数

3330&#xff1a;【例56.1】 和为给定数 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 625 通过数: 245 【题目描述】 现给出若干个整数&#xff0c;询问其中是否有一对数的和等于给定的数。 【输入】 共三行&#xff1a; 第一行是整数nn(0<n≤100,000)&…

Python小技巧:快速合并字典dict()

文章目录 前言知识点字典合并1. dict.update()基础合并2. 字典推导式 update() 后话 前言 这里是Python小技巧的系列文章。这是第四篇&#xff0c;快速合并字典。 在Python的使用中&#xff0c;有时候需要将两个 dict(字典) 进行合并。 通常我们会借助 dict(字典) 的内置方法 …

Python之元组

Python之元组 元组tuple 一个有序的元素组成的集合使用小括号 ( ) 表示元组是不可变对象 tuple(), (), type(()) # 空元组 ((), (), tuple)(1,), (1) # 元组中只有1必须加逗号&#xff0c;否则就是1了 # ((1,), 1)x 1, 2 # 以逗号分隔的内容会形成元组&#xff0c;封装元组x…

ubuntu配置vscode c++环境

下载vscode deb安装包 Get Started with C on Linux in Visual Studio Code 1. 安装vscode sudo dpkg -i code_1.83.0-1696350811_amd64.deb 2. 确保gcc编译器已经安装 g --version 如果没有安装&#xff0c;执行以下命令安装 sudo apt-get update sudo apt-get install …

博弈论——议价博弈(Bargaining)

议价博弈(Bargaining) 0 引言 议价(bargaining) 是市场经济中最常见的事情,也是博弈论最早研究的问题。这里介绍一种议价的动态博弈模型。同样地&#xff0c;对于动态博弈模型&#xff0c;我们还是用常见的逆推归纳法去寻找该博弈的子博弈完美纳什均衡。 1 议价博弈 议价博弈…

数据在内存中的存储(1)

文章目录 目录1. 数据类型介绍1.1 类型的基本归类 2. 整形在内存中的存储2.1 原码、反码、补码2.2 大小端介绍2.3 练习 附&#xff1a; 目录 数据类型介绍整形在内存中的存储大小端字节序介绍及判断浮点型在内存中的存储 1. 数据类型介绍 前面我们已经学习了基本的内置类型以…

2023 年 Bitget Wallet 测评

对Bitget Wallet钱包的看法 Bitget Wallet在安全性、产品实力和使用体验方面可与Metamask媲美&#xff0c;甚至有所超越&#xff0c;唯一稍显不足的是知名度稍逊一筹。在众多钱包中&#xff0c;Bitget Wallet是拥有最全面的钱包之一&#xff0c;尤其适合那些希望一步到位&…

【数据结构】初探时间与空间复杂度:算法评估与优化的基础

&#x1f6a9;纸上得来终觉浅&#xff0c; 绝知此事要躬行。 &#x1f31f;主页&#xff1a;June-Frost &#x1f680;专栏&#xff1a;数据结构 &#x1f525;该文章主要了解算法的时间复杂度与空间复杂度等相关知识。 目录&#xff1a; &#x1f30f; 时间复杂度&#x1f52d…

数据结构--》数组和广义表:从基础到应用的全面剖析

数据结构为我们提供了组织和处理数据的基本工具。而在这个广袤的数据结构领域中&#xff0c;数组和广义表是两个不可或缺的重要概念。它们作为线性结构的代表&#xff0c;在算法与应用中扮演着重要的角色。 无论你是初学者还是进阶者&#xff0c;本文将为你提供简单易懂、实用可…

Linux 安全 - SUID机制

文章目录 一、文件权限位二、SUID简介 一、文件权限位 &#xff08;1&#xff09; $ ls -l text.txt -rw-rw-r-- 1 yl yl 0 Sep 28 16:25 text.txt其中第一个字段-rw-rw-r–&#xff0c;我们可以把它分为四部分看&#xff1a; -rw-rw-r--&#xff08;1&#xff09;- &a…

第二课 前缀和、差分、双指针扫描

文章目录 第二课 前缀和、差分、双指针扫描lc1.两数之和--简单题目描述代码展示 lc11.盛最多水的容器--中等题目描述代码展示 lc15.三数之和--中等题目描述代码展示 lc42.接雨水--困难题目描述代码展示 lc53.最大子数组和--中等题目描述代码展示 第二课 前缀和、差分、双指针扫…