Web后端开发
请求响应
- 请求(HttpServletRequest):获取请求数据
- 响应(HttpServletResponse):设置响应数据
- BS架构:Browser/Server,浏览器/服务器架构模式。客户端指需要浏览器,应用程序的逻辑和数据都存储在服务端
- CS架构:Client/Server,客户端/服务器架构模式
postman工具
postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件
作用:常用于进行接口测试
请求
简单参数
原始方式
在原始的程序web程序中,获取请求参数,需要通过HttpServletRequest对象手动获取1
2
3
4
5
6
7
8
public String simpleParam(HttpServletRequest request) {
String name = request.getParameter("name");
String ageStr = request.getParameter("ageStr");
int age = Integer.parseInt(ageStr);
System.out.println(name + " : " + age);
return "OK";
}SpringBoot方式
简单参数:如果方法形参名称与请求参数名称不匹配,可以使用@RequestParam
完成映射1
2
3
4
5
public String simpleParam( { String username, Integer age)
System.out.println(username + " : " + age);
return "OK";
}
简单实体对象:请求参数名与形参对象属性名相同,定义POJO接收即可
1
2
3
4
5
6
7
8
9
10
11
12package com.zishuq.pojo;
public class User {
private String name;
private Integer age;
private Address address;
}
class Address {
private String province;
private String city;
}1
2
3
4
5
public String complexPojo(User user) {
System.out.println(user);
return "OK";
}数组参数:请求参数名与形参数组名称相同且请求参数为多个,定义数组类型形参即可接收参数
1
2
3
4
5
public String simplePojo(String[] hobby) {
System.out.println(Arrays.toString(hobby));
return "OK";
}集合参数:请求参数名与形参集合名称相同且请求参数为多个,
@RequestParam
绑定参数关系1
2
3
4
5
public String listParam( { List<String> hobby)
System.out.println(hobby);
return "OK";
}日期参数:使用
@DateTimeFormat
注解完成日期参数格式转换1
2
3
4
5
public String dateParam( { LocalDateTime updateTime)
System.out.println(updateTime);
return "OK";
}JSON参数:JSON数据键名与形参对象属性名相同,定义POJO类型形参即可接收参数,需要使用
@RequestBody
标识1
2
3
4
5
public String jsonParam( { User user)
System.out.println(user);
return "OK";
}数据:
1
2
3
4
5
6
7
8{
"name":"zishuQ",
"age":20,
"address":{
"province":"北京",
"city":"北京"
}
}路径参数:通过请求URL直接传递参数,使用
{...}
来标识该路径参数,需要使用@PathVariable
获取路径参数1
2
3
4
5
public String pathParam( { Integer id, String name)
System.out.println(id + " : " + name);
return "OK";
}
响应
@ResponseBody
- 类型:方法注解、类注解
- 位置:Controller方式上/类上
- 作用:将方法返回值直接响应,如果返回值类型是 实体对象/集合,将会转换为JSON格式响应
- 说明:@RestController = @Controller + @RTesponseBody
示例:
1 |
|
统一响应结果:
1 | package com.zishuq.pojo; |
1 | public class ResponseController { |
分层解耦
- 内聚:软件中各个功能模块内部的功能联系
- 耦合:衡量软件中各个层/模块之间的依赖、关联的程度
- 软件设计原则:高内聚低耦合
三层架构
- controller:控制层,接收前端发送的请求,对请求进行处理,并响应数据
- service:业务逻辑层,处理具体的业务逻辑
- dao:数据访问层(Data Access Object)(持久层),复制数据访问操作,包括数据的增、删、改、查
IOC-DI
- 控制反转:Inversion Of Control,简称IOC。对象的创建控制权由程序自身转移到外部(容器),这种思想称为控制反转
- 依赖注入:Dependency Injection,简称DI。容器为应用程序提供运行时所依赖的资源,称之为依赖注入
- Bean对象:IOC容器中创建、管理的对象,称之为bean
步骤:
Service层 及 Dao层的实现类,交给IOC容器管理
@Component
1
2
3
4
5
6
7
8
9
10
public class EmpDaoA implements EmpDao {
public List<Emp> listEmp() {
// 1.从文件中查询数据
String file = this.getClass().getClassLoader().getResource("emp.xml").getFile();
List<Emp> empList = XmlParseUtils.parse(file, Emp.class);
return empList;
}
}1
2
3
4
5
6
7
8
9
10
public class EmpServiceA implements EmpService {
private EmpDao empDao = new EmpDaoA();
public List<Emp> listEmp() {
// 调用dao层,查询数据
List<Emp> empList = empDao.listEmp();
// ...为Controller及Service注入运行时依赖的对象
@Autowired
1
2
3
4
5
6
7
8
9
10
11
public class EmpController {
private EmpService empService;
public Result listEmp() throws Exception {
List<Emp> empList = empService.listEmp();
return Result.success(empList);
}
}1
2
3
4
5
6
7
8
9
10
public class EmpServiceA implements EmpService {
private EmpDao empDao = new EmpDaoA();
public List<Emp> listEmp() {
// 调用dao层,查询数据
List<Emp> empList = empDao.listEmp();
// ...运行测试
Bean的声明
注解 | 说明 | 位置 |
---|---|---|
@Component | 声明bean的基础注解 | 不属于以下三恶吏时,用此注解 |
@Controller | @Component的衍生注解 | 标注在控制器类上 |
@Service | @Component的衍生注解 | 标注在业务类上 |
@Repository | @Component的衍生注解 | 标注在数据访问类上(由于与mybatis整合,用的少 |
- 声明bean的时候,可以通过value属性指定bean的名字,如果没有指定,默认为类名首字母小写
- 使用以上四个注解都可以声明bean,但是在springboot集成web开发中,声明控制器bean只能用@Controller
Bean组件扫描
- 前面声明bean的四大注解,要想生效,还需要被组件扫描注解@ComponentScan扫描
- @ComponentScan注解虽然没有显示配置,但是实际上已经包含在启动类声明注解@SpringBootApplication中,默认扫描的范围是启动类所在包及其子包
Bean注入
@Autowired注解,默认是按照类型进行,如果存在多个相同类型的bean,将会报错
通过以下几种方案来解决:
@Primary
1
2
3
public class EmpServiceA implements EmpService{}@Qualifier
1
2
3
4
5
public class EmpController {
private EmpService empService;@Resource
1
2
3
4
public class EmpController {
private EmpService empService;@Resouce 与 @Autowired区别
@Autowired 是spring框架提供的注解,而@Resource是JDK提到的注解
@Autowired 默认是按照类型注入,而@Resource默认是按照名称注入
数据库
- 数据库:DataBase(DB),是存储和管理数据的仓库
- 数据库管理系统:DataBase Management System(DBMS),操纵和管理数据库的大型软件
- SQL:Structured Query Language,操作关系型数据库的编程语言,定义了一套操作关系型数据库统一标准
数据模型
关系型数据库(RDBMS):建立在关系模型基础上,由多张相互连接的二维表组成的数据库。
特点:
使用表存储数据,格式统一,便于维护
使用SQL语言操作,标准统一,使用方便,可用于复杂查询
SQL语句
SQL语句通常被分为四大类:
分类 | 全称 | 说明 |
---|---|---|
DDL | Data Definition Language | 数据定义语言,用来定义数据库对象(数据库,表,字段) |
DML | Data Manipulation Language | 数据操作语言,用来对数据库表中的数据进行增删改 |
DQL | Data Query Language | 数据查询语言,用来查询数据库中表的记录 |
DCL | Data Control Language | 数据控制语言,用来创建数据库用户、控制数据库的访问权限 |
数据库操作
查询
- 查询所有数据库:
show databases;
- 查询当前数据库:
select database();
使用
- 使用数据库:
use 数据库名;
创建
- 创建数据库:
create database [if not exists] 数据库名;
删除
- 删除数据库:
drop database [if exists] 数据库名;
表操作
创建
1 | create table 表名( |