前后端分离:

web-process

路线

传统

-> HTML、CSS、JS
-> Ajax
-> jQuery
-> MySQL -> JDBC
-> Servlet -> JSP -> EL & JSTL
-> Cookie、Session
-> Filter
-> Servlet案例
-> Mybatis
-> Spring -> SpringMVC -> SpringBoot

新型

-> HTML、CSS、JS
-> Ajax、Axios
-> Vue、Element
-> 前端工程化、Vue脚手架
-> Maven
-> SpringBoot
-> SpringMVC
-> MySQL -> JDBC、Mybatis
-> Web案例(SpringBoot+SpringMVC)
-> 会话跟踪技术(Cookie、Session、JWT令牌技术)
-> Filter、Interceptor(令牌的统一拦截校验)
-> AOP
-> SpringBoot原理

Maven

Apache 软件基金会,成立于1999年7月,是目前世界上最大的最受欢迎的开源软件基金会,也是一个专门为支持开源项目而生的非盈利性组织。

开源项目:Welcome to The Apache Software Foundation

简介

Apache Maven 是一个项目管理和构建工具,它基于项目对象模型(POM)的概念,通过一小段描述信息来管理项目的构建。

作用:

  1. 方便的依赖管理:jar 包
  2. 统一的项目结构
  3. 标准的项目构建流程
repo-directory

仓库:用于存储资源,管理各种jar包。

  • 本地仓库:自己计算机上的一个目录。

  • 中央仓库:由Maven团队维护的全球唯一的。 仓库地址:https://repo1.maven.org/maven2/

  • 远程仓库(私服):一般由公司团队搭建的私有仓库。

maven-struct

安装

  1. 下载 apache-maven-3.6.1-bin.zip 解压到D盘

  2. 配置本地仓库:

    • 创建本地仓库:在 maven 目录下创建 mvn_repo

    • 修改 conf/settings.xml 中的 <localRepository> 为一个指定目录

      <localRepository>D:\Program Files\apache-maven-3.6.1\mvn_repo</localRepository>

  3. 配置阿里云私服:修改 conf/settings.xml 中的 <mirrors> 标签,为其添加如下子标签

    1
    2
    3
    4
    5
    6
    <mirror>  
    <id>alimaven</id>
    <name>aliyun maven</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
    <mirrorOf>central</mirrorOf>
    </mirror>
  4. 配置环境变量:系统变量中

    • 添加 MAVEN_HOME 为maven的解压目录
    • 将其bin目录加入PATH环境变量:%MAVEN_HOME%\bin
  5. 测试安装成功:命令行输入 mvn -v 显示maven版本和jdk版本

PS:如果需要切换JDK:

  1. 安装JDK,配置 JAVA_HOME 为新jdk目录
  2. 将其bin目录加入PATH环境变量:%JAVA_HOME%\bin并移到最上面(JDK23比JDK11优先级要高)

IDEA 集成

JDK现在改为17了

配置 Maven

new project -> empty project 创建一个空项目 Name:itheima_web_project

File -> Project Strcuture:

  1. Project:
    • SDK:选11
    • language level:选11

当前工程:

选择 IDEA中 File –> Settings

  1. Build,Executions,Deployment设置 ->Build Tools -> Maven:

    • Maven home path:maven的解压目录
    • User setting file:(Override)maven目录中的conf/settings.xml
    • Local repository:(Override)maven目录下的 mvn_repo 仓库 -> Apply
  2. 进入Maven -> Runner:

    配置JRE:JDK11

  3. Build,Executions,Deployment设置 -> Compiler:

    Project bytecode version:11

全局:

File -> cloes project 退出到IDEA初识页面 -> Customize -> All settings

接下来3步和上面的一样

**注意:**每次配置完都到Settings和Project Strcuture看看是否正确

创建 Maven 项目

itheima_web_project 中创建一个模块

  1. File -> new -> module…
  2. 选择 Java -> Build sysem 选择 Maven
  3. 点击Advanced Settings
    • Name:maven-project01 (即ArtifactId)
    • GroupId:com.itheima
    • Location:自己选择一个项目目录

导入 Maven 项目

