【Spring MVC】Spring MVC基于注解的程序开发

目录

一、什么是Spring MVC

 二、Spring MVC项目的创建和使用

1、实现客户端和服务器端之间的连接

1.1、RequsestMapping注解

1.2、@RequestMapper的简单使用 

1.3、使用@GetMapping和@POSTMapping注解来实现HTTP连接

三、获取参数

1、实现获取单个参数

2、实现获取对象

3、后端参数重命名(@RequestParam参数映射)

 4、@RequestParam参数必传设置

 5、接收JSON对象(@RequestBody)

6、获取URL中参数(@PathVariable)

 7、上传文件(@RequestPart)

8、获取Cookie/Session/header

四、返回数据

1、返回一个静态页面

 2、返回一个数据

 3、返回text/html

4、请求转发和请求重定向


一、什么是Spring MVC

官方的描述为Spring Web MVC是基于Servlet API的原始Web框架,从一开始就包含在Spring框架中。它的正式名称Spring Web MVC”来自它的源模块(Spring -webmvc)的名称,但它更常被称为“Spring MVC”。

理解Web框架

Web框架(Web framework)是用来进行Web应用开发的一个软件架构。主要用于动态网络开发,Web应用框架提供了一套开发和部署网站的方式。开发者基于框架实现自己的业务逻辑。使用Web框架很多的业务逻辑的功能不需要自己去完善,而是使用框架已有的功能就可以。

✨什么是MVC 

MVC是Model View Controller的缩写,它是软件工程中的一种软件件架构模式,他将一个项目分为三部分:View(试图),Controller(控制器),Model(模型)。MVC是一种思想

  • Model(模型):项目中用于处理程序数据逻辑的部分,负责在数据库中查找和存储数据。
  • View(试图):是项目中将得到的数据进行处理之后,显示给用户一个界面的部分。
  • Controller(控制器):是项目中处理用户交互的部分,负责读取用户的请求,向模型提价请求,读取模型的响应,将数据交给View部分。

✨MVC和Spring MVC的关系

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

Spring MVC是一个实现了MVC模式,并继承了Servlwt API的Web框架。

 二、Spring MVC项目的创建和使用

Spring MVC项目的创建步骤和Spring Boot的创建步骤是相同的,我们之前创建的Spring Boot项目就相当于是一个Spring Web项目,我们在添加Spring Boot框架的时候,已经引入了Spring MVC。

下图中spring-boot-starter-web表示的就是Spring MVC框架。

1、实现客户端和服务器端之间的连接

1.1、RequsestMapping注解

@ResquestMapping是Spring Web应用程序中最常用到的注解之一,他是用来注册接口的的路由映射的。

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

✨ @RequestMapping注解的参数

  • value:指定请求的实际访问地址,value属性是@RequestMapping注解的默认属性,如果只有唯一一个属性,则可以省略value字段,如果参数中有多个属性,则必须写上value属性名。
  • path:与value同义,他们在源码中相互引用,value和path都是用来作为映射使用的。
  • method:用来指定请求的类型,当在一个方法的注解@RequestMapping的参数中写道method = RequestMethod.GET表示这个方法只支持GET请求。
  • params:该属性指定,请求中必须包含params属性指定的参数时,才能执行该请求。
  • headers:该属性指定,请求中必须包含某些指定的header值,才能够让该方法处理请求。
  • consumes:指定处理请求的提交内容类型(Content-Type),才能让该方法处理请求
  • produces:指定返回的内容类型,返回的内容类型必须时request请求头中所包含的类型。这个属性还可以指定返回值的编码。

1.2、@RequestMapper的简单使用 

  • @RequestMapping既可以修饰类,也可以修饰方法,当同时修饰类和方法时,类上的@ResquestMapping注解的参数value/path,表示的是URL中的一级路由,方法上的参数的value/path表示的是URL的二级路由。
  • @RequestMapper注解默认情况下支持GET和POST请求。

🍂下面我们创建一个类,来实现客户端和Spring程序的连接,使用postman模拟客户端发送请求。验证@RequsetMapper注解既可以修饰类也可以修饰方法和@RequestMapper注解默认支持GET和POST请求。

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";}
}

 我们使用URL为127.0.0.1:8080/test/sayHi

