Spring MVC程序开发

目录

1.什么是Spring MVC?

1.1MVC定义

1.2MVC和Spring MVC的关系

2.为什么要学习Spring MVC?

3.怎么学Spring MVC?

3.1Spring MVC的创建和连接

3.1.1创建Spring MVC项目

3.1.2@RequestMapping 注解介绍

3.1.3 @RequestMapping 是 post 还是 get 请求?

​编辑 3.1.4 @GetMapping 和 PostMapping

3.2 获取参数

3.2.1 传递单个参数

3.2.2 传递对象

3.2.3 表单参数传递/传递多个参数(⾮对象)

 

3.2.4 后端参数重命名(后端参数映射)

3.2.5 设置参数必传@RequestParam

3.2.6 @RequestBody 接收JSON对象

3.2.7 获取URL中参数@PathVariable

3.2.8 上传⽂件@RequestPart

3.2.9 获取Cookie/Session/header

​编辑 3.2.10返回Jason对象

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


1.什么是Spring MVC?

官⽅对于 Spring MVC 的描述是这样的:
Spring Web MVC is the original web framework built on the Servlet API and has been included
comes from the name of its source module (
in the Spring Framework from the very beginning. The formal name, “Spring Web MVC,”
Spring Web MVC is the original web framework built on the Servlet API and has been included
spring-webmvc as “Spring MVC”. ), but it is more commonly known as “Spring MVC”.
翻译成中文:
Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,从⼀开始就包含在 Spring 框架中。它的正式名称“Spring Web MVC”来⾃其源模块的名称(Spring-webmvc),但它通常被称为“Spring MVC”。
上述定义中我们可以得出两个关键信息:
1.Spring MVC是一个Web框架。
2.SPring MVC是基于servlet API构建的。
然⽽要真正的理解什么是 Spring MVC?我们⾸先要搞清楚什么是 MVC?

1.1MVC定义

MVC 是 Model View Controller 的缩写,它是软件⼯程中的⼀种软件架构模式,它把软件系统分为模型、视图和控制器三个基本部分。
Model(模型)是应⽤程序中⽤于处理应⽤程序数据逻辑的部分。通常模型对象负责在数据库中存取数据。
View(视图)是应⽤程序中处理数据显示的部分。通常视图是依据模型数据创建的。
Controller(控制器)是应⽤程序中处理⽤户交互的部分。通常控制器负责从视图读取数据,
控制⽤户输⼊,并向模型发送数据。

1.2MVC和Spring MVC的关系

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

2.为什么要学习Spring MVC?

现在绝⼤部分的 Java 项⽬都是基于 Spring(或 Spring Boot)的,⽽ Spring 的核⼼就是 Spring
MVC。也就是说 Spring MVC 是 Spring 框架的核⼼模块,⽽ Spring Boot 是 Spring 的脚⼿架,因此我们可以推断出,现在市⾯上绝⼤部分的 Java 项⽬约等于 Spring MVC 项⽬,这是我们要学 Spring MVC 的原因。
在创建 Spring Boot 项⽬时,我们勾选的 Spring Web 框架其实就是 Spring MVC 框架,如下图所
示:
简单来说,咱们之所以要学习 Spring MVC 是因为它是⼀切项⽬的基础,我们以后创建的所有
Spring、Spring Boot 项⽬基本都是基于 Spring MVC 的。

3.怎么学Spring MVC?

学习 Spring MVC 我们只需要掌握以下 3 个功能:
1. 连接的功能:将⽤户(浏览器)和 Java 程序连接起来,也就是访问⼀个地址能够调⽤到我们的
Spring 程序。
2. 获取参数的功能:⽤户访问的时候会带⼀些参数,在程序中要想办法获取到参数。
3. 输出数据的功能:执⾏了业务逻辑之后,要把程序执⾏的结果返回给⽤户。
对于 Spring MVC 来说,掌握了以上 3 个功能就相当于掌握了 Spring MVC。

3.1Spring MVC的创建和连接

Spring MVC 项⽬创建和 Spring Boot 创建项⽬相同(Spring MVC 使⽤ Spring Boot 的⽅式创建),在创建的时候选择 Spring Web 就相当于创建了 Spring MVC 的项⽬。
在 Spring MVC 中使⽤ @RequestMapping 来实现 URL 路由映射,也就是浏览器连接程序的作⽤。

