Spring Web MVC的入门学习(一)
目录
一、什么是 Spring Web MVC
1、MVC 定义
二、学习Spring MVC
1、项目准备
2、建立连接
2.1 @RequestMapping 注解的学习
2.2 @RequestMapping 使用
3、请求
3.1 传递单个参数
3.2 传递多个参数
3.3 传递对象
3.4 后端参数重命名(后端参数映射)
3.5 传递数组
3.6 传递集合
3.7 传递JSON数据
1、JSON语法
2、JSON字符串和Java对象互转
3、JSON优点
4、传递JSON对象
3.8 获取URL中参数@PathVariable
3.9 上传文件@RequestPart
一、什么是 Spring Web MVC
官方对于 Spring MVC 的描述是这样的:
什么是Servlet呢?
Servlet 是⼀种实现动态页面的技术. 准确来讲Servlet是⼀套 Java Web 开发的规范,或者说是⼀套 Java Web 开发的技术标准. 只有规范并不能做任何事情,必须要有人去实现它. 所谓实现 Servlet 规 范,就是真正编写代码去实现 Servlet 规范提到的各种功能,包括类、方法、属性等.Servlet 规范是开放的,除了 Sun 公司,其它公司也可以实现 Servlet 规范,目前常见的实现了Servlet 规范的产品包括 Tomcat、Weblogic、Jetty、Jboss、WebSphere 等,它们都被称为"Servlet 容器". Servlet 容器用来管理程序员编写的 Servlet 类.
总之,我们可以知道:Spring Web MVC 是⼀个 Web 框架. 简称 “Spring MVC”。
1、MVC 定义
MVC 是⼀种架构设计模式, 也⼀种思想, 而 Spring MVC 是对 MVC 思想的具体实现 . 除此之外, Spring MVC还是⼀个Web框架.总结来说, Spring MVC 是⼀个实现了 MVC 模式的 Web 框架 .
二、学习Spring MVC
- 建立连接:将用户(浏览器)和 Java 程序连接起来,也就是访问⼀个地址能够调用到我们的 Spring 程序。
- 请求:用户请求的时候会带⼀些参数,在程序中要想办法获取到参数, 所以请求这块主要是 获取参数的功能.
- 响应:执行了业务逻辑之后,要把程序执行的结果返回给用户, 也就是响应。
1、项目准备
2、建立连接
我们通过一个简单的代码来实现一下:
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class demo {@RequestMapping("/hello")public String getHello() {return "Hello,Spring MVC";}
}
然后来访问: http://127.0.0.1:8080/hello, 就可以看到程序返回的数据了,如图:
2.1 @RequestMapping 注解的学习
路由映射: 当用户访问⼀个 URL 时, 将用户的请求对应到程序中某个类的某个方法的过程就叫路由映射.
那么对于程序中加的 @RestController 注解有什么作用?
我们把 @RestController 去掉, 再来访问⼀次:
可见,报错了404,我们找不到该页面。所以@RestController 注解也很重要,不能不加。
一个项目中, 会有很多类, 每个类可能有很多的方法, Spring程序怎么知道要执行哪个方法呢?
Spring会对所有的类进行扫描, 如果类加了注解@RestController, Spring才会去看这个类里面的方法有没有加 @RequestMapping 这个注解。
2.2 @RequestMapping 使用
@RequestMapping标识⼀个类:设置映射请求的请求路径的初始信息@RequestMapping标识⼀个方法:设置映射请求的请求路径的具体信息
看如下代码:
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RequestMapping("/test")
@RestController
public class demo {@RequestMapping("/hello")public String getHello() {return "Hello,Spring MVC";}
}
访问地址:http://127.0.0.1:8080/test/hello
这里我们注意一下:
@RequestMapping 的URL 路径最前面加不加 / (斜杠)都可以, Spring程序启动时, 会进行判断, 如果 前面没有加 / , Spring会拼接上⼀个 /。如:
上面代码中 @RequestMapping("/test") 我们可以写为 @RequestMapping("test")通常情况下,我们加上 / 。@RequestMapping 的URL路径也可以是多层路径, 最终访问时, 依然是 类路径 + 方法路径
@RequestMapping("/user/m1")
@RestController
public class UserController {@RequestMapping("/say/hi")public String sayHi(){return "hello,Spring MVC";}
}
3、请求
3.1 传递单个参数
接收单个参数, 在 Spring MVC 中直接用方法中的参数就可以,比如以下代码:
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/param")
public class ParamController {@RequestMapping("/m1")public String method1(String name){return "接收到参数name:"+ name;}
}
由响应的结果,可以看到, 后端程序正确拿到了name参数的值.
Spring MVC 会根据方法的参数名, 找到对应的参数, 赋值给方法如果参数名不⼀致, 是获取不到参数的.比如请求URL: http://127.0.0.1:8080/param/m1?name1=spring响应结果:
注意:
我们以下面代码为例,来测试一下:
@RequestMapping("/m1/int")
public String method1GetInt(int age) {return "接收到参数age:"+age;
}
1、正常传递参数
2、不传递age参数
http://127.0.0.1:8080/param/m1/int
浏览器响应情况:
报500 错误,可见 使用基本类型来接收参数时, 参数必须传(除boolean类型), 否则会报500错误。
3、传递参数类型不匹配
报400 错误,可见 传递的参数类型不匹配时, 会报400错误.
3.2 传递多个参数
@RequestMapping("/m2")
public Object method2(String name, String password) {return "接收到参数name:" + name + ", password:" + password;
}
可以看到, 后端程序正确拿到了name和password参数的值。
3.3 传递对象
public class Student {private Integer id;private String name;private int age;public Student(){}public Student(Integer id, String name, int age) {this.id = id;this.name = name;this.age = age;}public void setName(String name) {this.name = name;}public void setAge(int age) {this.age = age;}public void setId(Integer id) {this.id = id;}public Integer getId() {return id;}public String getName() {return name;}public int getAge() {return age;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +", id=" + id +'}';}
}
传递对象代码实现:
@RequestMapping("/m3")
public Object method3(Student student){return student.toString();
}
可以看到, 后端程序正确拿到了Student对象里各个属性的值。
3.4 后端参数重命名(后端参数映射)
@RequestMapping("/m4")
public Object method4(@RequestParam("time") String createtime) {return "接收到参数createtime:" + createtime;
}
响应:
通过控制台打印的日志信息显示: 请求参数 'time' 不存在。
- 使用 @RequestParam 进行参数重命名时, 请求参数只能和 @RequestParam 声明的名称⼀ 致, 才能进行参数绑定和赋值.
- 使用 @RequestParam 进行参数重命名时, 参数就变成了必传参数.
那么如何进行非必传参数的设置呢?
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestParam {@AliasFor("name")String value() default "";@AliasFor("value")String name() default "";boolean required() default true;String defaultValue() default "\n\t\t\n\t\t\n\ue000\ue001\ue002\n\t\t\t\t\n";
}
@RequestMapping("/m4")
public Object method4(@RequestParam(value = "time", required = false) String createtime) {return "接收到参数createtime:" + createtime;
}
可以看到, 添加required=false之后, time前⾯也加了key, 变成了 value = "time"注解属性赋值时, 没有指明key的话, 默认为value属性.如果需要有多个属性进行赋值时, 需要写上key
3.5 传递数组
@RequestMapping("/m5")
public String method5(String[] array) {return "接收到参数:"+ Arrays.toString(array);
}
数组参数:请求参数名与形参数组名称相同且请求参数为多个, 后端定义数组类型形参即可接收参数http://127.0.0.1:8080/param/m5? array=zhangsan&array=lisi&array=wangwu或者使用 http://127.0.0.1:8080/param/m5?array=zhangsan,lisi,wangwu
浏览器响应结果:
3.6 传递集合
默认情况下,请求中参数名相同的多个值,是封装到数组. 如果要封装到集合,要使用@RequestParam 绑定参数关系。
请求方式和数组类似:
%2c 是逗号的转义编码, 解码后的url为:http://127.0.0.1:8080/param/m6? listParam=zhangsan,lisi,wangwu
后端接收代码:
@RequestMapping("/m6")
public String method6(@RequestParam List<String> listParam){return "size:"+listParam.size() + ",listParam:"+listParam;
}
3.7 传递JSON数据
注意: JSON与Javascript的关系: 没有关系, 只是语法相似
1、JSON语法
{"squadName": "Super hero squad","homeTown": "Metro City","formed": 2016,"secretBase": "Super tower","active": true,"members": [{"name": "Molecule Man","age": 29,"secretIdentity": "Dan Jukes","powers": ["Radiation resistance", "Turning tiny", "Radiation blast"]}, {"name": "Madame Uppercut","age": 39,"secretIdentity": "Jane Wilson","powers": ["Million tonne punch", "Damage resistance", "Superhuman reflexes"]}, {"name": "Eternal Flame","age": 1000000,"secretIdentity": "Unknown","powers": ["Immortality", "Heat Immunity", "Inferno","Teleportation", "Interdimensional travel"]}]
}
- 数据在键值对(Key/Value) 中
- 数据由逗号 , 分隔
- 对象用 {} 表示
- 数组用 [] 表示
- 值可以为对象, 也可以为数组, 数组中可以包含多个对象
- 对象: 大括号 {} 保存的对象是⼀个无序的 键值对 集合. ⼀个对象以左括号 { 开始, 右括号 } 结束。每个"键"后跟⼀个冒号: ,键值对使用逗号 , 分隔
- 数组: 中括号 [] 保存的数组是值(value)的有序集合. ⼀个数组以左中括号 [ 开始, 右中括 号 ] 结束,值之间使用逗号 , 分隔
2、JSON字符串和Java对象互转
JSON本质上是⼀个字符串, 通过文本来存储和描述数据。
Spring MVC框架也集成了JSON的转换工具, 我们可以直接使用, 来完成JSON字符串和Java对象的互转。
参考代码如下:
public class JSONUtils {private static ObjectMapper objectMapper = new ObjectMapper();public static void main(String[] args) throws JsonProcessingException {Person person = new Person();person.setId(5);person.setName("zhangsan");person.setPassword("123456");//对象转为JSON字符串String jsonStr = objectMapper.writeValueAsString(person);System.out.println("JSON字符串为:"+jsonStr);//JSON字符串转为对象Person p = objectMapper.readValue(jsonStr,Person.class);System.out.println("转换的对象id:"+p.getId()+",name:"+p.getName()+",password:"+p.getPassword());}
}
使用ObjectMapper 对象提供的两个方法, 可以完成对象和JSON字符串的互转writeValueAsString: 把对象转为JSON字符串readValue: 把字符串转为对象
3、JSON优点
- 简单易用: 语法简单,易于理解和编写,可以快速地进行数据交换
- 跨平台支持: JSON可以被多种编程语言解析和生成, 可以在不同的平台和语言之间进行数据交换和传输
- 轻量级: 相较于XML格式, JSON数据格式更加轻量级, 传输数据时占用带宽较小, 可以提高数据传输速度
- 易于扩展: JSON的数据结构灵活,支持嵌套对象和数组等复杂的数据结构,便于扩展和使用
- 安全性: JSON数据格式是⼀种纯文本格式,不包含可执行代码, 不会执行恶意代码,因此具有较高的安全性
4、传递JSON对象
RequestBody: 请求正文,意思是这个注解作用在请求正文的数据绑定,请求参数必须在写在请求正文中。
后端实现:
@RequestMapping(value = "/m7")
public Object method7(@RequestBody Person person) {return person.toString();
}
这里我们来使用postman工具测试我们的后端程序,
可以看到, 后端正确接收了.
去除掉 @RequestBody 的结果:
可见,后端未能成功给Person对象赋值。
3.8 获取URL中参数@PathVariable
@RequestMapping("/m8/{id}/{name}")
public String method8(@PathVariable Integer id, @PathVariable("name") String userName){return "解析参数id:"+id+",name:"+userName;
}
如果方法参数名称和需要绑定的URL中的变量名称⼀致时, 可以简写, 不用给@PathVariable的属性赋值 , 如上述例子中的id变量;如果方法参数名称和需要绑定的URL中的变量名称不⼀致时, 需要@PathVariable的属性value赋值, 如上述例⼦中的userName变量。
3.9 上传文件@RequestPart
后端代码实现:
@RequestMapping("/m9")
public String getfile(@RequestPart("file") MultipartFile file) throws IOException {//获取⽂件名称String fileName = file.getOriginalFilename();//⽂件上传到指定路径file.transferTo(new File("D:/temp/" + file.getOriginalFilename()));return "接收到⽂件名称为: "+fileName;
}
使用Postman发送请求:
然后观察 D:/temp 路径下, 文件是否上传成功。
该篇文章就先介绍到这里了,后续内容在下篇《Spring Web Mvc的入门学习(二)》,欢迎继续收看。
相关文章:
Spring Web MVC的入门学习(一)
目录 一、什么是 Spring Web MVC 1、MVC 定义 二、学习Spring MVC 1、项目准备 2、建立连接 2.1 RequestMapping 注解的学习 2.2 RequestMapping 使用 3、请求 3.1 传递单个参数 3.2 传递多个参数 3.3 传递对象 3.4 后端参数重命名(后端参数映射…...
如何使用Java语言发票查验接口实现发票真伪查验、票据ocr
随着时代潮流的发展,企业也在寻找更加便捷、高效的办公模式,尤其是针对财务工作人员而言,繁琐的发票录入、查验工作占据了财务人员的大部分时间。对此,翔云提供了发票识别接口、发票查验接口,那么企业应当如何将这些接…...
CAPL实现关闭TCP连接的几种方式以及它们的区别
在讲正文前,我们有必要复习下关闭TCP连接的过程:四次挥手。 假设A和B建立TCP连接并进行数据传输,当A的数据发送完后,需要主动发起断开连接的请求: A发送FIN报文,发起断开连接的请求B收到FIN报文后,首先回复ACK确认报文B把自己的数据发送完,发送FIN报文,发起断开连接的…...
Git--08--Git分支合并操作
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 Git分支合并操作案例流程客户端:GitExtensions操作步骤:A操作步骤:B操作步骤:C操作步骤:D操作步骤&#…...
深度学习训练中的种子设置
文章目录 深度学习训练中的种子设置1. 为什么需要设置随机种子2. 随机种子的设置及使用 深度学习训练中的种子设置 1. 为什么需要设置随机种子 在神经网络训练过程中,经常会通过随机的方式对一些数据进行初始化: 1、随机权重,网络有些部分…...
LLM:函数调用(Function Calling)
1 函数调用 虽然大模型能解决很多问题,但大模型并不能知晓一切。比如,大模型不知道最新消息(GPT-3.5 的知识截至 2021年9月,GPT-4 是 2023 年12月)。另外,大模型没有“真逻辑”。它表现出的逻辑、推理,是训练文本的统计…...
ssm 房屋销售管理系统开发mysql数据库web结构java编程计算机网页源码eclipse项目
一、源码特点 ssm 房屋销售管理系统是一套完善的信息系统,结合springMVC框架完成本系统,对理解JSP java编程开发语言有帮助系统采用SSM框架(MVC模式开发),系统具有完整的源代码和数据库,系统主要采用B/S模…...
MySQL使用ALTER命令创建与修改索引
索引(index)分类 单列索引,即一个索引只包含单个列,一个表可以有多个单列索引。组合索引,即一个索引包含多个列。 创建索引时,需要确保该索引是应用在 SQL查询语句的条件(一般作为 WHERE 子句的条件)。 实…...
54 npm run serve 和 npm run build 输出的关联和差异
前言 通常来说 我们开发的时候一般会用到的命令是 “npm run serve”, “npm run build” 前者会编译当前项目, 然后将编译之后的结果以 node 的形式启动一个服务, 暴露相关业务资源, 因此 我们可以通过 该服务访问到当前项目 后者是编译当前项目, 然后做一下最小化代码的优…...
iOS —— 初识KVO
iOS —— 初始KVO KVO的基础1. KVO概念2. KVO使用步骤注册KVO监听实现KVO监听销毁KVO监听 3. KVO基本用法4. KVO传值禁止KVO的方法 注意事项: KVO的基础 1. KVO概念 KVO是一种开发模式,它的全称是Key-Value Observing (观察者模式) 是苹果Fundation框架…...
什么是HTTP? HTTP 和 HTTPS 的区别?
文章目录 一、HTTP二、HTTPS三、区别参考文献 一、HTTP HTTP (HyperText Transfer Protocol),即超文本运输协议,是实现网络通信的一种规范 在计算机和网络世界有,存在不同的协议,如广播协议、寻址协议、路由协议等等… 而HTTP是…...
微信小程序如何进行npm导入组件
文章目录 目录 文章目录 前言 一、安装node 二、微信小程序通过npm安装组件(以Vant-weapp为例) 一、Vant-weapp下载 二 、修改 app.json 三 、修改 project.config.json 四 、 构建 npm 包 前言 微信小程序使用npm导入有很多的教程,我…...
MySQL编程实战LeetCode经典考题
文章简介 本文主要收集了LeetCode上关于MySQL的一些经典考题。 后续也会陆续把所有经典考题补充完整。 175.组合两个表 175.组合两个表 解答: select p.FirstName as firstName, p.LastName as lastName,a.City as city, a.State as state from Person p l…...
发生播放错误,即将重试 jellyfin
上周在家里的小主机上部署了jellyfin,真香,手机安卓端使用无问题,于是今天准备在电视上安装一个 首先是直接安装的手机版客户端,操作卡顿,而且很多操作没法实现,于是去下了一个tv版本 安装上后发现&#…...
BIONIOAIO
通信技术整体解决的问题 1.局域网内的通信要求 2.多系统间的底层消息传递机制 3.高并发下,大数据量的通信场景需要 4.游戏行业。无论是手游服务端、还是大型网络游戏,java的应用越来越广 IO模型基本说明 就是用什么样的通道或者说是通信模式和架构…...
SpringSecurity学习总结(三更草堂)
SpringSecurity安全框架的核心功能是认证和授权: 认证:验证当前访问系统的是不是本系统的用户,并且要确认具体是哪个用户。 授权:经过认证后判断当前用户是否具有进行某个操作的权限。 一般来说中大型的项目都是使用SpringSecurit…...
C++20中的jthread
一、多线程开发 c11以前,是不包含线程库的,开发多线程,必须使用OS系统自带的线程API,这就导致了很多问题,最主要的是,跨平台的开发,一般要保持几个主流应用的库的代码支持,特别是对…...
Xception模型详解
简介 Xception的名称源自于"Extreme Inception",它是在Inception架构的基础上进行了扩展和改进。Inception架构是Google团队提出的一种经典的卷积神经网络架构,用于解决深度卷积神经网络中的计算和参数增长问题。 与Inception不同࿰…...
【合合TextIn】AI构建新质生产力,合合信息Embedding模型助力专业知识应用
目录 一、合合信息acge模型获MTEB中文榜单第一 二、MTEB与C-MTEB 三、Embedding模型的意义 四、合合信息acge模型 (一)acge模型特点 (二)acge模型功能 (三)acge模型优势 五、公司介绍 一、合合信息…...
Flutter 拦截系统键盘,显示自定义键盘
一、这里记录下在开发过程中,下单的时候输入金额需要使用自定义的数字键盘 参考链接: https://juejin.cn/post/7166046328609308685 效果图 二、屏蔽系统键盘 怎样才能够在输入框获取焦点的时候,不让系统键盘弹出呢?同时又显示我们自定义的…...
内存泄漏是什么?如何避免内存泄漏?
1.2 内存泄漏 使用new开辟空间泄漏,抛出异常 int main() {int size 0;try{while (1){//int* p (int*)malloc(sizeof(int) * 1024 * 1024);/*if (p NULL){break;}*/int* p new int[1024 * 1024];size size 4 * 1024 * 1024;cout << p << endl;}}…...
linux 中的syslog的含义和用法
在Linux系统中,syslog是一种系统日志服务,用于收集、存储和管理系统和应用程序生成的日志消息。syslog服务负责记录系统的运行状态、错误信息、警告、调试信息等,以便系统管理员可以监控系统的健康状况、故障排查和性能优化。 含义和作用&am…...
kubernetes(K8S)学习(一):K8S集群搭建(1 master 2 worker)
K8S集群搭建(1 master 2 worker) 一、环境资源准备1.1、版本统一1.2、k8s环境系统要求1.3、准备三台Centos7虚拟机 二、集群搭建2.1、更新yum,并安装依赖包2.2、安装Docker2.3、设置hostname,修改hosts文件2.4、设置k8s的系统要求…...
巧克力(蓝桥杯)
文章目录 巧克力题目描述解题分析贪心 巧克力 题目描述 小蓝很喜欢吃巧克力,他每天都要吃一块巧克力。 一天小蓝到超市想买一些巧克力。超市的货架上有很多种巧克力,每种巧克力有自己的价格、数量和剩余的保质期天数,小蓝只吃没过保质期的…...
Python爬虫之pyquery和parsel的使用
三、pyquery的使用 1、准备工作 pip3 install pyquery2、初始化 2.1、字符串初始化 把HTML的内容当做参数,来初始化PyQuery对象。 html <div><ul><li class"item-0">first item</li><li class"item-1">&l…...
移动硬盘怎么加密?移动硬盘加密软件有哪些?
移动硬盘是我们在工作中最常用的移动存储设备,为了保护数据安全,需要使用专业的移动硬盘加密软件加密保护。那么,移动硬盘加密软件有哪些? BitLocker BitLocker是Windows的磁盘加锁功能,可以用于加密保护移动硬盘中…...
openEuler 22.03 安装 .NET 8.0
openEuler 22.03 安装 .NET 8.0 openEuler 22.03 安装 .NET 8.0 openEuler 22.03 安装 .NET 8.0 查看内核信息 [jeffPC-20240314EIAA ~]$ cat /proc/version Linux version 5.15.146.1-microsoft-standard-WSL2 (root65c757a075e2) (gcc (GCC) 11.2.0, GNU ld (GNU Binutils)…...
【转载】OpenCV ECC图像对齐实现与代码演示(Python / C++源码)
发现一个有很多实践代码的git 库,特记录下: 地址:GitHub - luohenyueji/OpenCV-Practical-Exercise: OpenCV practical exercise 作者博客地址:https://blog.csdn.net/LuohenYJ 已关注。 Items项目Resources1age_gender1基于深度学习识别人脸性别和年龄Model2OpenCV_dlib_…...
每日一题(相交链表 )
欢迎大家来我们主页进行指导 LaNzikinh-CSDN博客 160. 相交链表 - 力扣(LeetCode) 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 图示两个链表在节…...
C#WPF控件大全
本文列出WPF控件大全,点击可以进入详情页查看。 列表如下: AccessText用下划线来指定用作访问键的字符。 ActivatingKeyTipEventArgs为 ActivatingKeyTip 事件提供数据。...
做酒业网站的要求/河南关键词优化搜索
4月18日,“屏价不凡”2019酷开网络大屏价值优选推介活动在北京举行。会上,酷开网络分享了大屏价值的用户思维,大屏价值可养成的生态体系,大屏价值的创新营销模式等,带领OTT营销走向新的技术流、数据化阶段。 本次会议…...
家居企业网站建设效果/合肥seo建站
今天给大侠带来基于FPGA的VGA/LCD显示控制器设计,由于篇幅较长,分三篇。今天带来第二篇,中篇,VGA 显示原理以及VGA/LCD 显示控制器的基本框架,话不多说,上货。 之前也有图像处理以及VGA显示相关的文章&…...
网站建设运营维护合同/平台推广营销
除了使用xlrd库或者xlwt库进行对excel表格的操作读与写,而且pandas库同样支持excel的操作;且pandas操作更加简介方便。首先是pd.read_excel的参数:函数为:pd.read_excel(io, sheetname0,header0,skiprowsNone,index_colNone,names…...
辛集哪做网站/中国万网域名查询
1. 卸载 1.1 删除ubuntu系统的分区 首先【win】【R】,然后输入【diskpart】,如下图。 输入【list disk】查看分区,有多个磁盘分区可分别使用【select disk 0】或者【select disk 1】,然后再list partition查看分区,其…...
wordpress如何制作单页订单/湖人最新消息
文章目录1、表格 table1.1、创建表格1.2、表格属性1.3、表头单元格标签th1.4、表格标题caption1.5、合并单元格1.5.1、合并单元格2种方式1.5.2、合并单元格顺序1.5.3、合并单元格三步曲1.6、总结表格1.7、表格划分结构2、列表标签2.1、无序列表 ul2.2、有序列表 ol2.3、自定义列…...
企业人力资源管理师/长沙百度网站推广优化
在网页中很多小的图标不一定是图片。通过字符符号做出来的图标,可以矢量放大,更加方便实用。这里就学习一下如何在网页中加入iconfont。更多的文章请关注我的头条号,我是落笔承冰。一、创建一个空白的html网页test1.html。二、浏览器中打开ic…...