当前位置: 首页 > news >正文

第23周Java主流框架入门-SpringMVC 2.RESTful开发风格

课程笔记:RESTful 开发风格

课程介绍

本节课程介绍 RESTful 开发风格,以及如何在 Spring MVC 中应用这种开发模式。传统 MVC 开发通过 Servlet、JSP 和 Java Bean 实现前后端交互,而 RESTful 开发提供了一种新的理念,更适合现代多样化的客户端需求。

学习内容

1. REST 和 RESTful 的定义

  • REST:代表 “表现层状态转换(Representational State Transfer)”,是一种理念,强调通过 URL 访问资源。
  • RESTful:基于 REST 理念发展出的一种开发风格,用于设计 Web 服务。

2. RESTful 开发的核心概念

  • 资源:通过 URL 表现为网络中可访问的对象,如图片、JS、网页等。
  • 多样化客户端支持:适用于移动应用、小程序、IoT 设备等多种客户端。

3. RESTful 开发的优势

  • 前后端分离:前端专注界面开发,后端专注业务逻辑,通过标准化的数据格式(如 JSON 或 XML)交互。
  • 专注数据:服务器端只负责返回数据,不关注数据如何展现。

4. RESTful 开发的三个要求

  1. 资源通过 URL 进行访问:所有的资源都使用 URL 作为访问的入口。
  2. HTTP 请求方法语义明确
    • GET:查询操作
    • POST:新增操作
    • PUT:更新操作
    • DELETE:删除操作
  3. 只返回数据,不包含展现内容:服务器只返回数据(如 JSON),客户端负责展现。

5. RESTful 命名规则和示例

  • 标准命名/articles?author=lily,表示查询作者为 Lily 的文章。
  • 资源 ID/student/1,表示查询编号为 1 的学生信息。

6. 错误与正确的 URI 设计

  • 错误示例POST /createArticle/1(动词用法错误)
  • 正确示例GET /articles 返回 JSON 数组, GET /article/1 返回 JSON 对象
  • 命名规则:复数和单数形式区分,操作路径清晰。

7. RESTful 开发的好处

  • 解耦:前后端分工明确,开发效率高。
  • 易维护:清晰的 URI 和标准的 HTTP 请求方法使系统更易理解和维护。
  • 支持多平台:适应不同客户端的需求,统一数据交互方式。

小结

RESTful 开发风格是一种现代化的 Web 服务设计方式,通过标准化的资源访问、明确的请求方法和专注数据的理念,提供了前后端分离开发的有效解决方案。


Spring MVC:Jackson 与对象序列化

1. 引入Jackson依赖

pom.xml 中添加以下依赖,版本需 2.9 及以上:

<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>2.9.9</version>
</dependency>
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.9</version>
</dependency>
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId><version>2.9.9</version>
</dependency>

2. Spring MVC中对象序列化

直接返回一个 Java 对象,Spring 会使用 Jackson 自动将其转换为 JSON 格式。

代码示例:

@RestController
public class RestfulController {@GetMapping("/person")public Person findByPersonId(@RequestParam Integer id) {Person p = new Person();if (id == 1) {p.setName("Lily");p.setAge(23);}return p;}
}

访问 http://localhost/restful/person?id=1 返回如下 JSON:

{"name": "Lily","age": 23
}

3. 多对象序列化

@GetMapping("/persons")
public List<Person> findPersons() {List<Person> list = new ArrayList<>();list.add(new Person("Lily", 23));list.add(new Person("Smith", 22));return list;
}

访问 http://localhost/restful/persons 返回 JSON 数组。

4. 日期序列化与时区处理

使用 @JsonFormat 格式化 Date 对象,并指定时区:

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date birthday;

Spring MVC 解决跨域访问问题

1. CORS 简介

CORS(Cross-Origin Resource Sharing):允许浏览器访问其他域的资源,通过在 HTTP 请求和响应头中附加信息实现。

2. 解决跨域访问的两种方式

2.1 使用 @CrossOrigin 注解

适合局部控制跨域:

@CrossOrigin(origins = "http://localhost:8080")
@RestController
public class RestfulController {// Controller代码...
}

2.2 全局 CORS 配置

适用于全局需要跨域的场景。

3. @CrossOrigin 注解配置

  • origins:指定允许的域名。
  • maxAge:缓存预检请求的时间,单位为秒。

4. 小结

本节课学习了 RESTful 风格和 Jackson 序列化在 Spring MVC 中的应用,以及解决跨域访问问题的方法。

相关文章:

第23周Java主流框架入门-SpringMVC 2.RESTful开发风格