3.1.1创建Spring MVC项目

Spring MVC 可以基于 Spring Boot 创建,也就是创建⼀个 Spring Boot 项⽬,勾选上 Spring Web
模块即可,如下图所示:

接下来,创建⼀个类,实现⽤户到 Spring 程序的互联互通,具体实现代码如下:

@Controller//让Spring框架启动时加载
@ResponseBody//返回非页面数据
@RequestMapping("/user")//路由器规则注册
public class UserController {
    @RequestMapping("/hi")
    public String sayHi(){
        return "hi,Spring MVC";

    }
}

访问地址127.0.0.1:8081/user/hi就可以打印出想要的文字:

3.1.2@RequestMapping 注解介绍

@RequestMapping 是 Spring Web 应⽤程序中最常被⽤到的注解之⼀,它是⽤来注册接⼝的路
由映射的。
路由映射:所谓的路由映射指的是,当⽤户访问⼀个 url 时,将⽤户的请求对应到程序中某个类
的某个⽅法的过程就叫路由映射。

@RequestMapping的基础使用:

@Controller
@RequestMapping("/web")
public class WebController {
    @RequestMapping("/index")
    public String index(){
//        return "hello,springmvc";
        return "/index.html";
    }
    @ResponseBody
//    @RequestMapping(value = "/indexData",method = RequestMethod.POST)
//    @PostMapping("/indexData")
    @GetMapping("/indexData")
    public String indexData(){
        return "hello,springmvc";
//        return "/index.html";
    }
}
@RequestMapping 即可修饰类,也可以修饰⽅法,当修饰类和⽅法时,访问的地址是类 + 方法。
@RequestMapping 也可以直接修饰⽅法,代码实现如下:
@Controller
@ResponseBody
public class UserController1 {
    @RequestMapping("/hi")
    public String sayHi(){
        return "hi,Spring";
    }
}

3.1.3 @RequestMapping 是 post 还是 get 请求?

使⽤ PostMan 测试⼀下,默认情况下使⽤注解 @RequestMapping 是否可以接收 GET 或 POST 请求?

根据postman可以发现,@RequestMapping既有post请求,也有get请求。那如果只想要post或者get请求呢?

指定 GET/POST ⽅法类型:

我们可以显示的指定 @RequestMapping 来接收 GET的情况,如下所示:
public class UserController1 {
    @RequestMapping(value = "/hi2",method = RequestMethod.GET)
    public String sayHi2(){
        return "hi,Spring";
    }
}

 3.1.4 @GetMapping 和 PostMapping

get 请求的 3 种写法:
//写法1
@RequestMapping("/hi2")
//写法2
@RequestMapping(value = "/hi2",method = RequestMethod.GET)
//写法3
@GetMapping("hi2")

post请求的2种写法:

//写法1
@RequestMapping(value = "hi2",method = RequestMethod.POST)
//写法2
@PostMapping("hi2")

3.2 获取参数

3.2.1 传递单个参数

在 Spring MVC 中可以直接⽤⽅法中的参数来实现传参,⽐如以下代码:

    @RequestMapping("/get2")
    public String get2(String name){
        return "name:"+name;
    }

 在 postman 中访问⽅法:

3.2.2 传递对象

并且 Spring MVC 可以⾃动实现参数对象的赋值,⽐如Student对象:

@Data
public class Student {
    private Integer id;
    private  String name;
    private Integer age;
    private String nickname;
}

 传递对象代码实现:

    @RequestMapping("/get6")
    public String get6(Student student){
        return student.toString();
    }
前端访问:

最终执行结果:

3.2.3 表单参数传递/传递多个参数(⾮对象)

    @RequestMapping("/get3")
    public String get3(String name,Integer age){
        return "name:"+name+","+"age:"+age;
    }

重要说明:当有多个参数时,前后端进⾏参数匹配时,是以参数的名称进⾏匹配的,因此参数的位置是不影响后端获取参数的结果。

3.2.4 后端参数重命名(后端参数映射)