1️⃣我们使用POST请求,可以收到响应。

 2️⃣我们使用GET方法发送请求,也可以收到响应

 🍂当然我们可以设置@RequestMapping注解的Method属性值为RequeatMethod.POST,表示这个方法只支持POST请求

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/test")
public class TestController {//当这个注解中的参数有多个的时候,就需要添加属性名称@RequestMapping(value = "/sayHi",method = RequestMethod.POST)public String sayHi(){return "你好 Spring MVC";}
}

 

 🍂@RequestMapper支持设置多级目录

@RequestMapping("/sayHi/mvc")

 


1.3、使用@GetMapping和@POSTMapping注解来实现HTTP连接

@GetMapping注解只能实现GET请求的连接,@POSTMapping注解只能实现POST请求的连接。

🍂@GetMapping注解

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.RestController;@RestController
@RequestMapping("/test")
public class TestController {@GetMapping("sayhi2")public String sayHi2(){return "你好,世界";}
}

 

 🍂@PostMapping注解

package com.example.demo.controller;import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/test")
public class TestController {@PostMapping("sayhello")public String sayHi2(){return "你好,世界";}
}

 

 


三、获取参数

1、实现获取单个参数

1️⃣使用servlet的写法(getParameter)来实现获取单个参数


import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletRequest;@RestController
@RequestMapping("/test2")
public class TestController2 {@RequestMapping("/getname")public String getName(HttpServletRequest request){return "Name:"+ request.getParameter("name");}
}

 2️⃣使用更简单的获取单个参数的方法

package com.example.demo.controller;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/test2")
public class TestController2 {@RequestMapping("/getname2")public String getName2(String name){return "Name: "+name;}
}

 


2、实现获取对象

上面获取单个参数的方式,当参数个数固定的时候可以使用,但是如果参数个数不确定,随时都需要添加参数的时候,我们这个时候可以使用获取对象的方式获取参数,前端没有对象的概念,传递的都是对象的属性,后端代码中需要创建一个(用户)类的对象,用来接收前端传过来的属性的值。

package com.example.demo.model;import lombok.Data;@Data
public class User {private int id;private String name;private String password;private int age;
}package com.example.demo.controller;import com.example.demo.model.User;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/user")
public class UserController {@RequestMapping("/add")public User add(User user){return user;}
}

 当前端的属性和后端中类的属性对应不全的时候,如果后端没有相应的属性,那么前端的属性赋值不到后端的代码中,如果前端没有相应的后端代码中的属性,那么后端中类的属性的值就是默认值。


3、后端参数重命名(@RequestParam参数映射)

特殊情况下,前端传递的参数key和我们后端接收的key可以不一致,比如前端传递了一个n给后端,而后端使用的时name参数来接收的,这个时候就会出现参数接收不到的问题,我们可以使用@RequestParam注解来重命名前后端的参数。


import com.example.demo.model.User;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/user")
public class UserController {@RequestMapping("/name")public String name(@RequestParam ("n") String name){return name;}
}

 4、@RequestParam参数必传设置

使用@RequestParam注解之后,那么这个属性就变成了必传的参数了,不传这个参数就会报错,原因是因为@RequestParam注解中有一个required属性等于true,表示这个参数为必传的,我们只需要设置这个属性为false即可解决必传的问题。

 

    @RequestMapping("/name")public String name(@RequestParam (value="n",required = false) String name){return name;}

 5、接收JSON对象(@RequestBody)

这里只需要使用@RequestBody就可以拿到前端传递的JSON对象

    @RequestMapping("/add_json")public User addByJson(@RequestBody User user){return user;}

 


6、获取URL中参数(@PathVariable)

之前我们是通过URL中的查询字符串的部分获取的参数,也就是name="xxx"&id=123的部分。但是有点网站不是通过这样的方式传递参数的,就像掘金一样。访问它的有些页面时URL是这样的https://juejin.cn/user/61228381386487。他没有通过查询字符串的方式传递。