方式一:选择右侧Maven面板,点击 + 号,选中对应项目的pom.xml文件,双击

方式二:File -> Project Structure -> Modules -> 中间列的左上角 + 号 -> import module -> 选中对应项目的pom.xml文件 -> Apply, OK

Maven 坐标

  • Maven 中的坐标是资源的唯一标识,通过该坐标可以唯一定位资源位置。

  • 使用坐标来定义项目或引入项目中需要的依赖。

组成:

  1. groupId:定义当前Maven项目隶属组织名称(通常是域名反写,例如:com.itheima)
  2. artifactId:定义当前Maven项目名称(通常是模块名称,例如 order-service、goods-service)
  3. version:定义当前项目版本号

依赖管理

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

依赖配置

配置:

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

注意:

如果引入的依赖,在本地仓库不存在,将会连接远程仓库/中央仓库,然后下载依赖。(这个过程会比较耗时,耐心等待)

如果不知道依赖的坐标信息,可以到https://mvnrepository.com/中搜索。

依赖传递

依赖具有传递性:

  1. 直接依赖:在当前项目中通过依赖配置建立的依赖关系

  2. 间接依赖:被依赖的资源如果依赖其他资源,当前项目间接依赖其他资源

dependency-propagation

排除依赖:主动断开依赖的资源,被排除的资源无需指定版本

1
2
3
4
5
6
7
8
9
10
11
<dependency>    
<groupId>com.itheima</groupId>
<artifactId>maven-projectB</artifactId>
<version>1.0-SNAPSHOT</version>
<exclusions>
<exclusion>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</exclusion>
</exclusions>
</dependency>

依赖范围

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

作用范围:

  • 主程序范围有效。(main文件夹范围内)

  • 测试程序范围有效。(test文件夹范围内)

  • 是否参与打包运行。(package指令范围内)

dependency-scope

生命周期

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

Maven中有3套相互独立的生命周期:

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

每套生命周期包含一些阶段(phase),阶段是有顺序的,后面的阶段依赖于前面的阶段

在同一套生命周期中,当运行后面的阶段时,前面的阶段都会运行

maven-cycle

常用生命周期阶段:

  • clean:移除上一次构建生成的文件

  • compile:编译项目源代码

  • test:使用合适的单元测试框架运行测试(junit)

  • package:将编译后的文件打包,如:jar、war等

  • install:安装项目到本地仓库

执行:

  1. IDEA:右侧Maven工具栏,选中双击
  2. 命令行:进入项目目录 mvn cleanmvn compile

HTTP

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

特点:

  1. 基于TCP协议:面向连接,安全
  2. 基于请求-响应模型的:一次请求对应一次响应
  3. HTTP协议是无状态的协议:对于事务处理没有记忆能力。每次请求-响应都是独立的。
    • 缺点:多次请求间不能共享数据。
    • 优点:速度快

HTTP

请求协议

请求数据格式:

request-form

request

响应协议

响应数据格式:

response-form

HTTP响应格式:

response

常用响应状态码:

状态码 英文描述 解释
==200== OK 客户端请求成功,即处理成功,这是我们最想看到的状态码
302 Found 指示所请求的资源已移动到由Location响应头给定的 URL,浏览器会自动重新访问到这个页面
304 Not Modified 告诉客户端,你请求的资源至上次取得后,服务端并未更改,你直接用你本地缓存吧。隐式重定向
400 Bad Request 客户端请求有语法错误,不能被服务器所理解
403 Forbidden 服务器收到请求,但是拒绝提供服务,比如:没有权限访问相关资源
==404== Not Found 请求资源不存在,一般是URL输入有误,或者网站资源被删除了
405 Method Not Allowed 请求方式有误,比如应该用GET请求方式的资源,用了POST
428 Precondition Required 服务器要求有条件的请求,告诉客户端要想访问该资源,必须携带特定的请求头
429 Too Many Requests 指示用户在给定时间内发送了太多请求(“限速”),配合 Retry-After(多长时间后可以请求)响应头一起使用
431 Request Header Fields Too Large 请求头太大,服务器不愿意处理请求,因为它的头部字段太大。请求可以在减少请求头域的大小后重新提交。
==500== Internal Server Error 服务器发生不可预期的错误。服务器出异常了,赶紧看日志去吧
503 Service Unavailable 服务器尚未准备好处理请求,服务器刚刚启动,还未初始化好

