Javaweb后端开发

Maven 

Maven是apache旗下的一个开源项目,是一款用于管理和构建Java项目的工具。

依赖管理

依赖:指当前项目运行所需要的jar包,一个项目可以引入多个依赖

配置:

  1. 在pom.xml中编写<dependencies>标签
  2. 在<dependencies>标签中使用<dependency>引入坐标
  3. 定义坐标的groupid,artifactid,version
  4. 点击刷新按钮,引入最新加入的坐标

依赖传递

依赖具有传递性

  • 直接依赖:在当前项目中通过依赖配置建立的依赖关系
  • 间接依赖:被依赖的资源如果依赖其他资源,当前项目间接依赖其他资源 
  • 排除依赖:指主动断开依赖的资源,被排除的资源无需指定版本。

依赖范围

依赖的jar包,默认情况下,可以在任何地方使用。可以通过<scope>...<scope>设置其作用范围

作用范围

  • 主程序范围有效。(main文件夹范围内)
  • 测试程序范围有效。(test文件夹范围内)
  • 是否参与打包运行。(package指令范围内) 

 生命周期

maven的生命周期是为了对所有的maven项目构建过程进行抽象和统一

Maven中由三套相互独立的生命周期:

  • clean:清理工作
  • default:核心工作,如:编译、测试、打包、安装、部署等。
  • site:生成报告、发布站点等。

  • clean:移除上一次构建生成的文件
  • compile:编译项目源代码
  • test:使用合适的单元测试框架运行测试(junit)
  • package:将编译后的文件打包,如:jar、war等
  • install:安装项目到本地仓库

注意事项:在同一套生命周期中,当运行后面的阶段时,前面的阶段都会运行。

web入门

HTTP

概念:Hyper Text Transfer Protocol,超文本传输协议,规定了浏览器和服务器之间数据传输的规则。

特点:

基于TCP协议:面向连接,安全

基于请求-响应模型的:一次请求对应一次响应

HTTP协议是无状态的协议:对于事物处理没有记忆能力。每次请求-响应都是独立的。

  • 缺点:多次请求间不能共享数据
  • 优点:速度快 

请求协议

响应协议

常用状态码

 协议解析

Tomcat

web服务器

web服务器是一个软件程序,对HTTP协议的操作进行封装,使程序员不必直接对协议进行操作,让web开发更加便捷。主要功能是“提供网上信息浏览服务”。

 tomcat的基本使用

常见问题

 

 配置tomcat的网络端口

 HTTP协议默认端口号为80,如果将tomcat端口号改为80,则将来访问tomcat时,将不用输入端口号。

 tomcat部署项目

将项目放置到webapps目录下,则部署完成。

入门程序解析

1.起步依赖

sping-boot-starter-web

spring-boot-starter-test

2.内嵌tomcat服务器

基于springboot开发的web应用程序,内置了tomcat服务器,当启动类运行时,会自动启动内嵌的tomcat服务器。

请求响应

请求响应

请求(HttpServleRequest):获取请求数据

响应(HttpServleResponse):设置响应数据

