Spring Web MVC

1. Spring Web MVC

Spring Web MVC是⼀个Web框架 

1.1 MVC

 

举个例子理解:

Controller相当于前台,接送请求,传给相关部门,部门派人处理,此时这就是Model 

MVC是一种思想,Spring进行了实现,称为Spring MVC

Spring Boot是创建Spring MVC项目的一种方式而已

1.2 Spring MVC

 

而在当前阶段,MVC的概念又发生了一些变化,后端开发人员不涉及前端页面的开发,所以也就没有view层

view层又有了一种解释:

之间返回的是试图,现在返回的是视图所需要的数据

2. 学习SpringMVC

学习SpringMVC,重点也就是学习如何通过浏览器和⽤⼾程序进⾏交互.

  • 建⽴连接(客户端和服务器)
  • 请求
  • 响应

2.1 @RequestMapping

2.1.1  @RequestMapping修饰方法和类

访问地址:类的路径+方法路径

2.1.2 @RequestMapping支持get和post

那么如果就想要get请求怎么办?

注意:

此时再用postman发送post请求:

2.2 请求(即传参)

2.2.1  传递单个函数

底层逻辑:

从请求的参数中,获取参数名为name的值,并给name赋值


2.2.2 传递多个参数

①使用Integer(包装类型)

参数的顺序可以调换 

②使用int(基本类型)

看日志:

建议使用包装类型

如果使用基本类型,必须要传值,否则会报错


2.2.3 传递对象

直接传递参数,每修改一个,就需要修改接口,为了避免这种情况,把参数封装成多个对象 

 


2.2.4 后端参数重命名

那如果使用username传参呢?

如果使用了重命名,必须要使用@RequestParam注解里的名字

如果不想报错:


2.2.5 传递数组

 

当我们请求中,同一个参数有多个时,浏览器就会帮我们给封装成一个数组 


2.2.6 传递集合

 


2.2.7 传递JSON(使用最多)

本质上是一个字符串,表示对象的字符串

传递JSON,使用@RequestBody

 

注意:

这个数据一定是在请求正文中 


2.2.8 获取URL中的参数

使用注解@PathVariable

获取两个:

注意:

获取多个时,要注意顺序,请求格式必须和后端定义的URL格式匹配 

也可以修改名字:


2.2.9 上传图片

 


2.2.10 获取Cookie

简单回顾:

HTTP是无状态的.即http没有记忆功能,现在请求和过段时间请求,同样的请求参数,得到的结果一样(这里并不是指数据,而是处理逻辑)

Cookie客户端机制,Session服务端机制(这里可以以学生和门岗为例理解)

Cookile可以伪造(学生证),Session不能

①先看用Servlet的方式获取:

注意:

②使用注解的方式获取(只能一个一个去获取):


2.2.11 获取Session

①先看用Servlet的方式获取: 

 

注意: 


 ②使用注解的方式获取(只能一个一个去获取):

 

 使用注解的方式,默认是一个必传参数,修改:

③通过spring的内置对象


2.2.12 获取Header  

①先看用Servlet的方式获取: 


②通过注解获取:

 


2.3 响应 

2.3.1 返回静态页面

 

可以看到@RestController无法返回页面

下面来学习@RestController与@Controller:

@Controller告诉Spring,帮我们管理这个代码,我们后续访问时,才能访问到.


2.3.2 返回数据

 

 

注:

@ResponseBody可以修饰类,也可以修饰方法.

修饰类的时候,表示这个类下的所有方法,返回的均为数据.

修饰方法的时候,表示该方法返回的是数据

如果一个类中的所有方法返回的都是数据,我们就把这个注解加在类上


2.3.3 返回html代码片段

 


2.3.4 返回JSON

 

注:

当我们的接口返回的是String时,content-Type是text/html

当当我们的接口返回的是对象或Map时,content-Type自动设置为application/JSON

 


2.3.5 设置状态码

 

HTTP状态码 

 