状态码大全:https://cloud.tencent.com/developer/chapter/13553

协议解析

一套可复用的软件,可以解析请求、响应协议,转化为响应数据格式返回给我们的Java程序

–> Tomcat

Tomcat

Web服务器:

  • 对HTTP协议操作进行封装,简化web程序开发。

  • 部署web项目,对外提供网上信息浏览服务。

Tomcat:

  • Tomcat是Apache 软件基金会一个核心项目,是一个开源免费的轻量级Web服务器,支持Servlet/JSP少量JavaEE规范
  • Tomcat 也被称为 Web容器、Servlet容器。Servlet程序需要依赖于 Tomcat才能运行

JavaEE:Java Enterprise Edition,Java企业版。指Java企业级开发的技术规范总和。包含13项技术规范:JDBC、JNDI、EJB、RMI、JSP、Servlet、XML、JMS、Java IDL、JTS、JTA、JavaMail、JAF

官网:https://tomcat.apache.org/

基本使用

下载:Apache Tomcat® - Apache Tomcat 11 Software Downloads

安装:直接解压

卸载:直接删除目录

启动:双击 bin\startup.bat

控制台中文乱码:修改conf/ logging.properties

1
2
3
java.util.logging.ConsoleHandler.level = FINE
java.util.logging.ConsoleHandler.formatter = org.apache.juli.OneLineFormatter
java.util.logging.ConsoleHandler.encoding = UTF-8 // 改为GBK

关闭:

  1. Ctrl+C
  2. 直接关闭窗口
  3. 双击bin\shutdown.bat

更改端口号:conf/server.xml 更改port

1
2
3
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />

部署项目:将项目部署到 webapps 目录下

SpringBoot 内嵌

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

springboot-tomcat

请求

BS

Postman:一款功能强大的网页调试与发送网页HTTP请求的Chrome插件

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

简单参数

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

1
2
3
4
5
6
7
8
9
@RequestMapping("/simpleParam")
public String simpleParam(HttpServletRequest request) {
String name = request.getParameter("name");
String ageStr = request.getParameter("age");

int age = Integer.parseInt(ageStr);
System.out.println(name + ":" + age);
return "OK";
}

**SpringBoot 方式:**参数名与形参变量名相同,定义形参即可接收参数

1
2
3
4
@RequestMapping("/simpleParam")
public String simpleParam(String name , Integer age) { System.out.println(name+" : "+age);
return "OK";
}

**形参名称与请求参数名称不匹配:**使用 @RequestParam 完成映射

1
2
3
4
5
@RequestMapping("/simpleParam")
public String simpleParam(@RequestParam(name = "name", required = false) String username, Integer age) {
System.out.println(username + ":" + age);
return "OK";
}

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

实体参数

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

simple-pojo

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

complex-pojo

注意:pojo/User,pojo/Address 中都要 ctrl+insert 定义 Getter(),Setter(),toString() 方法

数组集合参数

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

list-pojo

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

list-pojo

日期参数

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

datetime-pojo

JSON 参数

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

json-pojo

路径参数

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

path-pojo

响应

ResponseBody: 原始,不推荐

reponsebody

**统一响应:**推荐

result

分层解耦

三层架构

3struct

3-struct

3sturct2

分层、解耦

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

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

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

decoupling

IOC、DI

  • Service层 及 Dao层的实现类,交给IOC容器管理。

    IOC1

  • 为Controller及Service注入运行时,依赖的对象

    DI1

  • 运行测试。

IOC

Bean 的声明:

bean-declare

Bean 组件扫描:

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

DI

Bean 注入

DI2

依赖注入的注解:

  • @Autowired:默认按照类型自动装配。
  • 如果同类型的bean存在多个:
    • @Primary
    • @Autowired + @Qualifier(“bean的名称”)
    • @Resource(name=”bean的名称”)

@Resource 与 @Autowired区别:

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