课程笔记&#xff1a;RESTful 开发风格 课程介绍 本节课程介绍 RESTful 开发风格&#xff0c;以及如何在 Spring MVC 中应用这种开发模式。传统 MVC 开发通过 Servlet、JSP 和 Java Bean 实现前后端交互&#xff0c;而 RESTful 开发提供了一种新的理念&#xff0c;更适合现代…...

QT枚举类型转字符串和使用QDebug<<重载输出私有枚举类型

一 将QT自带的枚举类型转换为QString 需要的头文件&#xff1a; #include <QMetaObject> #include <QMetaEnum> 测试代码 const QMetaObject *metaObject &QImage::staticMetaObject;QMetaEnum metaEnum metaObject->enumerator(metaObject->indexOf…...

手机柔性屏全贴合视觉应用

在高科技日新月异的今天&#xff0c;手机柔性显示屏作为智能手机市场的新宠&#xff0c;以其独特的可弯曲、轻薄及高耐用性特性引领着行业潮流。然而&#xff0c;在利用贴合机加工这些先进显示屏的过程中&#xff0c;仍面临着诸多技术挑战。其中&#xff0c;高精度对位、应力控…...

《Python游戏编程入门》注-第3章3

《Python游戏编程入门》的“3.2.4 Mad Lib”中介绍了一个名为“Mad Lib”游戏的编写方法。 1 游戏玩法 “Mad Lib”游戏由玩家根据提示输入一些信息&#xff0c;例如男人姓名、女人姓名、喜欢的食物以及太空船的名字等。游戏根据玩家输入的信息编写出一个故事&#xff0c;如图…...

Netty-TCP服务端粘包、拆包问题(两种格式)

前言 最近公司搞了个小业务&#xff0c;需要使用TCP协议&#xff0c;我这边负责服务端。客户端是某个设备&#xff0c;客户端传参格式、包头包尾等都是固定的&#xff0c;不可改变&#xff0c;而且还有个蓝牙传感器&#xff0c;透传数据到这个设备&#xff0c;然后通过这个设备…...

centos安装指定版本的jenkins

打开jenkins镜像包官网&#xff0c;找到自己想要安装的版本&#xff0c;官网地址&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat-stable 下载指定版本安装包&#xff1a; wget https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat-stable/jenkins-2.452.…...

QT 周期性的杀死一个进程(软件),一分钟后自动退出

1.原因&#xff1a;某软件开机自启动很烦&#xff0c;搞一个程序干掉这个自启动的软件 2.QT代码 main.cpp #include "KillXXX.h" #include <QtWidgets/QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);KillXXX k;return a.exec…...

MySQL任意版本安装卸载和数据库原理图绘制

MYSQL任意版本安装和卸载 安装&#xff1a; 1、解压文件 --- 不能出现中文路径 2、在解压目录&#xff08;安装目录&#xff09;下&#xff1a; 1>.创建data文件夹 2>.创建配置文件my.txt 然后修改成ini格式 3、修改配置文件 basedirD:\\mysql\\mysql-5.7.28-winx64…...

技术成神之路:设计模式(二十三)解释器模式

相关文章&#xff1a;技术成神之路&#xff1a;二十三种设计模式(导航页) 介绍 解释器模式&#xff08;Interpreter Pattern&#xff09;是一种行为设计模式&#xff0c;用于定义一种语言的文法表示&#xff0c;并提供一个解释器来处理这种文法。它用于处理具有特定语法或表达…...

2024软考《软件设计师》-Python专题知识(含历年真题解析)

自2020年之后&#xff0c;软考软件设计师考试在综合知识部分开始增加Python编程语言相关考点&#xff0c;每年会考2~3分的样子。本文将结合近几年常考的内容&#xff0c;扩展一下Pyhton的基础知识&#xff01;考前看一看&#xff0c;或许有所帮助。 一、基础语法 标识符 第一…...

基于大数据 Python+Vue 旅游推荐可视化系统(源码+LW+部署讲解+数据库+ppt)

&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 会持续一直更新下去 有问必答 一键收藏关注不迷路 源码获取&#xff1a;https://pan.baidu.com/s/1aRpOv3f2sdtVYOogQjb8jg?pwdjf1d 提取码: jf1d &#…...

使用虚拟机搭建环境:CentOS7 Docker、MySQL、Redis 安装与配置

创作灵感 项目实践总结&#xff1a;记录了在虚拟机中安装与配置CentOS7环境下的Docker、MySQL、Redis的全过程&#xff0c;帮助理解和应用各项技术。技术笔记与问题总结&#xff1a;详细梳理了每一步安装的关键点与常见问题&#xff0c;并给出了解决方案。职业感悟与心得&…...

