【浅学Java】SpringMVC程序开发

news2024/12/26 11:39:58

SpringMVC程序开发

  • 1. 认识SpringMVC
    • 1.1 SpringMVC是什么
    • 1.2 SpringMVC的定义
    • 1.3 MVC和SpringMVC的关系
    • 经典问题:Spring / SpringBoot / SpringMVC有什区别
  • 2. 学习SpringMVC的思路
  • 3. Spring MVC的创建和连接
    • 3.0 创建方法
    • 3.1 使用到的一些注解
    • 3.2 返回一个页面
    • 3.3 关于@Controller的约定
    • 3.4 @RequestMapping( )支持什么类型的访问方式呢
    • 3.5 设置@RequestMapping( )的访问方式
    • 3.6 用@GetMapping和@PostMapping标注请求方式
  • 4. 获取参数
    • 4.1 传递单个参数
    • 4.2 获取多个参数
    • 4.3 获取多个参数(用对象接收)
    • 4.4 获取表单参数
    • 4.5 获取ajax请求的参数
    • 4.6 获取 json参数
      • 1. 利用postman构造 json参数
      • 2. 发送请求
      • 3. @RequestBody——告诉后端从body里面获取参数
    • 4.7 上传文件@RequestPart
      • 1. 利用postman上传图片文件
      • 2. 路由代码,保存文件
      • 3. 测试结果
    • 4.8 获取Cookie
      • 1. 在谷歌浏览器模拟创建一个Cookie
      • 2. 路由代码
      • 3. 测试结果
    • 4.9 获取Session
      • 1. 先设置一个Session
      • 2. 获取Session
    • 3.10 获取header
    • 4.11 重命名前端参数@RequestParam(了解)
    • 4.11 获取URL中参数@PathVariable
  • 5. 返回数据
    • 5.1 返回静态页面
    • 5.2 返回 text / html
    • 5.3 返回JSON对象
    • 5.4 请求转发 和 请求重定向
      • 1.控制器代码
      • 2.请求转发的效果
      • 3. 请求重定向效果
      • 4.请求转发或请求重定向的对比

1. 认识SpringMVC

1.1 SpringMVC是什么

SpringMVC是一个原始的基于Servlet API 的web框架,从一开始就包括在Spring当中。

1.2 SpringMVC的定义

MVC就是Model View Controller 的缩写,它是软件⼯程中的⼀种软件架构模式,它把软件系统分为模型、视图和控制器三个基本部分
在这里插入图片描述

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

1.3 MVC和SpringMVC的关系

MVC是一种思想,而SpringMVC是MVC思想的一种实现,并且SpringMVC还继承了Servlet API 的 Web框架

经典问题:Spring / SpringBoot / SpringMVC有什区别

  1. Spring是包含了许多工具的IOC容器,通过IOC容器可以有效的降低代码的耦合度
  2. SpringBoot 就是用来快速的开发Spring框架的,他底层就是基于Spring
  3. SpringMVC就只是Spring众多模块中的一个,它是一个web框架,它的诞生早于SpringBoot

2. 学习SpringMVC的思路

  1. 连接
  2. 取参
  3. 返回数据

3. Spring MVC的创建和连接

3.0 创建方法

Spring MVC的创建和SpringBoot的创建方式是一样的,详见:SpringBoot的创建

3.1 使用到的一些注解

之所以创建的项目是一个Spring MVC,是因为在SpringBoot中选择了这个模块:
在这里插入图片描述
在创建好的SpringMVC项目的demo目录下创建一个UserController:
在这里插入图片描述

在上面代码中,有两个注释:@Controller,@ResponseBody,这两个注释在之前的SpringBoot中并没有使用到,但是它两合起来的作用其和@RestController是一样的。@RestController是一个组合注解。
它两的作用分别如下:

  1. 加入@Controller类注解是让Spring框架启动时,加载这个类
  2. 加入@ResponseBody注解是表明返回非页面数据

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

测试结果:
在这里插入图片描述

3.2 返回一个页面

如果你返回的是一个页面,那就可以注释去掉@ResponseBody注解:
在这里插入图片描述
运行结果:
在这里插入图片描述

3.3 关于@Controller的约定

在上面所示的代码中,我们适应到了@Controller注解,在业务上,它的作用就是让Spring框架启动时,加载这个类。那么,能不能把它换成其他的类注解呢,比如Service?