某些特殊的情况下,前端传递的参数 key 和我们后端接收的 key 可以不⼀致,⽐如前端传递了⼀个time 给后端,⽽后端⼜是有 createtime 字段来接收的,这样就会出现参数接收不到的情况,如果出现这种情况,我们就可以使⽤ @RequestParam 来重命名前后端的参数值。
具体示例如下,后端实现代码:
    @RequestMapping("/m4")
    public Object method4(@RequestParam("time") String createtime){
        System.out.println("时间:" + createtime);
        return "/index.html";
    }

3.2.5 设置参数必传@RequestParam

上⾯的列⼦,如果我们是前端传递⼀个⾮ time 的参数,就会出现程序报错的情况,如下图所示:

这是因为后端已经声明了前端必须传递⼀个 time 的参数,但是前端没有给后端传递,我们查看
@RequestParam 注解的实现细节就可以发现端倪,注解实现如下:

⾮必传参数设置

如果我们的实际业务前端的参数是⼀个⾮必传的参数,我们可以通过设置 @RequestParam 中的
required=false 来避免不传递时报错,具体实现如下:
    @RequestMapping("/m4")
    public Object method4(@RequestParam(value = "time",required = false) String createtime) 
    {
        System.out.println("时间:" + createtime);
        return "/index.html";
    }

3.2.6 @RequestBody 接收JSON对象

后端接收代码:

    @RequestMapping("/get8")
    public String get8(@RequestBody Student student){
        log.info(student.toString());
        return student.toString();
    }

3.2.7 获取URL中参数@PathVariable

后端实现代码:

    //取url地址
    @RequestMapping("/get9/{shopid}/{dealid}")
    public String get9(@PathVariable Integer shopid,@PathVariable("dealid") Integer dealId) 
    {
        return "shopid:"+shopid+",dealId:"+dealId;
    }

字段需要保持一致,如果不一致,需要在@PathVariable设置参数的名称 

3.2.8 上传⽂件@RequestPart

后端代码实现:

    @RequestMapping("/get10")
    public String get10(@RequestPart("file") MultipartFile file) throws IOException {
        log.info(file.getOriginalFilename());
        file.transferTo(new File("D:/temp/"+file.getOriginalFilename()));
        return "success";
    }

3.2.9 获取Cookie/Session/header

后端代码实现:

使用@CookieValue注解来实现

    @RequestMapping("/get11")
    public String grt11(@CookieValue(name = "bite1",required = false) String bite){
        return "bite:"+bite;
    }

如果cookie中不存在这个key,就会报错

我们手动设置cookie,页面就会访问成功,所以cookie是可以造假的。

获取session:

后端代码实现:

    @RequestMapping("/get12")
    public String grt12(@SessionAttribute(required = false) String username){
        return "username:"+username;
    }

直接执行是获取不到session的,我们需要在后端中设置session 

设置session:

后端代码实现:
 

    @RequestMapping("/set1")
    public String set1(HttpSession session){
        session.setAttribute("username","bite");
        return "success";
    }

先执行这个方法,就会在前端获取到session:

 session在存储时就是以键值对的方式存储的

获取header:

后端代码实现:

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

 3.2.10返回Jason对象

    @RequestMapping("/get14")
    public Map<String,String> get14(){
        Map<String,String>map=new HashMap<>();
        map.put("k1","v1");
        map.put("k2","v2");
        map.put("k3","v3");
        map.put("k4","v4");
        map.put("k5","v5");
        return map;
    }

 

使用filder抓包:

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

