1.追根溯源,servlet是啥,tomcat是啥,maven是啥;
2.前后端开发模式,mvc,mvvc,service层的事务;
3.maven对项目全生命周期的管理,打包jar包和运行;
4.springBoot项目的搭建,pom文件,项目结构,项目环境;
5.Druid连接数据库,管理连接,springBootApplication的exclude;
6.banner.text的使用,比较好玩;
7.单元测试和controller的接口测试;
8.排除tomcat,使用netty或jetty,以及两者的区别;
Maven 翻译为"专家"、“内行”,是 Apache 下的一个纯 Java 开发的开源项目。基于项目对象模型(缩写:POM)概念,Maven利用一个中央信息片断能管理一个项目的构建、报告和文档等步骤。
https://maven.apache.org/
Spring Boot Reference Documentation
https://spring.io/projects/spring-boot#overview
https://docs.spring.io/spring-boot/docs/2.7.12/reference/htmlsingle/#legal
https://www.bootschool.net/ascii-art/search
Servlet = Service + Applet,表示小服务程序;服务端可运行的java代码
Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。
Servlet 的命名可以看出 sun 命名的特点,如 Applet 表示小应用程序;Scriptlet = Script + Applet,表示小脚本程序;同样 Servlet = Service + Applet,表示小服务程序。
服务端可运行的java代码
servlet 是运行在 Web 服务器中的小型 Java 程序(即:服务器端的小应用程序)。servlet 通常通过 HTTP(超文本传输协议)接收和响应来自 Web 客户端的请求。servlet实例是由web服务器(tomcat)创建的,它是单例多线程的。单例是指servlet的实例只有一个,多线程是指每次客户端的请求,web服务器都会从线程池中分配一个工作线程去执行servlet的service()方法。
The Jakarta EE platform is the evolution of the Java EE platform. Tomcat 10 and later implement specifications developed as part of Jakarta EE. Tomcat 9 and earlier implement specifications developed as part of Java EE.
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。
分层架构:MVC(三层架构)
MVC 模式代表 Model-View-Controller(模型-视图-控制器) 模式。这种模式用于应用程序的分层开发。
以登陆为例:
spring+mybatis+sql的项目结构
后续改进的地方:
数据库的blob类型是一种用于存储二进制数据的数据类型。Blob(Binary Large Object)可以存储任意类型的数据,包括图像、音频、视频、文档等。在数据库中,Blob类型通常用于存储大型的二进制数据,例如图片或文件。Blob类型的数据可以通过数据库的API或查询语言进行读取和写入操作。
MVVC是一种软件架构模式,它是Model-View-ViewModel的缩写。MVVC模式是在MVC(Model-View-Controller)模式的基础上演化而来的。
在MVVC模式中,应用程序被分为三个主要部分:
MVVC模式的优点包括:
可以看出,用户输入信息,到Controller,然后反馈到ViewModel,它与View之间采用双向绑定。
同步:同时,填入若干数据,点击submit提交,之前的数据就没了,页面停在此处,等待后端的响应;
异步:不同时,Ajax异步的方式,比如边看视频边评论;
Java网络开发(Asynchronous异步)—— 从 Jsp 到 Ajax 的 axios 到 vue & 同步请求 到 异步请求
异步 JavaScript 和 XML,或 Ajax 本身不是一种技术,而是一种将一些现有技术结合起来使用的方法,包括:HTML 或 XHTML、CSS、JavaScript、DOM、XML、XSLT、以及最重要的 XMLHttpRequest 对象。当使用结合了这些技术的 Ajax 模型以后,网页应用能够快速地将增量更新呈现在用户界面上,而不需要重载(刷新)整个页面。这使得程序能够更快地回应用户的操作。
尽管 Ajax 中的 X 代表 XML,但是 JSON 才是首选,因为它更加轻量,而且是用 JavaScript 编写的。在 Ajax 模型中,JSON 和 XML 都被用来包装信息。
@Controller @Service @Repository @Configuration @ Component 表示在spring的容器中
@RequestMapping
幂等性
事务管理@Transactional
什么是事务?
多条SQL,一次执行,要么都成功,要么都失败,要可以回滚
事务四大特性有
原子性:事务下的操作要么全部成功,要么全部回滚
一致性:事务前后数据库都要处于一致状态(转账前后两个账户的总金额一致)
持久性:事务对数据的修改是持久的(即使数据库文件损坏也可通过日志等恢复)
隔离性:多事务并发访问时可能会造成数据安全问题,需要把事务隔离起来(加锁)
事务的特性:
隔离性
原子性:不能再分割
int a = 0;
a++; 不是原子性的
之前的线程过来看见的a是1,然后计算a=a+1,结果还没有返回,此时第二个线程过来,看见的还是1,此时,就会有两个2;
a–:不是原子的,比如买东西本来限量有100,就会有其中的1个卖给了两个2人,
Maven 翻译为"专家"、“内行”,是 Apache 下的一个纯 Java 开发的开源项目。基于项目对象模型(缩写:POM)概念,Maven利用一个中央信息片断能管理一个项目的构建、报告和文档等步骤。
Maven 是一个项目管理工具,可以对 Java 项目进行构建、依赖管理。
Maven 也可被用于构建和管理各种项目,例如 C#,Ruby,Scala 和其他语言编写的项目。Maven 曾是 Jakarta 项目的子项目,现为由 Apache 软件基金会主持的独立 Apache 项目。
Maven 构建生命周期定义了一个项目构建跟发布的过程。
一个典型的 Maven 构建(build)生命周期是由以下几个阶段的序列组成的:
阶段 | 处理 | 描述 |
---|---|---|
验证 validate | 验证项目 | 验证项目是否正确且所有必须信息是可用的 |
编译 compile | 执行编译 | 源代码编译在此阶段完成 |
测试 Test | 测试 | 使用适当的单元测试框架(例如JUnit)运行测试。 |
包装 package | 打包 | 创建JAR/WAR包如在 pom.xml 中定义提及的包 |
检查 verify | 检查 | 对集成测试的结果进行检查,以保证质量达标 |
安装 install | 安装 | 安装打包的项目到本地仓库,以供其他项目使用 |
部署 deploy | 部署 | 拷贝最终的工程包到远程仓库中,以共享给其他开发人员和工程 |
clean清理target里面的内容,compile重新编译;
<build>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
plugin>
plugins>
build>
直接运行一个jar包
java -jar springboot-hello-1.0-SNAPSHOT.jar
Spring Boot Reference Documentation
完整的pom文件
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0modelVersion>
<groupId>com.tianju.bmgroupId>
<artifactId>book-mall-v1.0artifactId>
<version>1.0-SNAPSHOTversion>
<packaging>jarpackaging>
<description>在线买书v1.0版本description>
<properties>
<maven.compiler.source>8maven.compiler.source>
<maven.compiler.target>8maven.compiler.target>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
<project.druid.version>1.2.18project.druid.version>
<project.mybatis.version>2.3.1project.mybatis.version>
<project.mybaitsPlus.version>3.5.3.1project.mybaitsPlus.version>
<project.knife.version>4.0.0project.knife.version>
properties>
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.6.13version>
parent>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
dependency>
<dependency>
<groupId>com.alibabagroupId>
<artifactId>druid-spring-boot-starterartifactId>
<version>${project.druid.version}version>
dependency>
<dependency>
<groupId>org.mybatis.spring.bootgroupId>
<artifactId>mybatis-spring-boot-starterartifactId>
<version>${project.mybatis.version}version>
dependency>
<dependency>
<groupId>com.baomidougroupId>
<artifactId>mybatis-plus-boot-starterartifactId>
<version>${project.mybaitsPlus.version}version>
dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
dependency>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.12version>
<scope>testscope>
dependency>
<dependency>
<groupId>com.baomidougroupId>
<artifactId>mybatis-plus-boot-starterartifactId>
<version>${project.mybaitsPlus.version}version>
dependency>
<dependency>
<groupId>com.github.xiaoymingroupId>
<artifactId>knife4j-openapi2-spring-boot-starterartifactId>
<version>${project.knife.version}version>
dependency>
dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
plugin>
plugins>
build>
project>
项目打包成jar包,并且存到私服,之后就可以在depenency里面引入
存到私服里面就长这样
静态资源用NGNIX反向代理
缓存问题Redis,请求数据库
MQ中间件,消峰,
解耦,另外的服务器MQ解耦
查询的效率问题,模糊的智能检索,ES,也是缓存,全文检索
MySQL的主从,多个数据库,分表分库,主从分离,负载均衡
https://spring.io/projects/spring-boot#overview
Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications that you can “just run”.
We take an opinionated view of the Spring platform and third-party libraries so you can get started with minimum fuss. Most Spring Boot applications need minimal Spring configuration.
If you’re looking for information about a specific version, or instructions about how to upgrade from an earlier release, check out the project release notes section on our wiki.
Features
项目开发过程中,为什么要使用XML文件?
软件解耦,----> 使用注解代替XML文件,@ ----> 注解的底层用的是java的反射
https://docs.spring.io/spring-boot/docs/2.7.12/reference/htmlsingle/#legal
https://maven.apache.org/
Apache Maven is a software project management and comprehension tool. Based on the concept of a project object model (POM), Maven can manage a project’s build, reporting and documentation from a central piece of information.
项目的全周期管理工具:
- 创建
- 仓库
- 编译
- 运行
- 打包
- 部署
- 测试
竞争对手:Gradle:Android 这个是java写的
maven是啥?
https://mvnrepository.com/
<dependency>
<groupId>com.alibabagroupId>
<artifactId>druid-spring-boot-starterartifactId>
<version>1.2.9version>
dependency>
第三方库
Apache Druid是一个实时分析型数据库,旨在对大型数据集进行快速的查间分析('QLAP"查间)。Druid最常被当做数据库来用以支持实时摄取、高性能查问和高稳定运行的应用场景,同时,Du也通常被用来助力分析型应用的图形化界面,或者当做需要快速聚合的高并发后端API,Druid最适合应用于面向事件类型的数据。
properties是干啥的:记录依赖的版本号,使用${引入版本}
好处:可以直接在这里还版本号,就不用从下面找:
package com.tianju.springboot;
import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
@SpringBootApplication(
exclude = {
// 排除掉mybatis相关配置的自动装载 @EnableAutoConfiguration
DruidDataSourceAutoConfigure.class,
DataSourceAutoConfiguration.class}
)
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class);
}
}
以前是每次连接,都建立,连接完就断开;
现在是创建多个数据源,用完后不是断开,是把连接放回到连接池里面;
server:
port: 9090
# 1.连接数据库——对应之前 xml文件的数据库
spring:
datasource:
druid:
url: druid.url=jdbc:mysql://127.0.0.1:3306/community?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
username: root
password: 123
https://www.bootschool.net/ascii-art/search
|\__/,| (`\
_.|o o |_ ) )
-(((---(((--------
server:
port: 9090
# 1.连接数据库——对应之前 xml文件的数据库
spring:
# 启动时的图标
banner:
charset: utf-8
location: classpath:./banner.txt
clean清理target里面的内容,compile重新编译;
(1)引入maven插件
<build>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
plugin>
plugins>
build>
(2)打包jar包和使用
直接运行一个jar包
java -jar springboot-hello-1.0-SNAPSHOT.jar
导包
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
dependency>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.12version>
<scope>testscope>
dependency>
配置yml文件
server:
port: 9090
# 1.连接数据库——对应之前 xml文件的数据库
spring:
# 启动时的图标
banner:
charset: utf-8
location: classpath:./banner.txt
datasource:
druid:
# type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/mybatis?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
username: root
password: 123
mybatis:
# 给所有的实体类起别名
type-aliases-package: com.tianju.springboot.entity
# 扫描mapper的地方
mapper-locations: classpath:/mapper/*Mapper.xml
configuration:
# 开启日志,可以看到SQL语句
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
进行测试
package com.tianju.springboot.service.impl;
import com.tianju.springboot.service.IEmpService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import static org.junit.Assert.*;
@SpringBootTest
@RunWith(SpringJUnit4ClassRunner.class)
public class EmpServiceImplTest {
@Autowired
private IEmpService empService;
@Test
public void queryAll() {
System.out.println(empService.queryAll());
}
}
生成访问链接
springboot内置服务器默认是tomcat,应为引入的spring-boot-starter-web中依赖了spring-boot-starter-tomcat,当然也可以手动关闭依赖使用别的服务器
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-tomcatartifactId>
exclusion>
exclusions>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-reactor-nettyartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-jettyartifactId>
dependency>
以下参考自:
Netty和Jetty的区别_Trishar的博客-CSDN博客
1.网络通信框架和web容器的区别
2.概念区别
Netty针对Socket
Jetty/Tomcat针对Servlet
3.应用范围上:
4.协议
5.总结
Netty | Jetty | |
---|---|---|
实质 | 网络通信框架NIO | Web容器 |
针对 | Socket | Servlet |
协议 | TCP/IP | HTTP |
应用 | 即时通信 | HTTP服务 |
1.追根溯源,servlet是啥,tomcat是啥,maven是啥;
2.前后端开发模式,mvc,mvvc,service层的事务;
3.maven对项目全生命周期的管理,打包jar包和运行;
4.springBoot项目的搭建,pom文件,项目结构,项目环境;
5.Druid连接数据库,管理连接,springBootApplication的exclude;
6.banner.text的使用,比较好玩;
7.单元测试和controller的接口测试;
8.排除tomcat,使用netty或jetty,以及两者的区别;