答案时不能,因为在SpringMVC约定就是用@Controller,这就是设计时的一种规范。

3.4 @RequestMapping( )支持什么类型的访问方式呢

我们用postman来测试一下:
在这里插入图片描述

通过用postman测试发现:@RequestMapping( )默认是支持全部类型的访问方式。

3.5 设置@RequestMapping( )的访问方式

在这里插入图片描述
此时再永GET以外的方式进行访问时,就会有如下结果:
在这里插入图片描述

3.6 用@GetMapping和@PostMapping标注请求方式

标注为GET请求:@GetMapping(“/index”)
标注为POST请求:@PostMapping(“/index”)

GET请求的三种写法:

// 写法1
@RequestMapping("/index")
// 写法2
@RequestMapping(value = "/index",method = RequestMethod.GET)
// 写法3
@GetMapping("/index")

POST请求的三种写法:

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

4. 获取参数

4.1 传递单个参数

代码:

@Controller
@ResponseBody
public class UserController {
    @RequestMapping("/hi")
    public String sayHi(String name){//想要那个参数,就写那个参数
        return "参数:"+name;  
    }
}

测试结果:
在这里插入图片描述

4.2 获取多个参数

代码:

@Controller
@ResponseBody
public class UserController {
    @RequestMapping("/hi")
    public String sayHi(String name,String password){
        return "参数1:"+name+" | 参数2:"+password;
    }
}

测试结果:
在这里插入图片描述

4.3 获取多个参数(用对象接收)

当参数的数量足够多的时候,如果像上面这样获取的话,操作起来就会麻烦很多,所以就将它封装成对象,使得操作简单一点。

先创建一个User类:

在这里插入图片描述
代码:

@RequestMapping("/get1")
    public String get1(User user){
        return user.toString();
    }

测试结果:
在这里插入图片描述

注意:前端传过来的参数名和应该和User类中参数的名字一样.

4.4 获取表单参数

当表单参数比较少时,就可以通过获取多个参数的形式进行获取。
当表单的数据较多时,可以通过用对象接收的方式进行获取。

先创建一个表单:
在这里插入图片描述

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>index测试页面</title>
</head>
<body>
    <h1>这是一个index页面</h1>
</body>
</html>

测试代码(用对象接收):

@RequestMapping("/login")
    public String login(Student student){
        return student.toString();
    }

测试结果:
在这里插入图片描述

4.5 获取ajax请求的参数

前端代码:

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
<script src="https://code.jquery.com/jquery-3.6.1.min.js"></script>
<div>
    <h1> 登陆 </h1>
    用户:<input id="name"><br>
    密码:<input id="password"><br>
    <input type="button" onclick="onsub()" value="提交">
</div>
<script>
    function onsub(){
        jQuery.ajax({
            url:"login2",
            type:"GET",
            data:{"username":jQuery("#name").val(),"password":jQuery("#password").val()},
            success:function(result){
                alert(result);
                console.dir(result);
            }
        });
    }
</script>
</body>
</html>

路由代码:

@RequestMapping("/login2")
    public HashMap<String,Object> login2(String name,String password){
        HashMap<String,Object> result = new HashMap<>();
        result.put("name",name);
        result.put("password",password);
        return result;
    }

测试结果:
在这里插入图片描述

4.6 获取 json参数

1. 利用postman构造 json参数

在这里插入图片描述

2. 发送请求

@RequestMapping("/login2")
    public HashMap<String,Object> login2(String name,String password){
        HashMap<String,Object> result = new HashMap<>();
        result.put("name",name);
        result.put("password",password);
        return result;
    }

在这里插入图片描述
可以看到,此时拿到的 json参数 为空,为什么呢?

因为后端默认是从非body里面获取参数,要想获取body里面的数据,就得加一个注解,告诉它从body里面获取参数。

3. @RequestBody——告诉后端从body里面获取参数

@RequestMapping("/login2")
    public HashMap<String,Object> login2(@RequestBody Student student){
        HashMap<String,Object> result = new HashMap<>();
        result.put("name",student.getName());
        result.put("password",student.getPassword());
        return result;
    }

测试结果:
在这里插入图片描述

特别注意: 用@RequestBody获取时,只能获取到一个json对象,而不能获取到某个具体的属性。

4.7 上传文件@RequestPart