return 不但可以返回⼀个视图,还可以实现跳转,跳转的⽅式有两种:
forward 是请求转发;
redirect:请求重定向。
请求转发和重定向的使⽤对⽐:
@Controller
@RequestMapping("/index")
public class IndexController {
    /**
     * 请求转发
     * @return
     */
    @RequestMapping("/forward")
    public String forward(){
        return "forward:/index.html";
    }
    @RequestMapping("/redirect")
    public String redirect(){
        return "redirect:/index.html";
    }
}
举例说明 forward 和 redirect
forward(请求转发)和 redirect(请求重定向)的区别,举例来说,例如,你告诉你妈妈,你想吃辣条,如果你妈妈,说好,我帮你去买,这就是 forward 请求转发;如果你妈妈让你⾃⼰去买,那么就是请求 redirect 重定向。
“转发”和“重定向”理解:在中国官⽅发布的内容越少事也越⼤, “转发”和“重定向”也是⼀样:字越
少,责任越⼤ 。转发是服务器帮转的,⽽重定向是让浏览器重新请求另⼀个地址。
forward 和 redirect 具体区别如下:
1. 请求重定向(redirect)将请求重新定位到资源;请求转发(forward)服务器端转发。
2. 请求重定向地址发⽣变化,请求转发地址不发⽣变化。
3. 请求重定向与直接访问新地址效果⼀直,不存在原来的外部资源不能访问;请求转发服务器端转发有可能造成原外部资源不能访问。

使用forward不会改变url

 

使用redirect会改变url。

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

聊聊工程化 Docker 的最新趋势以及最佳实践

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

【Linux】Centos7 的 Systemctl 与 创建系统服务 (shell脚本)

Systemctl systemctl 命令 # 启动 systemctl start NAME.service # 停止 systemctl stop NAME.service # 重启 systemctl restart NAME.service # 查看状态 systemctl status NAME.service # 查看所有激活系统服务 systemctl list-units -t service # 查看所有系统服务 syste…

怎么查看企业的征信报告

一、企业征信报告是什么&#xff1f; 企业征信报告是对企业信用状况、财务状况和经营状况等信息进行综合评估的重要工具&#xff0c;为合作伙伴、供应商、投资者等提供了重要的参考并做出明智的决策。企业信用报告记录了企业的信用记录、债务情况以及过往的经营表现等&#xf…

【Ajax】笔记-JQuery发送jsonp请求

前端 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>jQuery-jsonp</title><style>#re…

腾讯地图点标记加调用