[分享] Docker容器可视化管理工具 - WGCLOUD

WGCLOUD是新一代运维监测平台&#xff0c;它可以监控Docker容器的各种性能数据&#xff0c;比如内存&#xff0c;cpu&#xff0c;Image&#xff0c;运行时间&#xff0c;运行状态&#xff0c;端口映射等信息 WGCLOUD也支持在页面启动&#xff0c;重启&#xff0c;停止Docker容…...

保存网页中 canvas 的内容

在开发人员工具中,保存网页中 canvas 的内容,可以用这个方法: 1. 在 dom 中创建一个下载按钮 <button id="save">保存</button>2. 控制台中运行: const gCanvas = document.querySelector(#page_1);function onSave() {gCanvas.toBlob((blob) =&g…...

PID控制原理

PID控制原理 PID控制器是一种经典且广泛应用于工业控制领域的反馈控制器&#xff0c;它由比例&#xff08;P&#xff09;、积分&#xff08;I&#xff09;和微分&#xff08;D&#xff09;三个部分组成。通过对这三个部分的综合调节&#xff0c;PID控制器能够实现对被控对象的…...

python 使用 企微机器人发送消息

import requestswecom_bot_webhook ""msg_text "" # 要发送的消息内容""" mentioned_mobile_list : 手机号列表 , 提醒手机号对应的群成员(某个成员) """ res requests.post(wecom_bot_webhook,json{"msgtype"…...

ARM/Linux嵌入式面经(五二):华为

文章目录 一面技术面相关问题1. **硬件改进的具体内容是什么?**硬件改进的具体内容深入询问及回答2. **在维护前任师兄的代码时,你遇到了哪些挑战?**问题回答面试官追问及回答3. **在嵌入式系统中,内存泄漏通常有哪些原因?**一、内存泄漏的主要原因二、内存泄漏的具体场景…...

[旧日谈]高清画面撕裂问题考

背景 无边框透明背景透明的窗口&#xff0c;在随着缩放比例非整数倍数放大时的画面发生了露底、撕裂问题。 当我们在使用Qt开发的时候&#xff0c;遇到了一个结构性问题。因为我们的软件是自己做的&#xff0c;所以要自己定义标题栏&#xff0c;所以我们设置了软件为FrameLess…...

Nginx反向代理-域名代理前后端项目部署流程

一、下载Nginx 地址&#xff1a;https://nginx.org/en/download.html 1、稳定版本下载 二、Nginx配置 1、下载文件完成后&#xff0c;解压文件 2、打开文件目录下conf目录&#xff0c;打开找到nginx.conf 3、文件配置 注意&#xff1a;.conf 文件使用文本编辑器编辑后&…...

代码随想录(十二)——图论

并查集 并查集主要有三个功能。 寻找根节点&#xff0c;函数&#xff1a;find(int u)&#xff0c;也就是判断这个节点的祖先节点是哪个将两个节点接入到同一个集合&#xff0c;函数&#xff1a;join(int u, int v)&#xff0c;将两个节点连在同一个根节点上判断两个节点是否在…...

如何通过 Service Mesh 构建高效、安全的微服务系统

1. 引言 1.1.什么是 Service Mesh&#xff1f; Service Mesh 是一种基础架构层&#xff0c;负责处理微服务之间的通信&#xff0c;它通过在每个服务旁边部署代理&#xff08;通常称为 Sidecar&#xff09;来捕获和管理服务间的网络流量。这种方式解耦了微服务的业务逻辑和基础…...

MySQL 临时表详解

在 MySQL 中&#xff0c;临时表&#xff08;Temporary Table&#xff09;是一种非常有用的工具&#xff0c;可以帮助我们在执行复杂查询时存储临时数据。临时表的存在时间仅限于会话期&#xff0c;当会话结束后&#xff0c;临时表自动销毁。本文将详细讲解 MySQL 临时表的创建、…...

Kafka系列之:Kafka集群新增节点后实现数据均衡

Kafka系列之:Kafka集群新增节点后实现数据均衡 一、背景二、Kafka集群快速负载均衡方案三、按照Topic负载均衡Kafka系列之:使用Kafka Manager实现leader分区平衡和broker节点上分区平衡一、背景 Kafka集群新增节点,要使得每个节点数据均衡,在增加完kafka topic分区后,要进…...

实验:使用Oxygen发布大型手册到Word格式

此前&#xff0c;我曾发表过一篇文章《结构化文档发布的故事和性能调优》&#xff0c;文中讨论了在将大型DITA手册转换为PDF格式时可能遇到的性能挑战及相应的优化策略。 近日&#xff0c;有朋友咨询&#xff0c;若将同样的大型手册输出为MS Word格式&#xff0c;是否也会面临…...

一个基于.NET8+WPF开源的简单的工作流系统

项目介绍 AIStudio.Wpf.AClient 是一个基于 WPF (Windows Presentation Foundation) 构建的客户端框架&#xff0c;专为开发企业级应用而设计。该项目目前版本为 6.0&#xff0c;进行了全面优化和升级&#xff0c;提供了丰富的功能和模块&#xff0c;以满足不同场景下的开发需…...

MFC工控项目实例二十七添加产品参数

承接专栏《MFC工控项目实例二十六创建数据库》 在型号参数界面添加三个参数试验时间、最小值、最大值。变量为double m_edit_time; double m_edit_min; double m_edit_max; 1、在SEAL_PRESSURE.h中添加代码 class CProductPara { public:union{struct{...double m_edit_min;…...

PgSQL常用SQL语句

PgSQL常用SQL语句 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;神的孩子都在歌唱 PgSQL是一种开源的关系型数据库管理系统&#xff0c;它是PostgreSQL的一种实现。本文将介绍一些常用的PgSQL SQL语句&a…...

python多线程处理xlsx,多进程访问接口

import pandas as pd from concurrent.futures import ThreadPoolExecutor# 读取Excel文件 file_path scence.xlsx df pd.read_excel(file_path)# 定义每10行处理逻辑 def process_rows(start_idx):end_idx min(start_idx 10, len(df)) # 处理每10行for i in range(start_…...

PDF无法转换成其他格式的常见原因与解决方法解析

在处理PDF文件转换时&#xff0c;用户常常会遇到一些问题&#xff0c;导致无法将PDF转换为其他格式&#xff08;如Word、Excel、或图片等&#xff09;。以下是一些常见原因以及解决方法的解析。 ## 一、常见原因 ### 1. **PDF文件的安全性设置** 许多PDF文件在创建时可能设置…...

蓝桥杯第二十场小白入门赛

2.黛玉泡茶 我的思路代码&#xff1a;&#xff08;但我不知道哪有错误&#xff09; #include<iostream> #include<vector> #include<algorithm> using namespace std;int main(){int n,m,k,res1;cin>>n>>m>>k;vector<int>num(n1,0…...

平面设计做名片都去那个网站/百度seo报价

左婉琳 胡志刚摘要&#xff1a;为了设计出更加满足用户需求的办公设备&#xff0c;减轻办公综合症对人们的危害。本文以不同特征的人群为调研对象&#xff0c;通过问卷调查以及SPSS软件&#xff0c;分析了现阶段办公桌的用户体验及期望。得知人们对办公桌自身的属性和功能性方面…...

马鞍山网站建设设计/东莞seoseo关键词排名优化

一般情况下&#xff0c;我们使用的是nvidia -smi 来监控&#xff0c;但不美观且信息冗余&#xff0c;此处使用gpustat来监控&#xff0c;可直接安装&#xff1a;pip install gpustat 然后我们输入gpustat即可得到&#xff1a; 但此时无法实时获取&#xff0c;使用以下命令即可…...

北京住房和城乡建设委员会网站自住房/业务推广平台

前言&#xff1a; 之前&#xff0c;我们已经通过经历了类和对象&#xff08;上&#xff09;和类和对象&#xff08;中&#xff09;的学习&#xff0c;使我们对类和对象这一概念打下了坚实的基础&#xff0c;今天我们要做的便是对类和对象进行收尾工作&#xff0c;本篇之后关于…...

网站app 开发/google官网注册

获取股票数据的渠道有很多&#xff0c;而且基本上是免费的。目前股票端用的比较多的有通达信&#xff0c;tushare, Quantaxis等&#xff0c;期货端有CTP&#xff0c;CTPBEE&#xff0c;VNPY&#xff0c;TQSDK等&#xff0c;今天我们先来个开胃小菜&#xff0c;教你如何用tushar…...

html 企业网站模板/在线网站流量查询

有没有遇到过&#xff0c;导航UITableView&#xff0c;在push&#xff0c;back回来之后&#xff0c;当前cell仍然是选中的状态。当然&#xff0c;解决办法简单&#xff0c;添加一句[tableView deselectRowAtIndexPath:indexPath animated:YES]即可。令人纠结的时&#xff0c;在…...

如何利用国外网站做自媒体/新闻头条最新消息30字

原已经安装好的nginx&#xff0c;现在需要添加一个未被编译安装的模块: nginx -V 可以查看原来编译时都带了哪些参数 原来的参数&#xff1a; --prefix/app/nginx 添加的参数: --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module nginx第三方模…...