JavaWeb Web基础

发布于:2025-05-23 ⋅ 阅读:(19) ⋅ 点赞:(0)

SpringBoot Web入门

 

 Spring Boot只是简化了Spring项目的配置,其底层还是Spring Framework

创建步骤

注意:

语言选择Java,类型选择Maven,JDK和Java要保持一致,打包方式为Jar

点击下一步

选择Spring Boot的版本,注意不要选择后面带(SNAPSHOT)的版本 

配置依赖项,可以再搜索框搜索依赖项名称进行查找,配置完后点击创建。

Spring官方脚手架连接不上解决方案

直接将URl地址换成阿里云的骨架

入门解析

HTTP协议

概述

请求协议

请求数据格式

post方式有请求体,而get方式没有请求体

服务区获取请求分为以下几个步骤 

1.获取请求方式
2.获取请求url地址
3.获取请求协议
4.获取请求参数
5.获取请求头 

响应协议

响应数据格式

响应数据格式分为响应行,响应头,响应体三部分

状态码

其中3XX表示重定向

即浏览器响应如3xx(Location:B)的状态码时,再次发起一次请求,请求B服务器,底层涉及到两次请求响应。

常见状态码

响应数据设置

分为两种方式 

SpringBootWeb案例

在项目开发中,对于基本类型,我们建议使用包装类

可以添加Lombok依赖项,可以直接通过注解简化Java的样板代码,如:

@Data,提供get和set方法;

@NoArgsConstructor,提供无参构造

@AllArgsConstructor,提供全参构造

 


分层解耦

我们在进行软件设计或软件开发的时候,尽量遵循单一职责原则。

单一职责原则:一个类或一个方法,就只做一件事情,只管一块功能。

这样就可以让类、接口、方法的复杂度更低,可读性更强,扩展性更好,也更利于后期的维护。

三层架构

控制层(Controller)

controller:控制层,接收前端发送的请求,对请求进行处理,并响应数据

业务逻辑层(Service)

service:业务逻辑层,处理具体的业务逻辑,

数据访问层(Dao)

dao:数据访问层(Data Access 0bject)(持久层),负责数据访问操作,包括数据的增、删、改、查。

  • 前端发起的请求,由Controller层接收(Controller响应数据给前端)

  • Controller层调用Service层来进行逻辑处理(Service层处理完后,把处理结果返回给Controller层)

  • Serivce层调用Dao层(逻辑处理过程中需要用到的一些数据要从Dao层获取)

  • Dao层操作文件中的数据(Dao拿到的数据会返回给Service层)

分层解耦

  • 内聚:软件中各个功能模块内部的功能联系。

  • 耦合:衡量软件中各个层/模块之间的依赖、关联的程度。

  • 软件设计原则:高内聚低耦合。

    高内聚:指的是一个模块中各个元素之间的联系的紧密程度,如果各个元素(语句、程序段)之间的联系程度越高,则内聚性越高,即 "高内聚"。

    低耦合:指的是软件中各个层、模块之间的依赖关联程序越低越好。

关于解耦我们的解决思路是:

  • 提供一个容器,容器中存储一些对象(例:UserService对象)

  • Controller程序从容器中获取UserService类型的对象

我们想要实现上述解耦操作,就涉及到Spring中的两个核心概念:IOC和DI

IOC&DI入门

  • 控制反转: Inversion Of Control,简称IOC。对象的创建控制权由程序自身转移到外部(容器),这种思想称为控制反转。

    • 对象的创建权由程序员主动创建转移到容器(由容器创建、管理对象)。这个容器称为:IOC容器或Spring容器。

  • 依赖注入: Dependency Injection,简称DI。容器为应用程序提供运行时,所依赖的资源,称之为依赖注入。

    • 程序运行时需要某个资源,此时容器就为其提供这个资源。

    • 例:EmpController程序运行时需要EmpService对象,Spring容器就为其提供并注入EmpService对象。

  • bean对象:IOC容器中创建、管理的对象,称之为:bean对象。

在实现类加上 @Component 注解,就代表把当前类产生的对象交给IOC容器管理。

用@Autowired为Controller 及 Service注入运行时所依赖的对象

IOC详解

Spring框架为了更好的标识web应用程序开发当中,bean对象到底归属于哪一层,又提供了@Component的衍生注解:

  • 前面声明bean的四大注解,要想生效,还需要被组件扫描注解 @ComponentScan 扫描。

  • 该注解虽然没有显式配置,但是实际上已经包含在了启动类声明注解 @SpringBootApplication 中,默认扫描的范围是启动类所在包及其子包。

  • 所以,我们在项目开发中,只需要按照如上项目结构,将项目中的所有的业务类,都放在启动类所在包的子包中,就无需考虑组件扫描问题。

 

DI详解

1.属性注入

  • 优点:代码简洁、方便快速开发。

  • 缺点:隐藏了类之间的依赖关系、可能会破坏类的封装性。

2.构造函数注入

  • 优点:能清晰地看到类的依赖关系、提高了代码的安全性。

  • 缺点:代码繁琐、如果构造参数过多,可能会导致构造函数臃肿。

  • 注意:如果只有一个构造函数,@Autowired注解可以省略。(通常来说,也只有一个构造函数)

3.setter注入

  • 优点:保持了类的封装性,依赖关系更清晰。

  • 缺点:需要额外编写setter方法,增加了代码量。

在项目开发中,基于@Autowired进行依赖注入时,基本都是第一种和第二种方式。(官方推荐第二种方式,因为会更加规范)但是在企业项目开发中,很多的项目中,也会选择第一种方式因为更加简洁、高效(在规范性方面进行了妥协)。

那如果在IOC容器中,存在多个相同类型的bean对象就会出现报错

 

方案一:使用@Primary注解

当存在多个相同类型的Bean注入时,加上@Primary注解,来确定默认的实现。

方案二:使用@Qualifier注解

指定当前要注入的bean对象。 在@Qualifier的value属性中,指定注入的bean的名称。 @Qualifier注解不能单独使用,必须配合@Autowired使用。

方案三:使用@Resource注解

是按照bean的名称进行注入。通过name属性指定要注入的bean的名称。

面试题:@Autowird 与 @Resource的区别

  • @Autowired 是spring框架提供的注解,而@Resource是JDK提供的注解

  • @Autowired 默认是按照类型注入,而@Resource是按照名称注入


网站公告

今日签到

点亮在社区的每一天
去签到