1. 利用postman上传图片文件

在这里插入图片描述

2. 路由代码,保存文件

@RequestMapping("/getparam")
    public String getParam(String name, @RequestPart("myfile")MultipartFile file) throws IOException {
        //将文件进行保存
        file.transferTo(new File("C:\\work\\img1.png"));//设置目录并且设置文件名
        return "上传成功!";
    }

在上面保存文件时,是直接将文件格式写死的,其实也可以设置动态路径,比如:

@RequestMapping("/param9")
public String param9(String name, @RequestPart("myfile") MultipartFile file) throws IOException {
		// 获取⽂件后缀名
		String fileName = file.getOriginalFilename().substring(file.getOrigina
		lFilename().lastIndexOf("."));
		// ⽂件保存地址
		String filePath = ClassUtils.getDefaultClassLoader().getResource("stat
		ic").getPath() +
		"/" + UUID.randomUUID() + fileName;
		// 保存⽂件
		file.transferTo(new File(filePath));
		return filePath + " 上传成功.";
}

3. 测试结果

在这里插入图片描述
就会有如下文件:
在这里插入图片描述

4.8 获取Cookie

1. 在谷歌浏览器模拟创建一个Cookie

在这里插入图片描述

2. 路由代码

@RequestMapping("/getcookie")
    public String getCookie(@CookieValue("name") String name){//拿到名字为name的Coookie,并将他赋值给String name.
        return "name: "+name;
    }

3. 测试结果

在这里插入图片描述

4.9 获取Session

1. 先设置一个Session

@RequestMapping("setsession")
    public String setSession(HttpServletRequest request){
        //获取HttpSession对象,设置参数为true表示如果没有session对象就创建一个session对象
        HttpSession session = request.getSession(true);
        if(session!=null){
            session.setAttribute("username","lifeifei");
        }
        return "存储成功!";
    }

在这里插入图片描述

2. 获取Session

@RequestMapping("/getsession")
    public String getSession(@SessionAttribute(value = "username",required = false) String username){
        return "username: "+username;
    }

在这里插入图片描述

3.10 获取header

代码:

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

@RequestHeader(“User-Agent”) 表示读取header里面的 user-Agent 信息

测试结果;
在这里插入图片描述

4.11 重命名前端参数@RequestParam(了解)

某些特殊的情况下,前端传递的参数 key 和我们后端接收的 key 可以不⼀致,⽐如前端传递了⼀个time 给后端,⽽后端⼜是有 createtime 字段来接收的,这样就会出现参数接收不到的情况,如果出现这种情况,我们就可以使⽤ @RequestParam 来重命名前后端的参数值

代码:

@RequestMapping("/m4")
    public Object method_4(@RequestParam("time") String createtime) {
        System.out.println("时间:" + createtime);
        return createtime;
    }

测试结果:
在这里插入图片描述

4.11 获取URL中参数@PathVariable

代码:

@GetMapping("/m6/{name}/{password}")
    public Object method_6(@PathVariable String name, @PathVariable String password) {
        return "name:" + name+" | password:" + password;
    }

5. 返回数据

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

5.1 返回静态页面

创建前端⻚⾯ index.html
在这里插入图片描述

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>index测试页面</title>
</head>
<body>
    <h1>这是一个index页面</h1>
</body>
</html>

创建控制器:

@Controller
public class RetData {
    @RequestMapping("/retindex")
    public Object retIndex(){
        return "/index.html";
    }
}

测试结果:
在这里插入图片描述

5.2 返回 text / html

控制器中路由代码:

@RequestMapping("rethello")
    @ResponseBody
    public String retHello(){
        return "<h1>Hello,HTML~</h1>";
    }

测试结果:
在这里插入图片描述

5.3 返回JSON对象

控制器代码:

@RequestMapping("/retjson")
    @ResponseBody
    public HashMap<String,Object> retJson(){
        HashMap<String,Object> map = new HashMap<>();
        map.put("name","lifeifei");
        map.put("age","19");
        map.put("sex","man");
        return map;
    }

浏览器测试结果:
在这里插入图片描述
Fiddler抓包结果:
在这里插入图片描述
可以看出,当返回给前端的数据类型为HashMap时,默认的数据格式是JSON。

5.4 请求转发 和 请求重定向

forward:请求转发
redirect:请求重定向

1.控制器代码

@Controller
public class TestController {
    /*
    请求转发
     */
    @RequestMapping("/req_forward")
    public Object req_forward(){
        return "forward:index.html";
    }
    /*
    请求重定向
     */
    @RequestMapping("/req_redirect")
    public Object req_redirect(){
        return "redirect:index.html";
    }
}

2.请求转发的效果

在这里插入图片描述

请求转发之后,访问的页面URL没有变,但是却显示了index.html页面的内容

3. 请求重定向效果

在浏览器输入 http://localhost:8080/req_redirect,一按回车之后:
在这里插入图片描述

请求重定向之后,输入的URL发生变化,直接跳转到另一个网页。

4.请求转发或请求重定向的对比

forward 和 redirect 具体区别如下:

  1. 请求重定向(redirect)将请求重新定位到资源;请求转发(forward)服务器端转发。
  2. 请求重定向地址发⽣变化,请求转发地址不发⽣变化。
  3. 请求重定向与直接访问新地址效果⼀直,不存在原来的外部资源不能访问;请求转发服务器端转发有可能造成原外部资源不能访问

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

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

相关文章

Qt实现全局鼠标事件监听器-Windows

Qt实现全局鼠标事件监听器-Windows版&#x1f347; 文章目录Qt实现全局鼠标事件监听器-Windows版&#x1f347;1、概述&#x1f348;2、实现效果&#x1f349;3、实现方式&#x1f34a;4、关键代码&#x1f34b;5、源代码&#x1f34c;更多精彩内容&#x1f449;个人内容分类汇…

Quartz任务调度

Quartz概念 Quartz是openSymphony开源组织在Job scheduling领域的开源项目&#xff0c;它可以与J2EE与J2SE应用程序相结合&#xff0c;也可以单独使用。 Quartz是开源且具有丰富特性的“任务调度库”&#xff0c;能够集成于任何的Java应用&#xff0c;小到独立的应用&#xf…

支持向量机SVM

文章目录SVM简单理解SVM代码实现导入数据集SVM实现画出支持向量总结SVM简单理解 在下二维平面存在以下数据点&#xff0c;不同颜色代表不同类别&#xff0c;现在需要画一条直线&#xff0c;想将两个类别分别开来&#xff0c;当有新数据加入时&#xff0c;根据这条直线&#xf…

springboot+jsp母婴用品商城网站系统

开发语言&#xff1a;Java 后端框架&#xff1a;springboot(SpringSpringMVCMyBatis) 前端框架&#xff1a;jsp 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.3.9 母婴用品网站&#xff0…

客快物流大数据项目(九十六):ClickHouse的VersionedCollapsingMergeTree深入了解

文章目录 ClickHouse的VersionedCollapsingMergeTree深入了解 一、创建VersionedCollapsingMergeTree引擎表的语法 二、折叠数据

人工智能轨道交通行业周刊-第26期(2022.12.5-12.11)

本期关键词&#xff1a;智慧检修、障碍物检测、监管数据平台、ChatGPT、脑机接口、图像增强 1 整理涉及公众号名单 1.1 行业类 RT轨道交通中关村轨道交通产业服务平台人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS World轨道交通联盟VSTR铁…

Canvas 性能优化:脏矩形渲染

大家好&#xff0c;我是前端西瓜哥。 使用 Canvas 做图形编辑器时&#xff0c;我们需要自己维护自己的图形树&#xff0c;来保存图形的信息&#xff0c;并定义元素之间的关系。 我们改变画布中的某个图形&#xff0c;去更新画布&#xff0c;最简单的是清空画布&#xff0c;然…

Java项目:SSM个人博客管理系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 管理员角色包含以下功能&#xff1a; 发博客,审核评论,博客增删改查,博客类别增删改查,修改导航,评论增删改查,个人信息修改,登陆页面等功能。 …

TOOD: Task-aligned One-stage Object Detection 原理与代码解析

paper&#xff1a;TOOD: Task-aligned One-stage Object Detection code&#xff1a;https://github.com/fcjian/TOOD 存在的问题 目标检测包括分类和定位两个子任务&#xff0c;分类任务学习的特征主要关注物体的关键或显著区域&#xff0c;而定位任务是为了精确定位整个…

SpringBoot yaml语法详解

SpringBoot yaml语法详解1.yaml基本语法2.yaml给属性赋值3.JSR303校验4.SpringBoot的多环境配置1.yaml基本语法 通常情况下&#xff0c;Spring Boot 在启动时会将 resources 目录下的 application.properties 或 apllication.yaml 作为其默认配置文件&#xff0c;我们可以在该…

【云原生 | Kubernetes 实战】11、K8s 控制器 Deployment 入门到企业实战应用(下)

目录 四、通过 k8s 实现滚动更新 4.3 自定义滚动更新策略 取值范围 建议配置 总结 测试&#xff1a;自定义策略 重建式更新&#xff1a;Recreate 五、生产环境如何实现蓝绿部署&#xff1f; 5.1 什么是蓝绿部署&#xff1f; 5.2 蓝绿部署的优势和缺点 优点&#x…

图数据库 Neo4j 学习之JAVA-API操作

Neo4j 系列 1、图数据库 Neo4j 学习随笔之基础认识 2、图数据库 Neo4j 学习随笔之核心内容 3、图数据库 Neo4j 学习随笔之基础操作 4、图数据库 Neo4j 学习随笔之高级操作 5、图数据库 Neo4j 学习之JAVA-API操作 6、图数据库 Neo4j 学习之SpringBoot整合 文章目录Neo4j 系列前…

mac pro M1(ARM)安装vmware虚拟机及centos8详细教程

前言 mac发布了m1芯片&#xff0c;其强悍的性能收到很多开发者的追捧&#xff0c;但是也因为其架构的更换&#xff0c;导致很多软件或环境的安装成了问题&#xff0c;这次我们接着来看如何在mac m1环境下安装centos8 Centos8安装安装vmware虚拟机Centos8 镜像支持M1芯片安装Cen…

DDPM原理与代码剖析

前言 鸽了好久没更了&#xff0c;主要是刚入学学业压力还蛮大&#xff0c;挺忙的&#xff0c;没时间总结啥东西。 接下来就要好好搞科研啦。先来学习一篇diffusion的经典之作Denoising Diffusion Probabilistic Models(DDPM)。 先不断前向加高斯噪声&#xff0c;这一步骤称为…

论文笔记(二十三):Predictive Sampling: Real-time Behaviour Synthesis with MuJoCo

Predictive Sampling: Real-time Behaviour Synthesis with MuJoCo文章概括摘要1. 介绍2. 背景3. MuJoCo MPC (MJPC)3.1. 物理模拟3.2. 目标3.3. 样条3.4. 规划师4. 结论4.1. 图形用户界面4.2. 例子5. 讨论5.1. 预测抽样5.2. 用例5.3. 局限和未来的工作文章概括 作者&#xff…

25-Vue之ECharts-基本使用

ECharts-基本使用前言ECharts介绍ECharts快速上手ECharts配置说明前言 本篇开始来学习下开源可视化库ECharts ECharts介绍 ECharts是百度公司开源的一个使用 JavaScript 实现的开源可视化库&#xff0c;兼容性强&#xff0c;底层依赖矢量图形 库 ZRender &#xff0c;提供直…

Oracle High Water Mark问题

公司写SQL时遇到一个奇怪的问题&#xff0c;往表中频繁插入和删除大量数据&#xff0c;几次操作后&#xff0c;使用Select查询(表中没数据)特别慢&#xff0c;后得知是高水位线的问题。 该问题已通过: truncate table tableName语句解决。 本想写篇文章详细记录一下的&#xff…

操作系统,计算机网络,数据库刷题笔记9

操作系统&#xff0c;计算机网络&#xff0c;数据库刷题笔记9 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xff…

聊聊远程项目交付的敏捷管理

这是鼎叔的第四十三篇原创文章。行业大牛和刚毕业的小白&#xff0c;都可以进来聊聊。 欢迎关注本人专栏和微信公众号《敏捷测试转型》&#xff0c;大量原创思考文章陆续推出。 对于日益重要的国际化市场&#xff0c;越来越多的离岸项目&#xff08;内包或外包&#xff09;在…

这十套练习,教你如何用Pandas做数据分析(09)

练习9-时间序列 探索Apple公司股价数据 步骤1 导入必要的库 运行以下代码 import pandas as pd import numpy as np visualization import matplotlib.pyplot as plt %matplotlib inline 步骤2 数据集地址 运行以下代码 path9 ‘…/input/pandas_exercise/pandas_exer…