先看效果 PHP代码 <?phpnamespace kds_addons\edata\controller;use think\addons\Controller; use think\Db;class Maps extends Controller {// 经纬度计算面积function calculate_area($points){$totalArea 0;$numPoints count($points);if ($numPoints > 2) {…

【MySQL】视图与用户管理

【MySQL】视图 视图视图概念使用基表与视图的相互影响 用户管理新增用户删除修改密码 用户权限授予权限回收权限 视图 视图概念 视图就是一张虚拟表&#xff0c;其内容由查询定义。与真实的表一样&#xff0c;视图包含一系列带有名称的列和行数据。视图的数据变化影响到基表&…

Linux下.py文件只读问题以及解决过程

一、问题描述 如图&#xff0c;在Ubuntu Linux系统中使用pycharm管理项目文件时&#xff0c;无法编辑&#xff0c;提示文件为只读&#xff1a; 点击"OK"后仍旧无法清除只读模式&#xff0c;并报错&#xff1a; 二、问题解决 将问题定性为文件权限相关问题&#…

【英杰送书-第六期】spring—加载监听器

前几天的时候&#xff0c;项目里有一个需求&#xff0c;需要一个开关控制代码中是否执行一段逻辑&#xff0c;于是理所当然的在yml文件中配置了一个属性作为开关&#xff0c;再配合nacos就可以随时改变这个值达到我们的目的&#xff0c;yml文件中是这样写的&#xff1a; switc…

2023年全新版Java学习路线,精心整理【文中送书福利 】

小伙伴们大家好&#xff0c;这里是动力节点&#xff0c;我们从2009年开始一直在从事Java培训 到今年已经整14年了&#xff0c;虽然现在不缺培训机构&#xff0c;更不缺Java培训&#xff0c;但是像我们这么多年专注这一件事的应该也不多。我们只希望在“专业”两个字上面不断精…

【测试学习四】掌握测试用例的设计方法有哪些~

目录 需要知道&#xff1a;了解测试用例 &#x1f337;1、测试用例的基本要素&#xff1f; &#x1f337;2、什么是好的测试用例&#xff1f; &#x1f337;3、不学习测试用例的设计方法&#xff0c;能不能对一个物体或软件进行测试&#xff1f; 一、基于黑盒测试用例的设计…

Redis集群Cluster搭建

Redis集群Cluster搭建 集群框架1、下载redis2.创建Cluster文件3.修改redis配置文件4.启动redis5.链接各个redis6.分配槽位7.添加从机节点&#xff08;备份Redis&#xff09;8.以集群方式登录9.使用开源Redis可视化客户端链接 集群框架 三个集群节点&#xff0c;每个节点有个副本…

sqlserver 使用SQLOLEDB 远程数据库同步数据

exec sp_addlinkedserver remote_server, , SQLOLEDB, ip exec sp_addlinkedsrvlogin remote_server, false,null, 账号, 密码 --查询方式 select * from remote_server.数据库名.dbo.表名 --不再使用时删除链接服务器 exec sp_dropserver remote_server, droplogins…

活动预告 | 中国数据库联盟(ACDU)中国行第二站定档杭州,邀您探讨数据库技术与实践!

数据库技术一直是信息时代中不可或缺的核心组成部分&#xff0c;随着信息量的爆炸式增长和数据的多样化&#xff0c;其重要性愈发凸显。作为中国数据库联盟&#xff08;ACDU&#xff09;的品牌活动之一&#xff0c;【ACDU 中国行】在线下汇集数据库领域的行业知名人士&#xff…

JVM基础篇-方法区与运行时常量池

JVM基础篇-方法区与运行时常量池 方法区 Java 虚拟机有一个在所有 Java 虚拟机线程之间共享的方法区。方法区类似于传统语言的编译代码的存储区或者类似于操作系统进程中的“文本”段。它存储每个类的结构&#xff0c;例如运行时常量池、字段和方法数据&#xff0c;以及方法和…

在 3ds Max 中使用相机映射将静止图像转换为实时素材

推荐&#xff1a; NSDT场景编辑器 助你快速搭建可二次开发的3D应用场景 1. 在 Photoshop 中准备图像 步骤 1 这是我将在教程中使用的静止图像。 这是我的静态相机纸箱的快照。 静止图像 步骤 2 打开 Photoshop。将图像导入 Photoshop。 打开 Photoshop 步骤 3 单击套索工…

Web端即时通讯技术(SEE,webSocket)

目录 背景简介个人见解被动推送轮询简介实现 长轮询&#xff08;comet&#xff09;简介实现 比较 主动推送长连接&#xff08;SSE&#xff09;简介实现GETPOST 效果 webSocket简介WebSocket的工作原理:WebSocket的主要优点:WebSocket的主要缺点: 实现用法一用法二 效果 比较参考…

第17节 R语言分析:生物统计数据集 R 编码分析和绘图

生物统计数据集 R 编码分析和绘图 生物统计学,用于对给定文件 data.csv 中的医疗数据应用 R 编码,该文件是患者人口统计数据集,包含有关来自各种祖先谱系的个体的标准信息。 数据集特征解释 脚本 output= file("Output.txt") # File name of output log sink(o…

【Docker】Docker安装Kibana服务_Docker+Elasticsearch+Kibana

文章目录 1. 什么是Kibana2. Docker安装Kibana2.1. 前提2.2. 安装Kibana 点击跳转&#xff1a;Docker安装MySQL、Redis、RabbitMQ、Elasticsearch、Nacos等常见服务全套&#xff08;质量有保证&#xff0c;内容详情&#xff09; 1. 什么是Kibana Kibana 是一款适用于Elasticse…

C++中内存的动态管理

我们在C语言中了解到可以在栈区动态开辟空间&#xff0c;并且用完要进行释放&#xff0c;防止内存泄漏。 引入 C中也有可以进行动态开辟空间和释放空间的操作符new 、delete&#xff0c;虽然C中也可以用malloc、calloc、realloc、free函数&#xff0c;但是C中引入了类&#x…

二十三种设计模式第二十二篇--中介者模式

说到这个模式就有趣了&#xff0c;不知道大家在生活中喷到过中介没&#xff1f;其实中介这个词吧&#xff0c;我也说不上好还是坏&#xff0c;有时候他可以帮助人们更快的达到某个目的&#xff0c;但有的时候吧&#xff0c;这个有贼坑人&#xff0c;相信网络上有各种被中介坑的…