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.mzph.cn/news/95790.shtml

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

相关文章

高通camx开源部分学习简介

camera整体框架 sensor 上电&#xff0c;通过 MIPI协议传输&#xff0c;得到RAW图像数据。RAW图像数据经过ISP处理&#xff0c;得到YUV图像数据。YUV图像数据再经过DMA传输到DDR内存中&#xff0c;DDR内存也就是上图中标识的HOST。每个厂家的 ISP原理和功能大致相同&#xff0c…

【亲测有效】C盘容量满了,给C盘扩容!!!

前言 相信有很多小伙伴用自己电脑的时候明明不往C盘装东西&#xff0c;但是C盘还是慢慢的变红了&#xff0c;我也是因为C盘满了而备受困扰。又不知道如何解决或者怕自己鼓捣着磁盘数据没了。闲来无事&#xff0c;我查了一些资料&#xff0c;终于将我的C盘容量扩充了且数据保存…

Hive 【Hive(七)窗口函数练习】

窗口函数案例 数据准备 1&#xff09;建表语句 create table order_info (order_id string, --订单iduser_id string, -- 用户iduser_name string, -- 用户姓名order_date string, -- 下单日期order_amount int -- 订单金额 ); 2&#xff09;装载语句 i…

一文搞懂APT攻击

APT攻击 1. 基本概念2. APT的攻击阶段3. APT的典型案例参考 1. 基本概念 高级持续性威胁&#xff08;APT&#xff0c;Advanced Persistent Threat&#xff09;&#xff0c;又叫高级长期威胁&#xff0c;是一种复杂的、持续的网络攻击&#xff0c;包含高级、长期、威胁三个要素…

超声波气象站——环境监测领域强大助手

超声波气象站是环境监测领域的一位强大助手&#xff0c;超声波气象站是一种综合型的气象设备&#xff0c;精巧而全面&#xff0c;满足人们对环境状况的深入了解和精准把握。 首先&#xff0c;超声波气象站的传感器部分&#xff0c;是它的核心组成部分&#xff0c;这位“感知者”…

PHP 行事准则:allow_url_fopen 与 allow_url_include

文章目录 参考环境allow_url_fopenallow_url_fopen 配置项操作远程文件file 协议 allow_url_includeallow_url_include 配置项 allow_url_include 与 allow_url_fopen区别联系默认配置配置项关闭所导致异常运行时配置ini_set()限制 参考 项目描述搜索引擎Bing、GoogleAI 大模型…

Elasticsearch数据操作原理

Elasticsearch 是一个开源的、基于 Lucene 的分布式搜索和分析引擎&#xff0c;设计用于云计算环境中&#xff0c;能够实现实时的、可扩展的搜索、分析和探索全文和结构化数据。它具有高度的可扩展性&#xff0c;可以在短时间内搜索和分析大量数据。 Elasticsearch 不仅仅是一个…

Linux 本地 Docker Registry本地镜像仓库远程连接

Linux 本地 Docker Registry本地镜像仓库远程连接 Docker Registry 本地镜像仓库,简单几步结合cpolar内网穿透工具实现远程pull or push (拉取和推送)镜像,不受本地局域网限制&#xff01; 1. 部署Docker Registry 使用官网安装方式,docker命令一键启动,该命令启动一个regis…

JVM-满老师

JVM 前言程序计数器&#xff0c;栈&#xff0c;虚拟机栈&#xff1a;本地方法栈&#xff1a;堆&#xff0c;方法区&#xff1a;堆内存溢出方法区运行时常量池 垃圾回收垃圾回收算法分代回收 前言 JVM 可以理解的代码就叫做字节码&#xff08;即扩展名为 .class 的文件&#xff…

虫情测报灯如何实现自动化测报?

一、KH-CQPest虫情测报灯的工作过程 虫情测报灯是新一代的图像式虫情测报智能设备&#xff0c;在农业虫害防治领域拥有独特魅力&#xff0c;它内置高像素的摄像头&#xff0c;能够精准记录并将照片上传至智慧农业平台识别害虫的形态、种类。虫情测报灯运用现代光电数控集成技术…

Netty(四)NIO-优化与源码

Netty优化与源码 1. 优化 1.1 扩展序列化算法 序列化&#xff0c;反序列化主要用于消息正文的转换。 序列化&#xff1a;将java对象转为要传输对象(byte[]或json&#xff0c;最终都是byte[]) 反序列化&#xff1a;将正文还原成java对象。 //java自带的序列化 // 反序列化 b…

SpringBoot自带模板引擎Thymeleaf使用详解①

目录 前言 一、SpringBoot静态资源相关目录 二、变量输出 2.1 在templates目录下创建视图index.html 2.2 创建对应的Controller 2.3 在视图展示model中的值 三、操作字符串和时间 3.1 操作字符串 3.2 操作时间 前言 Thymeleaf是一款用于渲染XML/HTML5内容的模板引擎&am…

[unity]保存文件的路径设置

序 比如&#xff0c;序列化了一个数组&#xff0c;保存到磁盘上。 原来的路径是"D://test.bin"&#xff0c;能跑&#xff0c;但是有点问题&#xff1a;序列化出来的文件和原项目离的太远&#xff0c;不好管理。 要是能保存到unity工程的文件夹里就好了。这个路径该…

学习记忆——方法篇——整除特点

理解记忆法 对于数的整除特征大家都比较熟悉&#xff1a;比如4看后两位&#xff08;因为100是4的倍数&#xff09;&#xff0c;8看后三位&#xff08;因为1000是8的倍数&#xff09;&#xff0c;5末尾是0或5&#xff0c;3与9看各位数字和等等&#xff0c;今天重点研究一下3,9,…

毕设-原创医疗预约挂号平台分享

医疗预约挂号平台 不是尚医通项目&#xff0c;先看项目质量&#xff08;有源码论文&#xff09; 项目链接&#xff1a;医疗预约挂号平台git地址 演示视频&#xff1a;医疗预约挂号平台 功能结构图 登录注册模块&#xff1a;该模块具体分为登录和注册两个功能&#xff0c;这些…

小样本学习——匹配网络

目录 匹配网络 &#xff08;1&#xff09;简单介绍&#xff1a; &#xff08;2&#xff09;专业术语 &#xff08;3&#xff09;主要思想 &#xff08;4&#xff09;训练过程 问题 回答 MANN 匹配网络 &#xff08;1&#xff09;简单介绍&#xff1a; Matching netwo…

创新家庭办公室:打造完美工作空间的秘诀

一个精心策划的家庭办公室有很多好处&#xff0c;何不把临时工作区升级改造为你的专属工作区呢&#xff0c;还能为这些至关重要的区域注入新的活力。 创造多用途的起居室&#xff1a;我们大多数人都不曾拥有一个可以完全根据工作需求设计的独立家庭办公室——所以有时候要找到…

【锁的区别】C++线程库和POSIX线程库锁的区别

C线程库和POSIX线程库锁的区别 C线程库代码段的互斥&#xff1a;mutex、recursive_mutex、timed_mutex、recursive_timed_mutex互斥量mutex&#xff1a;直接进行lock()或者unlock()递归互斥锁recursive_mutex&#xff1a;可以多次加锁&#xff0c;意味着加几次锁就需要解几次锁…

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

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

netcore Polly.Core

一、安装包 <PackageReference Include"Polly.Core" Version"8.0.0" /> 二、编写重试 ResiliencePipeline pipeline new ResiliencePipelineBuilder().AddRetry(new RetryStrategyOptions{MaxRetryAttempts 2,Delay TimeSpan.FromSeconds(3),O…