dede电影网站模板下载,it培训网,wordpress 多说 社交登陆,永久免费不收费的软件appHTTP协议
简介
Hyper Text Transfer Protocol#xff0c;超文本传输协议#xff0c;规定了浏览器和服务器之间数据传输的规则 http协议基于TCP协议#xff1a;面向连接#xff0c;安全基于请求-响应模型#xff1a;一次请求对应一次响应HTTP协议是无状态的协议#xff…HTTP协议
简介
Hyper Text Transfer Protocol超文本传输协议规定了浏览器和服务器之间数据传输的规则 http协议基于TCP协议面向连接安全基于请求-响应模型一次请求对应一次响应HTTP协议是无状态的协议对事务处理没有记忆能力。每次请求-响应都是独立的优点是速度快缺点是多次请求间不能共享数据
请求协议 请求行请求数据第一行请求方式get、post、资源路径、协议
请求头第二行开始格式keyvalue 常见请求头: Host请求的主机名User-Agent浏览器版本Accept表示浏览器能接受的资源类型如text/image/Accept-Language表示浏览器偏好的语言服务器可以据此返回不同语言的网页Accept-Encoding表示浏览器可以支持的压缩类型例如gzip、deflateContent-Type请求主题的数据类型Content-Length请求主体的大小单位字节 请求体post请求存放请求参数 请求方式-GET请求参数在请求行中没有请求体。GET请求大小在浏览器中是有限制的。 请求方式-POST请求参数在请求体中POST请求大小是没有限制的。 请求数据获取
浏览器端发送请求数据后服务器端需要接受并获取请求数据。Web服务器Tomcat对http协议的请求数据进行解析并进行了封装HttpServletRequest在调用Controller方法的时候传递给了该方法。这样就使得程序员不必直接对协议进行操作让web开发更加便捷。
响应协议 响应行响应数据第一行协议、状态码、描述 响应头第二行开始格式keyvalue 常见响应头 Content-Type表示响应内容的类型例如text/htmlapplication/json Content-Length表示改响应内容的长度 Content-Encoding表示改响应压缩算法例如gzip Cache-Control指示客户端应如何缓存例如max-age300表示可以最多缓存300秒 Set-Cookie告诉浏览器为当前页面所在的域设置cookie 响应体最后一部分存放响应数据
响应数据设置
web服务器对HTTP协议的响应数据进行了封装HttpServletResponse并在调用Controller方法的时候传递给了该方法。
分层解耦
三层架构 对代码进行拆分的原因是要遵循单一职责原则便于复用和后期维护 分层解耦
拆分完三层架构之后会发现Service调用DaoController调用Service都是通过在本层new一个另外一层的对象来实现功能的调用这样三层之间的耦合度就比较高下面需要进行解耦合。
解耦合主要是通过Spring框架两项关键的技术控制反转Inversion Of Control\IOC和依赖注入Dependency Injection \DI
控制反转IOC对象的创建控制权由程序自身转移到外部容器这种思想为控制反转
依赖注入DI容器为应用程序提供运行时所以来的资源称之为依赖注入
Bean对象IOC容器中创建、管理的对象称之为Bean 下面是如何具体实现分层解耦
将Dao及Service层的实现类交给IOC容器管理Component注解为Controller及Service注入运行时依赖的对象Autowired注解
UserController的代码
RestController
public class UserController {Autowiredprivate Userservice userservice;RequestMapping(/list)public ListUser list(){ListUser userList userservice.findAll();return userList;}}UserServiceImpl的代码
Component
public class UserServiceImpl implements Userservice {Autowiredprivate UserDao userDao;Overridepublic ListUser findAll() {ListString lines userDao.findAll();//2.解析数据封装成对象 -- 集合ListUser userList lines.stream().map(line - {String[] parts line.split(,);Integer id Integer.parseInt(parts[0]);String username parts[1];String password parts[2];String name parts[3];Integer age Integer.parseInt(parts[4]);LocalDateTime updateTime LocalDateTime.parse(parts[5], DateTimeFormatter.ofPattern(yyyy-MM-dd HH:mm:ss));return new User(id, username, password, name, age, updateTime);}).collect(Collectors.toList());return userList;}
}UserDaoImpl的代码
Component
public class UserDaoImpl implements UserDao {public ListString findAll(){//1.加载并读取文件InputStream in this.getClass().getClassLoader().getResourceAsStream(user.txt);ArrayListString lines IoUtil.readLines(in, StandardCharsets.UTF_8, new ArrayList());return lines;}
}
IOC
衍生注解是为了将类划分到三层架构哪一层就是用对应的衍生注解 代码中声明bean的四大注解想要生效还需要被组件扫描注解ComponentScan扫描
虽然在上面代码中注解ComponentScan没有被显示配置但实际上已经包含在启动类声明注解SprintBootApplication中默认扫描的范围时启动类所在包及其子包。 DI
基于**Autowired**进行依赖注入的常见方式有三种
第一种属性注入
RestController
public class UserController {Autowiredprivate UserService userService;
}优点代码简洁、方便快速开发
缺点隐藏了类之间的依赖关系可能破坏类的封装性
第二种构造函数注入
RestController
public class UserController {private final UserService userService;Autowiredpublic UserController(UserService userService) {this.userService userService;}
}优点能清晰地看到类的依赖关系、提高代码的安全性
缺点代码繁琐、如果构造参数过多可能会导致构造函数臃肿
第三种setter注入
RestController
public class UserController {private UserService userService;Autowiredpublic setUserUserService(UserService userService) {this.userService userService;}
}优点保证了类的封装性依赖关系更清晰
缺点代码繁琐 实战中很多企业会选择基于属性的注入第一种和第二种用的更多一点 Autowired是根据类型注入的
如果一个类型有多个Bean对象则是不允许的会直接报错
需要指定具体注入哪个Bean对象 Resoure和Autowired Resoure是javeee中提供的注解Autowired是Spring框架中提供的注解 Resoure默认是按名称注入的Autowired默认是按类型注入