BS架构:Browser/Server,浏览器/服务器架构模式。客服端 只需要浏览器,应用程序的逻辑和数据都存储在服务端(维护方便 体验一般

CS架构:Client/Server,客户端/服务器架构模式。(开发、维护麻烦 体验不错

请求

postman

postman是一款功能强大的网页调试与发送网页HTTP请求的chrome插件

作用:常用于进行接口测试

简单参数

传输方式:

原始方式:

在原始web程序中,获取请求参数,需要通过HttpServletRequest对象手动获取

 spring boot方式

简单参数:参数名与形参变量名相同,定义形参即可接收参数

 如果方法形参名称与请求参数名称不匹配,可以使用@RequestParam完成映射

 @RequestParam中的requried属性默认为true,代表该请求参数必须传递,如果不传递将报错。如果该参数是可选的,可以将required属性设置为false。

实体参数

简单实体对象:请求参数名与形参对象属性名相同,定义POJO接收即可

复杂实体对象:请求参数名与形参对象属性名相同,按照对象层次结构关系即可接收嵌套POJO属性参数。

数组集合参数

数组参数:请求参数名与形参数组名称相同且请求参数为多个,定义数组型形参即可接收参数。

集合参数:请求参数名与形参集合名称相同且请i去参数为多个,@RequestParam绑定参数关系

 日期参数

日期参数:使用@DateTimeFormat注解完成日期参数格式转换

JSON参数

 JSON参数:JSON数据键名与形参对象属性名相同,定义POJO类型形参即可接收参数,需要使用@RequestBody标识。

 路径参数

路径参数:通过请求URL直接传递参数,使用{...}来标识该路径参数,需要使用@PathVariable获取路径参数。

 总结

响应

@ResponseBody

类型:方法注解、类注解

位置:Controller方法上/类上

作用:将方法返回值直接响应,如果返回值类型是 实体对象/集合,将会转换为JSON格式响应

说明:@RestController = @Controller + @ResponseBody

统一响应结果

定义一个result类,作为接口返回值

 案例

基本步骤

第一步:在pom.xml文件中引入dom4j的依赖,用于解析XML文件

 .

 第二步:引入解析XML的工具类XMLParserUtils、对应的实体类Emp、XML文件emp.xml

第三步:引入需要显示的静态页面文件,放在resources下的static目录下

spring boot项目的静态资源(html、css、js等前端资源)默认存放目录为:classpath:/static、classspath:/public、classpath:/resources

第四步:编写Controller程序,处理请求,响应数据

分层解耦

三层架构

  • controller:控制层,接收前端发送的请求,对请求进行处理,并 响应数据。
  • service:业务逻辑层,处理具体的业务逻辑。
  • dao:数据访问层(Data Access Object)(持久层),负责数据访问操作,包括数据的增。删、改、查。

基础流程:

 分层解耦

  • 内聚:软件中各个功能模块内部的功能联系。
  • 耦合;衡量软件中各个层/模块之间的依赖、关联的程度。
  • 软件设计原则:高内聚低耦合

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

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

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

IOC详解

Bean的声明

要把某个对象交给IOC容器管理,需要在对应的类上加上如下注释之一:

注意事项: 

  • 声明bean的时候,可以通过value属性指定bean的名字,如果没有指定,默认为类名首字母小写。
  • 使用以上四个注解都可以声明bean,但是在springboot集成web开发中,声明控制器bean只能用@Controller。

Bean组件扫描

  • 前面声明bean的四大注解,要想生效,还需要被组件扫描注解@ComponentScan扫描。
  • @ComponentScan注解虽然没有显示配置,但是实际上已经包含在了启动类声明注解@SpringBootApplication中,默认扫描的范围是启动类所在包及其子包。

DI详解

@Autowired //运行时,IOC容器会提供该类型的bean对象,并赋值给该变量 -依赖注入

Bean注入

@Autowired注解,默认是按照类型进行,如果存在多个相同类型的bean,将会报出如下错误:

通过以下几种方案来解决:

@Primary

 

@Autowired + @Qualifier(”bean的名称“)

@Resource(name=”bean的名称“) 

@Resource与@Autowired区别

  • @Autowired是spring框架提供的注解,而@Resource是JDK提供的注解。
  • @Autowired默认是按照类型注入,而@Resource默认是按照名称注入。

Mybatis

入门

Mybatis是一款优秀的持久层框架,用于简化JDBC的开发

使用Mybatis查询所有用户数据

 JDBC介绍

JDBC,就是使用Java语言操作关系型数据库的一套API。

 数据库连接池

  • 数据库连接池是个容器,负责分配,管理数据库连接(Connection)
  • 它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个
  • 释放空闲时间超过最大空闲时间的连接,来避免因为没有释放连接而引起的数据库连接遗漏

优势:

  • 资源重用
  • 提升系统响应速度
  • 避免数据库连接遗漏

标准接口:DataSource

  • 官方(sun)提供的数据库连接池接口,由第三方组织实现此接口。
  • 功能:获取连接

 常见产品:

 Druid(德鲁伊)

  • Druid连接池是阿里巴巴开源的数据库连接池项目
  • 功能强大,性能优秀,是Java语言最好的数据库连接池之一

切换Druid数据连接池

方法一:

 方法二:

 Lombok

Lombok是一个实用的Java类库,能通过注解的形式自动生成构造器、getter/setter、equals、hashcode、toString等方法,并可以自动化生成日志变量,简化Java开发、提高效率。

引入依赖

 

 Mybatis基础操作

日志输出

预编译SQL

优势:

  • 性能更强
  • 更安全(防止SQL注入)

SQL注入是通过操作输入的数据来修改事先定义好的SQL语句,以达到执行代码对服务器进行攻击的方法。

参数占位符:

删除

根据主键删除

SQL语句:

delete from emp where id=17;

接口方法:

@Delete(“delete from emp where id= #{id}")
public void delete(Integer id);

如果mapper接口方法形参只有一个普通类型的参数,#{...}里面的属性名可以随便写,如:#{id}、#{value}

新增

 新增(主键返回)

  • 描述:在数据添加成功后,需要获取插入数据库数据的主键。如:添加套餐数据时,还需要维护套餐菜品关系表数据。
  • 实现:

 更新

接口方法:

 查询(根据ID查询)

接口方法

查询(条件查询)

 

 数据封装

  • 实体类属性名和数据库表查询返回的字段名一致,mybatis会自动封装。
  • 如果实体类属性名和数据库表查询返回的字段名不一致,不能自动封装。

解决方案

登录校验

会话技术

会话:用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束。在一次会话中可以包含多次请求和响应。

会话跟踪:一种维护浏览器状态的方法,服务器需要多次请求是否来自于同一浏览器,以便在同一次会话的多次请求间共享数据。

会话跟踪方案:

  • 客户端会话跟踪技术:Cookie
  • 服务端会话跟踪技术:Session
  • 令牌技术

 会话跟踪方案对比

 

JWT令牌

思路:

  • 令牌生成:登录成功后,生成JWT令牌,并返回给前端。
  • 令牌校验:在请求到达服务端后,对令牌进行统一拦截、校验。
JWT-生成

 JWT-校验

注意事项:

  • JWT校验时使用的签名秘钥,必须和生成JWT令牌时使用的密钥是配套的。
  • 如果JWT令牌解析校验时报错,则说明JWT令牌被篡改或失效了,令牌非法。 

过滤器Filter

Filter快速入门

定义:实现Filter接口

配置:@WebFilter(urlPattern=“/*”)

           @ServletComponentScan

详解

异常处理

全局异常处理器

  • @RestControllerAdvice
  • @ExceptionHandler

事务管理

spring事物管理

概念:事物是一组操作的集合,它是一个不可分割的工作单位,这些操作要么同时成功,要么同时失败

操作:

 注解
  • 注解:@Transactional
  • 位置:业务(service)层的方法上、类上、接口上
  • 作用:将当前方法交给spring进行事物管理,方法执行前,开启事物;成功执行完毕,提交事物;出现异常,回滚事物。
事物管理日志的配置文件  .yml

#开启事物管理日志

logging:
 level:
  org.springframework.jdbc.suport.jdbcTransactionManager:debug

事物进阶

事物属性-回滚

rollbackFor

默认情况下,只有出现RuntimeException才回滚异常。rollbackFor属性用于控制出现任何==何种异常类型,回滚事务。

 事务属性-传播行为

propagation

事务传播行为:指的就是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行事务控制。

 场景:

REQUIRED:大部分情况下都是用该传播行为即可。

REQUIRES_NEW:当我们不希望事务之间相互影响时,可以使用该传播行为。比如:下订

单前需要记录日志,不论成功与否,都需要保证日志记录能够记录成功。

AOP

AOP:Aspect Oriented Programming(面向切面编程、面向方面编程)。其实就是面向特定方法编程。

场景:

案例部分功能运行较慢,定位执行耗时较长的业务方法,此时需要统计每一个业务方法的执行耗时

 核心概念

通知类型

@PointCut

 通知顺序

当有多个切面的切入点都匹配到了目标方法,目标方法运行时,多个通知方法都会被执行。

切入点表达式

execution

execution主要根据方法的返回值、包名、类名、方法名、方法参数等信息来匹配,语法为

execution(访问修饰符? 返回值  包名.类名.?方法名(方法参数) throws 异常?)

其中带?的表示可以省略的部分
访问修饰符:可省略(比如:public、protected)
包名.类名:可省略
throws 异常:可省略(注意是方法上声明抛出的异常,不是实际抛出的异常)

 注意事项:

根据业务需要,可以使用且(&&)、或(||)、非(!)来组合比较复杂的切入点表达式

 @annotation

@annotation切入点表达式,用于匹配标识有特定注解的方法。

@annotation(com.ithema.anno.Log)

连接点

在spring中用JoinPoint抽象了连接点, 用它可以获得方法执行时的相关信息,如目标类名、方法名、方法参数等。

对于@Around通知,获取连接点信息只能使用ProceedingJoinPoint

对于其他四种通知,获取连接点信息只能使用JoinPoint,他是ProceedingJoinPoint的父类型

springboot原理

配置优先级

springboot中支持三种格式的配置文件:

springboot除了支持配置文件属性配置,还支持Java系统属性命令行参数的方式进行属性配置。

 优先级(低-->高)

  • application.yaml(忽略)
  • application.yml
  • application.properties
  • java系统属性(-Dxxx=xxx)
  • 命令行参数(--xxx=xxx)

Bean管理

获取bean

默认情况下,spring项目启动时,会把bean都创建好放在IOC容器中,如果想要主动获取这些bean,可以通过如下方式:

bean的作用域

Spring支持五种作用域,后三种在web环境才生效

可以通过@Scope注解来进行配置作用域:

 注意事项

  • 默认singleton的bean,在容器启动时被创建,可以使用@Lazy注解来延迟初始化(延迟到第一次使用时)。
  • prototype的bean,每一次使用该bean的时候都会创建一个新的实例。
  • 实际开发当中,绝大部分的bean是单列的,也就是说绝大部分bean不需要配置scope属性

第三方bean

  • 如果要管理的bean对象来自于第三方(不是自定义的),是无法用@Component及衍生注解声明bean的,就需要用@Bean 注解
  • 若要管理的第三方bean对象,建议对这些bean进行集中分类配置,可以通过@Configuration注解声明一个配置类。

 

 注意事项:

  •  通过@Bean注解的name/value属性指定bean名称,如果未指定,默认是方法名
  • 如果第三方bean需要依赖其他bean对象,直接在bean定义方法中设置形参即可,容器会根据类型自动装配。

springboot原理

起步依赖

自动配置

springboot的自动配置就是当spring容器启动后,一些配置类、bean对象就自动存入到了IOC容器当中,不需要我们手动去声明,从而简化了开发,省去了繁琐的配置操作。

自动配置原理

方案一:@ComponentScan组件扫描

方案二:@Import导入。使用@Import导入的类会被Spring加载到IOC容器中,导入形式主要有以下几种:

  • 导入 普通类
  • 导入 配置类
  • 导入 ImportSelector 接口实现类
  • @EnableXxxx注解,封装@Import注解

源码跟踪

@SpringBootApplication

该注解标识在SpringBoot工程引导类上,是SpringBoot中最最最重要的注解该注解由三个部分组成:

  • @SpringBootConfiguration:该注解与@Configuration注解作用相同,用来声明当前也是一个配置类。
  • @ComponentScan:组件扫描,默认扫描当前引导类所在包及其子包。
  • @EnableAutoConfiguration:SpringBoot实现自动化配置的核心注解。

@Conditional

作用:按照一定的条件进行判断,在满足给定条件后才会注册对应的bean对象到Spring IOC容器中

位置:方法、类

@Condition本身是一个父注解,派生出大量的子注解:

  • @ConditionalOnClass:判断环境中是否有对应字节码文件,才能注册bean到IOC容器。
  • @ConditionalOnMissingBean:判断环境中没有对应的bean(类型或名称),才注册bean到IOC容器。
  • @ConditionalOnProperty:判断配置文件中有对应属性和值,才注册bean到IOC容器。

maven高级

分模块设计与开发

为什么?将项目按照功能拆分成若干个子模块,方便项目的管理维护、扩展,也方便模块间的互相调用,资源共享。

注意事项

分模块设计需要先针对模块功能进行设计,在进行编码。不会先将工程开发完毕,然后进行拆分

继承与聚合

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值