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

news2024/11/16 12:02:10

目录

前言:

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")
    @ResponseBody
    public String index2() {
        return "<h1>Hello Spring MVC</h1>";
    }
}

结果展示:

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

结束语:

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

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

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

相关文章

罗彻斯特大学探讨ChatGPT等人工智能将如何影响高等教育

人工智能聊天机器人ChatGPT持续引起互联网用户的热议&#xff0c;它能够回答关于各个领域的问题&#xff0c;创作歌曲、食谱&#xff0c;起草电子邮件等等。罗切斯特的教职员工和管理人员就他们如何处理 ChatGPT 以及它如何影响未来的教学和学习提出了他们的想法。 “让这项技…

基于Java的新能源汽车在线租赁平台设计与实现(源码+lw+ppt+部署文档+视频讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

基于ChatGPT快速入门体验NLP词云

基于ChatGPT快速入门体验NLP词云 一、什么是自然语言处理二、自然语言处理和词云的关系三、Python环境准备四、基于ChatGpt制作词云4.1 ChatGPT生成初级词云代码4.2 ChatGPT生成进阶词云代码4.3 基于ChatGPT解决代码问题4.4 基于ChatGPT建议修改问题代码 一、什么是自然语言处理…

c语言进阶部分详解(详细解析字符串常用函数,并进行模拟实现)

前段时间也是把指针较为详细系统的讲解完毕&#xff0c;接下来介绍一个全新的知识点&#xff0c;就是字符函数和字符串函数 前几期文章可进我主页观看&#xff1a;总之就是非常唔姆_Matlab,经验分享,c语言题目分享-CSDN博客 想要源代码可以去我的github看看&#xff1a;Neros…

教你拥有一个自己的QQ机器人!0基础超详细保姆级教学!基于NoneBot2 Windows端搭建QQ机器人

0.序言 原文链接&#xff1a;教你本地化部署一个QQ机器人本教程主要面向Windows系统用户教程从0开始全程详细指导&#xff0c;0基础萌新请放心食用&#x1f355;如果你遇到了问题&#xff0c;请仔细检查是否哪一步有遗漏。如果你确定自己的操作没问题&#xff0c;可以到原文链…

苹果macbook电脑磁盘满了怎么清理内存

如果你是苹果macbook用户&#xff0c;可能会面临一个常见但又令人头疼的问题——磁盘空间不足。这不仅影响了你的电脑性能&#xff0c;还可能导致新的软件无法安装&#xff0c;甚至影响到文件的保存。好消息是&#xff0c;有多种方法可以有效地解决这个问题。下面就一起来看看吧…

【100个 Unity实用技能】☀️ | UGUI Text中加入超链接文本,可直接点击跳转

Unity 小科普 老规矩&#xff0c;先介绍一下 Unity 的科普小知识&#xff1a; Unity是 实时3D互动内容创作和运营平台 。包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者&#xff0c;借助 Unity 将创意变成现实。Unity 平台提供一整套完善的软件解决方案&#xff…

unity脚本_Input鼠标键盘 c#

获取鼠标坐标 检测鼠标输入 如果在运行游戏场景中点击一下鼠标左键 检测鼠标抬起 选中即可 检测键盘按下 当前屏幕分辨率 注意&#xff1a;获取的是显示器的分辨率 获取设备屏幕宽高 屏幕休眠模式 窗口/全屏模式 移动设备屏幕转向

【C语言】字符函数和字符串函数(1)

#国庆发生的那些事儿# 大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家了解字符函数和字符串函数&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 目录 1.本章重点2. strlen2.1函数介绍2.2 模拟实现 3. strcpy3…

第八章 排序 六、简单选择排序

目录 一、算法思想 二、例子 1、我们有以下序列要排序 2、首先从左往右扫描&#xff0c;在其中找到最小的一个数&#xff0c;让它与第一个数互换位置 3、此次扫描完成后&#xff0c;我们取新的子序列&#xff0c;并再次从左往右扫描&#xff0c;在其中找到最小的一个数&…

makeMakefile

一、 什么是make&Makefile &#xff1f; ①make 是一条命令,makefile是一个文件,配合使用,通过依赖关系和依赖方法达到我们形成可执行程序的目的 ②makefile好处就是可以进行 自动化编译 ” &#xff0c;极大的提高软件开发的效率,一旦写好&#xff0c;只需要一个 make 命令…

推荐一款在线的JDK17中文文档

spring6.0及springboot3.0最低版本要求都是java17&#xff0c;换上java17是迟早的事&#xff0c;所以虽然我现在做的是java8&#xff0c;但是后面我想从java8直接飞升到java17&#xff0c;先做个准备&#xff0c;找到一个JDK17的中文文档&#xff0c;是在线的&#xff0c;地址&…

数据结构刷题训练——二叉树篇(一)

&#x1f4d9;作者简介&#xff1a; 清水加冰&#xff0c;目前大二在读&#xff0c;正在学习C/C、Python、操作系统、数据库等。 &#x1f4d8;相关专栏&#xff1a;C语言初阶、C语言进阶、C语言刷题训练营、数据结构刷题训练营、有感兴趣的可以看一看。 欢迎点赞 &#x1f44d…

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

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

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

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

目标检测算法改进系列之Backbone替换为RIFormer

RIFormer简介 Token Mixer是ViT骨干非常重要的组成成分&#xff0c;它用于对不同空域位置信息进行自适应聚合&#xff0c;但常规的自注意力往往存在高计算复杂度与高延迟问题。而直接移除Token Mixer又会导致不完备的结构先验&#xff0c;进而导致严重的性能下降。 原文地址&…

Pytorch之shuffleNet图像分类

&#x1f482; 个人主页:风间琉璃&#x1f91f; 版权: 本文由【风间琉璃】原创、在CSDN首发、需要转载请联系博主&#x1f4ac; 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦 前言 ShuffleNet是Face&#xff08;旷视&#xff09;在2017年发布的一个高效率…

【傅里叶梅林图像配准】用于图像配准的傅里叶梅林相位相关性的实现(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Python之元组

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

壁炉装饰:突破传统的创新趋势

壁炉&#xff0c;一直以来都是家庭温馨的象征&#xff0c;但它也是家居装饰中一个充满潜力的元素。如今&#xff0c;随着设计趋势的不断演变&#xff0c;壁炉装饰已经迈入了一个全新的时代&#xff0c;融合了美学、功能和可持续性&#xff0c;为家庭创造了更多可能性。 壁炉装饰…