状态码不影响页面展示 


2.3.6 设置Header(了解)

  • value: 指定映射的URL
  • method:指定请求的method类型,如GET,POST等
  • consumes:限制处理请求(request)的提交内容类型(Content-Type),例如application/json,text/html 
  • produces: 设置返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回 
  • Params:指定request中必须包含某些参数值时,才让该⽅法处理
  • headers: 指定request中必须包含某些指定的header值,才能让该⽅法处理请求


3. 练习

3.1 计算器

3.2 登录 

@RequestMapping("/user")
@RestController
public class UserController {@RequestMapping("/login")public Boolean login(String userName, String password, HttpSession session){//校验参数的合法性
//        if (userName==null || userName.length()==0 || password ==null || password.length() ==0){
//            return false;
//        }if (!StringUtils.hasLength(userName) || !StringUtils.hasLength(password)){return false;}//进行用户名和密码的校验if ("admin".equals(userName) && "admin".equals(password)){//设置Sessionsession.setAttribute("username","admin");return true;}return false;}@RequestMapping("/getUserInfo")public String getUserInfo(HttpServletRequest request){//从Session 获取登录用户HttpSession session = request.getSession(false);String userName = null;if (session!=null){userName = (String) session.getAttribute("username");}return userName;}
}


3.3 留言板

@RequestMapping("/message")
@RestController
public class MessageController {private List<MessageInfo> messageInfos = new ArrayList<>();@RequestMapping("/publish")public Boolean publish(MessageInfo messageInfo){//进行参数校验//!.. = 为空if (!StringUtils.hasLength(messageInfo.getFrom())|| !StringUtils.hasLength(messageInfo.getTo())|| !StringUtils.hasLength(messageInfo.getMessage())){return false;}//添加留言messageInfos.add(messageInfo);return true;}@RequestMapping("/getMessageInfo")public List<MessageInfo> getMessageInfo(){return messageInfos;}}
@Data
public class MessageInfo {private String from;private String to;private String message;}

注:

这里补充一个依赖lombok,代替getter和setter   @Data

如果只想加到from上:

后端测试:


3.4 图书管理系统(简版,后续补充) 

@RequestMapping("/user")
@RestController
public class UserController {@RequestMapping("/login")public Boolean login(String userName, String password, HttpSession session){//校验if (!StringUtils.hasLength(userName) || !StringUtils.hasLength(password)){return false;}//验证是否正确if ("admin".equals(userName) && "123".equals(password)){session.setAttribute("userName",userName);return true;}return false;}
}

@RequestMapping("/getBookList")public List<BookInfo>  getBookList(){//1.获取图书的数据//2.对图书的数据进行处理//3.返回数据//mock表示虚拟的假数据List<BookInfo> bookInfos = mockData();for(BookInfo bookInfo : bookInfos){if (bookInfo.getStatus() == 1){bookInfo.setStatusCN("可借阅");}else {bookInfo.setStatusCN("不可借阅");}}return bookInfos;}private List<BookInfo> mockData(){List<BookInfo> bookInfos = new ArrayList<>(15);for (int i = 0; i < 15; i++){BookInfo bookInfo = new BookInfo();bookInfo.setId(i);bookInfo.setBookName("图书"+i);bookInfo.setAuthor("作者"+i);bookInfo.setCount(new Random().nextInt(200));bookInfo.setPrice(new BigDecimal(new Random().nextInt(100)));bookInfo.setPublish("出版社"+i);bookInfo.setStatus(i%5==0?2:1);bookInfos.add(bookInfo);}return bookInfos;}
@Data
public class BookInfo {private Integer id;private String bookName;private String author;private Integer count;private BigDecimal price;private String publish;private Integer status;//1-可借阅private String statusCN;}

 后端代码经测试无误

4. 三层架构

  • 表现层:接受请求,返回结果
  • 业务逻辑层:主要处理业务逻辑
  • 数据层:处理数据,包含数据的存储,获取(增删改查)

可以结合下图理解:

以图书管理系统为例:

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

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

相关文章

(第二十七天)

上午 核心&#xff1a;内核中的 ipvs &#xff0c; ipvsadm 1 、安装 ipvsadm [rootnat ~] # yum -y install ipvsadm 2 、配置规则 查看所有的规则&#xff0c;如果已经配置好规则&#xff0c;重启之后也就没有了 [rootnat ~] # ipvsadm -L -n 1 、配置 vip 网卡 &…

如何用Python进行数据可视化、科技图表绘制?

目录 写在前面 推荐图书 推荐理由 写在最后 写在前面 有了它&#xff0c;科技图表绘制、数据可视化真的毫无难度&#xff01; 推荐图书 《Python数据可视化&#xff1a;科技图表绘制》(芯智)【摘要 书评 试读】- 京东图书 图书简介 《Python数据可视化:科技图表绘制》结…

生成式人工智能(大语言模型)上线备案材料

材料总体一览 生成式人工智能&#xff08;大语言模型&#xff09;上线备案&#xff0c;除申请表外还需要提交五份材料&#xff1a; 《生成式人工智能 &#xff08;大语言模型&#xff09;上线备案申请表》 《附件1&#xff1a;安全自评估报告》 《附件2&#xff1a;模型服务协议…

Python(TensorFlow)衍射光学层卷积算法模拟(英伟达GPU)

&#x1f3af;要点 &#x1f3af;衍射光学卷积算法模拟 | &#x1f3af;模拟或数字电子计算之前加入一层光学计算 | &#x1f3af;前馈卷积神经网络计算成像系统对输入图像进行分类 | &#x1f3af;相位掩模利用线性空间不变成像系统执行固有卷积 &#x1f4dc;用例 Python非…

大语言模型与多模态大模型loss计算

文章目录 前言一、大语言模型loss计算1、loss计算代码解读2、构建模型输入内容与label标签3、input_ids与labels格式 二、多模态大模型loss计算方法1、多模态loss计算代码解读2、多模态输入内容2、大语言模型输入内容3、图像embending如何嵌入文本embeding 前言 如果看了我前面…

MySQL学习[4] ——MySQL锁

四、MySQL锁 4.1 MySQL有哪些锁&#xff1f; 4.1.1 全局锁 全局锁就是**对整个数据库实例加锁&#xff0c;主要用于全库逻辑备份**等场景。 flush tables with read lock # 加全局锁unlock tables # 解锁加上全局&#xff08;读&#xff09;锁后&#xff0c;整个数据库都…

css实现水滴效果图

效果图&#xff1a; <template><div style"width: 100%;height:500px;padding:20px;"><div class"water"></div></div> </template> <script> export default {data() {return {};},watch: {},created() {},me…

spring mvc工作流程

Spring MVC 是基于模型-视图-控制器&#xff08;MVC&#xff09;设计模式的 Web 框架&#xff0c;它简化了开发 Web 应用程序的流程。下面是 Spring MVC 的工作流程详细介绍&#xff1a; 客户端请求 --> DispatcherServlet --> HandlerMapping --> Controller --&…

Win10 创建新的桌面2,并实现桌面切换

1. Win10 创建新的桌面2 Win - Tab 2. Win10 桌面切换 Ctrl - Win - ←/→ 我们下期见&#xff0c;拜拜&#xff01;

【大模型从入门到精通14】openAI API 构建和评估大型语言模型(LLM)应用2

这里写目录标题 评估大型语言模型&#xff08;LLM&#xff09;输出的方法构建评估标准实施评估协议利用专家比较案例研究评估客户服务聊天机器人学术文本摘要高级评估技术 评估大型语言模型&#xff08;LLM&#xff09;输出的方法 评估大型语言模型&#xff08;LLM&#xff09…

开源免费的表单收集系统TDuck

TDuck&#xff08;填鸭表单&#xff09;是一款开源免费的表单收集系统&#xff0c;它基于Apache 2.0协议开源&#xff0c;用户可以随时下载源码&#xff0c;自由修改和定制&#xff0c;也可以参与到项目的贡献和反馈中。TDuck表单系统不仅支持私有化部署&#xff0c;还提供了丰…

快排/堆排/归并/冒泡/

常见的内排序算法 插入排序 直接插入排序 原理&#xff1a;相当于扑克牌变成有序&#xff0c;先拿第一张&#xff0c;把他调节成有序&#xff0c;再拿第二张&#xff0c;与第一张相比找到第二张的位置&#xff0c;再继续拿第三张&#xff0c;以此类推。 void InsertSort(in…

【C++二分查找 贪心】792. 匹配子序列的单词数

本文涉及的基础知识点 C二分查找 贪心 LeetCode792. 匹配子序列的单词数 给定字符串 s 和字符串数组 words, 返回 words[i] 中是s的子序列的单词个数 。 字符串的 子序列 是从原始字符串中生成的新字符串&#xff0c;可以从中删去一些字符(可以是none)&#xff0c;而不改变其…

关于Vue项目npm快捷键,点击run启动报错,及npm i也报错的解决办法

1.配置idea的npm 2.点击运行按钮 3.结果 分析原因及问题&#xff1a; npm i npm run dev 由于是刚刚从gitlab新拉的前端代码&#xff0c;可能没有用命令install过类似于没有编译过&#xff0c;所以执行一下上面的命令 结果报错如下&#xff1a; F:\tbyf\qjyy\hip-manager-ui&…

密探 -- 渗透测试工具 v1.14 版

1.如何运行 在jdk8环境下&#xff08;在jdk8以上的高版本请参考常见问题1的处理方案&#xff09;运行以下语句运行: java -jar mitan-jar-with-dependencies.jar 若不想输入这么长太长语句&#xff0c;可以通过以下脚本的方式启动&#xff1a; Mac/Linux 环境下&#xff0c;…

计算机网络——HTTP协议详解(上)

一、HTTP协议简单介绍 1.1 什么是HTTP协议 HTTP&#xff08;超文本传输协议&#xff09;是一种用于在Web浏览器和Web服务器之间传输数据的应用层协议。它是一种无状态协议&#xff0c;即服务器不会保留与客户端的任何连接状态信息&#xff0c;每个请求都被视为一个独立的事务。…

Mysql-约束

概念&#xff1a; 约束是作用于表中字段上的规则&#xff0c;用于限制存储在表中的数据。 目的&#xff1a; 保存数据库中数据的正确&#xff0c;有效性和完整性。 分类&#xff1a; 注意事项&#xff1a;约束是作用在数据表中的字段上的&#xff0c;可以在创建表或修改表的时候…

【开端】Java 分页工具类运用

一、绪论 Java系统中&#xff0c;分页查询的场景随处可见&#xff0c;本节介com.baomidou.mybatisplus.core.metadata.IPage;来分页的工具类 二、分页工具类 public class PageUtils implements Serializable { private static final long serialVersionUID 1L; /**…

Luatos-lua For MacOSX

0x00 缘起 看到Luatos-soc-pc项目能够编译到MacOS平台并且运行&#xff0c;所以尝试编译&#xff1b;可是Apple Clang编译器太过于严格&#xff0c;导致编译不通过。遂换到gcc-11编译通过&#xff0c;虽然其中依旧会报错&#xff08;宏定义LUA_USE_MACOSX不起作用&#xff0c;导…

Android 10.0 SystemUI下拉状态栏QSTileView去掉着色效果显示彩色图标功能实现

1.前言 在10.0的系统rom定制化开发中,在关于SystemUI的下拉状态栏中QSTileView的背景颜色设置过程中,在由于 系统原生有着色效果,导致现在某些彩色背景显示不是很清楚效果不好,所以需要去掉QSTileView的默认着色 背景显示原生的彩色背景,接下来就来实现相关功能 如图: 2.…