1️⃣从前端获取一个参数

    @RequestMapping("/detial/{id}")public Integer detail(@PathVariable("id") Integer id){return id;}

 这里表示前端要传递的参数为id,所以这里需要使用一个{}将这个参数括起来

2️⃣表示从前端获取多参数

    @RequestMapping("/detial/{id}/{name}")public String detail(@PathVariable("id") Integer id,@PathVariable("name") String name){return "id: "+id+" "+"name: "+name;}

 7、上传文件(@RequestPart)

@RequestPart用于将multiparty/form-data类型的数据映射到控制器处理方法的参数中。

    @RequestMapping("/upload")public String upload(@RequestPart("myfile") MultipartFile file) throws IOException {String path = "D:/img.png";file.transferTo(new File(path));return path;}
}

这里@RequestPart("file")表示从请求中获取名为"file"的文件,长传的文件将被存储在file对象中,我们可以是以哦那个file对象的方法类处理上传的文件。

 在D盘中获取到了这个图片文件,并将图片名字改为了img

但是这样编写的后端代码存在问题,就是客户端每次访问服务器程序,服务器返回的图片名字都是一样的,那么在D盘中,后面获取的图片会将之前获取的覆盖掉,这是不完善的,如果在客户端点击上传的图片不同,最终服务器将不同的图片名字改成一样的,两张不同的照片只能保存其中一个。

✨下面我们来解决这个问题

这里将路径中的文件名通过生成一个全球唯一id得到的,文件类型是截取原文件的。

    @RequestMapping("/upload")public String upload(@RequestPart("myfile") MultipartFile file) throws IOException {//1、生成一个唯一的id(UUID就是全球唯一ID,他是由MAC地址+随机数+加密算法组成的,保证生成的id是全球唯一ID)String name = UUID.randomUUID().toString().replace("-","");//2、得到源文件的后缀名name += file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));String path = "D:/"+name;//将文件保存在path路径中file.transferTo(new File(path));return path;}

可以看见每次获取的文件名称都是不一样的,也不会将之前获取的文件覆盖掉。

 


8、获取Cookie/Session/header

 通过@CookieValue获取Cookie

    @RequestMapping("/getcookie")public String getCookie(@CookieValue("java")String ck){return ck;}

 通过@CookieValue注解类获取Session

    @RequestMapping("/getsess")//这里的value指的是session的名字public String getSess(@SessionAttribute(value="username",required = false) String username){return username;}

通过@RequestHeader获取Header

// @RequestHeader 获取 header
@RequestMapping("/header")
public String header(@RequestHeader("User-Agent") String userAgent) {return "User-Agent: " + userAgent;
}

四、返回数据

1、返回一个静态页面

在项目中创建一个静态的html页面。使用@Controller注解默认的是返回一个页面

package com.example.demo.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;@Controller
public class TestController3 {@RequestMapping("/hello")public String index(){return "hello.html";}}

 

 2、返回一个数据

使用@ResponseBody和@Controller注解搭配使用,让返回的值是一个数据,也可以使用组合注解@RestController注解

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
@ResponseBody
public class TestController3 {@RequestMapping("/hello")public String index(){return "hello.html";}
}

 3、返回text/html

可以使用组合注解@RestController也可以使用@Controller和@ResponseBody搭配使用

@RestController
public class TestController3 {@RequestMapping("method")public String method(){return "<h1>hello,world!</h1>";}

4、请求转发和请求重定向

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

  • forward是请求转发;
  • redirect是请求重定向。
// 请求重定向
@RequestMapping("/index1")
public String index1() {return "redirect:/index.html";
}
// 请求转发
@RequestMapping("/index2")
public String index2() {return "forward:/index.html";
}

✨请求重定向和请求转发的区别

  • 请求转发是一种服务器行为,客户端只有一次请求,服务器接收到客户端的请求之后,会先将请求转发给目标地址,在将目标地址返回的结果转发给客户端。客户端对这一切毫无感知。这就像A找B借钱,B没有,B向C借到之后,将钱给了A,整个过程A就直借了一次钱。B向C借钱A不知道。
  • 请求重定向是指服务器端接收到客户端的请求之后,会给客户端返回一个临时相应头,这个响应头中记录了,客户端需要再次发送请求(重定向)的URL地址,客户端收到地址之后,会将请求发送到新的地址上,这就是请求重定向。就像A找B借钱,B没有,但是B知道C有,B对A说C有,让A 去C哪里借,然后A去找C去借,这个过程就是请求重定向。

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

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

相关文章

FPGA:RS编码仿真过程

FPGA&#xff1a;RS编码仿真过程 RS码是一种纠错性能很强的线性纠错码&#xff0c;能够纠正随机错误和突发错误。RS码是一种多进制BCH码&#xff0c;能够同时纠正多个码元错误。 之前已经记录了在MATLAB中进行rs编解码的过程&#xff0c;现在利用FPGA的IP核实现RS编码的过程&…

怎么自己制作动图表情包?在线gif生成的操作步骤

gif表情包在我们平时的生活里斗图的时候经常会用到&#xff0c;那么如何用图片制作gif&#xff08;https://www.gif.cn&#xff09;表情包呢&#xff1f;今天就分享一个在线gif生成的简单方法&#xff0c;利用gif制作工具将图片转gif动图&#xff0c;下面是详细的操作步骤。 打…

测试相关Liunx基础知识

Linux的历史和安装 基本常识 Liunx目录结果 常见

(el-Table)操作(不使用 ts):Element-plus 中Table 表格组件:多选修改成支持单选及表格相关样式的调整

Ⅰ、Element-plus 提供的 Table 表格组件与想要目标情况的对比&#xff1a; 1、Element-plus 提供 Table 组件情况&#xff1a; 其一、Element-ui 自提供的 Table 代码情况为(示例的代码)&#xff1a; // Element-plus 自提供的代码&#xff1a; // 此时是使用了 ts 语言环境…

echart图案例

效果 代码&#xff1a; index.vue <template><div class"pageBox"><div class"oneLineBox"><div class"fourColorImgBox"><div class"titleBox">企业风险四色图</div><div class"conte…

LVS-DR集群(一台LVS,一台CIP,两台web,一台NFS)的构建

一.构建环境 1.五台关闭防火墙&#xff0c;关闭selinux&#xff0c;拥有固定IP&#xff0c;部署有http服务的虚拟机&#xff0c;LVS设备下载ipvsadm工具&#xff0c;NFS 设备需要下载rpcbind和nfs-utils 2.实现功能 3.ipvsadm命令部分参数介绍 二.配置和测试 1.LVS设备 &…

互联网发展历程:从布线到无线,AC/AP的崭新时代

互联网的发展&#xff0c;一直在追求更便捷、更灵活的连接方式。在网络的早期&#xff0c;布线问题常常让人头疼。一项革命性的技术应运而生&#xff0c;那就是“无线AC/AP”。 布线问题的烦恼&#xff1a;繁琐的布线 早期网络的布线工作常常耗费时间和精力&#xff0c;尤其在大…

虫情测报灯——监测预警分析

KH-CQPest虫情测报灯是专为田间虫害统计、农林虫情测报而研制的设备&#xff0c;利用光、电、数控等技术实现自动诱虫、杀虫、虫体分散、拍照、运输、收集、排水等系统作业等功能&#xff0c;当有害虫出现时&#xff0c;会受到诱集光源的影响&#xff0c;自动飞扑撞向撞击屏&am…

互联网+AI+智慧工地管理平台源码(Spring Cloud +Vue)

基于微服务JavaSpring Cloud VueUniApp MySql开发的智慧工地管理源码&#xff0c;SaaS模式。 一、智慧工地概念 智慧工地就是互联网建筑工地&#xff0c;是将互联网的理念和技术引入建筑工地&#xff0c;然后以物联网、移动互联网技术为基础&#xff0c;充分应用BIM、大数据、…

基于Python科研论文绘制学习 - task1

绘制原则 必要性&#xff08;避免图多字少&#xff09; 易读性&#xff08;完整准确的标题、标签&#xff09; 一致性&#xff08;配图需要和上下文一致&#xff09; 尝试运行代码的时候出现了很多bug&#xff0c;基本都是围绕Scienceplots库的&#xff0c;在更新pip、pandas…

asp.net core webapi如何执行周期性任务

使用Api执行周期性任务 第一种&#xff0c;无图形化界面1.新建类&#xff0c;继承IJob&#xff0c;在实现的方法种书写需要周期性执行的事件。2.编写方法类&#xff0c;定义事件执行方式3.在启动方法中&#xff0c;进行设置&#xff0c;.net 6中在program.cs的Main方法中&#…

MySQL学习笔记之MySQL5.7用户管理

文章目录 用户创建用户修改修改用户名修改密码修改自己的密码修改其他用户的密码 删除用户权限管理查看所有权限授予权限回收权限权限表columns_privprocs_privtables_priv 用户创建 基本格式&#xff1a;create user 用户名 identified by 密码; mysql> create user szc …

Docker 基本管理

Docker 基本管理 一、容器1.容器简介2.容器的优点 二、Docker1.docker定义2.docker的logo及设计宗旨3.Docker与虚拟机的区别4.容器在内核中支持2种重要技术5.namespace的六项隔离6.Docker核心概念 三、安装 Docker1.安装部署2.相关命令 四、Docker 镜像操作1.搜索镜像2.获取镜像…

领航优配:券商板块热度不减,华林证券涨停,中银证券等走高

券商板块15日午后再度走强&#xff0c;截至发稿&#xff0c;华林证券涨停&#xff0c;中银证券涨超7%&#xff0c;兴业证券涨超3%&#xff0c;东方财富、华泰证券、太平洋等涨逾2%。 组织表示&#xff0c;当前券商PB估值为1.36倍&#xff0c;位于2020年以来的34%分位点附近&…

Redis心跳检测

在命令传播阶段&#xff0c;从服务器默认会以每秒一次的频率&#xff0c;向主服务器发送命令&#xff1a; REPLCON FACK <rep1 ication_ offset>其中replication_offset是从服务器当前的复制偏移量。 发送REPLCONF ACK命令对于主从服务器有三个作用&#xff1a; 检测主…

编程小白的自学笔记十三(python办公自动化读写文件)

系列文章目录 编程小白的自学笔记十二&#xff08;python爬虫入门四Selenium的使用实例二&#xff09; 编程小白的自学笔记十一&#xff08;python爬虫入门三Selenium的使用实例详解&#xff09; 编程小白的自学笔记十&#xff08;python爬虫入门二实例代码详解&#xff09;…

ClickHouse(十八):Clickhouse Integration系列表引擎

进入正文前&#xff0c;感谢宝子们订阅专题、点赞、评论、收藏&#xff01;关注IT贫道&#xff0c;获取高质量博客内容&#xff01; &#x1f3e1;个人主页&#xff1a;含各种IT体系技术&#xff0c;IT贫道_Apache Doris,大数据OLAP体系技术栈,Kerberos安全认证-CSDN博客 &…

数据结构与算法-栈(LIFO)(经典面试题)

一&#xff1a;面试经典 1. 如何设计一个括号匹配的功能&#xff1f;比如给你一串括号让你判断是否符合我们的括号原则&#xff0c; 栈 力扣 2. 如何设计一个浏览器的前进和后退功能&#xff1f; 思想&#xff1a;两个栈&#xff0c;一个栈存放前进栈&…

派克Parker伺服驱动器 高性能电机控制系统的应用详解

派克Parker伺服驱动器及电机是一种高性能的电机控制系统&#xff0c;广泛应用于机器人、医疗设备、工业自动化和航空航天等领域。具有高精度、高可靠性、高动态性能、低噪音、低振动、低能耗等优点&#xff0c;采用了先进的数字信号处理技术&#xff0c;能够实现高精度的位置控…

回归预测 | MATLAB实现基于SAE堆叠自编辑器多输入单输出回归预测

回归预测 | MATLAB实现基于SAE堆叠自编辑器多输入单输出回归预测 目录 回归预测 | MATLAB实现基于SAE堆叠自编辑器多输入单输出回归预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.MATLAB实现基于SAE堆叠自编辑器多输入单输出回归预测&#xff1b; 2.运行环…