Java Web学习笔记
Springboot 和 Spring MVC区别
1、Spring MVC 提供了一种轻度耦合的方式来开发web应用,属于Spring的一个模块,是web框架;项目中实际运行的代码
2、Spring Boot实现了自动配置,降低了项目搭建的复杂度;只是配置工具、整合工具、辅助工具
综上:Spring是一个“引擎”;Spring MVC是基于Spring 的一个MVC框架;Spring Boot是基于Spring4的条件注册的一套快速开发整合包
文章目录
- Java Web学习笔记
- Springboot 和 Spring MVC区别
- Java Web学习路线:
- 1、计算机基础
- (1)TCP/IP协议
- (2)进程、线程
- (3)计算机底层原理
- (4)Linux命令行
- $\textcolor{Purple}{关机和重启:}$
- $\textcolor{Purple}{帮助命令:}$
- $\textcolor{Purple}{目录切换:}$
- $\textcolor{Purple}{目录查看:}$
- $\textcolor{Purple}{目录的增删查改:}$
- $\textcolor{Purple}{文件的增删查改:}$
- $\textcolor{Purple}{压缩文件操作:}$
- $\textcolor{Purple}{查找命令:}$
- $\textcolor{Purple}{su、sudo:}$
- $\textcolor{Purple}{系统服务:}$
- $\textcolor{Purple}{其他命令:}$
- 2、Java基础
- 3、SSM框架 (SpringBoot拓展看Java后端笔记)
- 4、数据库
- 5、前端
- 6、消息中间件
- 7、RPC框架
- 8、Java后端
- 9、工具
Java Web学习路线:
Java Web,是用Java技术来解决相关或联网领域的技术总和。web包括:web服务器换和web客户端两部分。Java在客户端的应用有java applet,但是使用的较少,Java在服务器端的应用就比较丰富,例如:Servlet,JSP和第三方框架等。所以总体来说,Java Web主要实在服务器端的应用。在B/S架构中Java语言来编写Server中的内容以及数据库的搭建和数据的存储,使Server能与browser进行通信。
项目开发主要采用前后端分离,核心思想是前端html页面通过ajax调用后端的restuful API接口并使用JSON数据进行交互
单页面应该(spa)只有一张页面,用户与应用程序交互仅动态更新页面web应用程序
1、计算机基础
(1)TCP/IP协议
- 底层通信协议
- 很多消息中间件遵循的协议就是基于该协议创建的,eg:RabbitMQ遵循的AMQP协议
(2)进程、线程
- 进程是系统进行资源分配和调度的最基本单元
- 线程是进程的一部分
- 一个进程中可以有多个线程,多个线程共享进程的全部资源
(3)计算机底层原理
(4)Linux命令行
关 机 和 重 启 : \textcolor{Purple}{关机和重启:} 关机和重启:
shutdown -h now //立即关机
shutdown -h 5 //5分钟后关机
poweroff //立即关机
shutdown -r now //立即重启
shutdown -r 5 //5分钟后重启
reboot //立即重启
logout //注销
帮 助 命 令 : \textcolor{Purple}{帮助命令:} 帮助命令:
- help命令用于显示shell内部的帮助信息,对于外部命令的帮助信息只能使用man或info命令查看;
- man命令查看Linux中的指令帮助、配置文件帮助和编程帮助等信息,比help信息更详细;
- info指令是man指令的详细内容
shutdown --help //查询关机命令使用方法
inconfig --help //查看网卡信息
注:一般任何命令后加了“--help”执行都会显示出这个命令的使用方法,包括参数的含义
man shutdown //查看关机命令使用方法
注:man shutdown打开命令说明书后,使用按键q退出
目 录 切 换 : \textcolor{Purple}{目录切换:} 目录切换:
cd/ //切换到根目录
cd/usr //切换到根目录下的usr目录
cd~ //切换到home目录
cd- //切换到上次访问目录
目 录 查 看 : \textcolor{Purple}{目录查看:} 目录查看:
ls //查看当前目录下的所有目录和文件
ls -a //查看当前目录下的所有目录和文件(包括隐藏文件)
ls -l 或 ls ll //列表查看当前目录下的所有目录和文件(列表查看,显示更多信息)
ls /dr //查看当前目录下的所有目录和文件 eg:ls /usr
目 录 的 增 删 查 改 : \textcolor{Purple}{目录的增删查改:} 目录的增删查改:
- mkdir【增】
- rm [-rf] 【删】:可删除文件或目录
- find 【查】
- mv 和 cp 【改】
mkdir aaa //在当前目录下创建一个名为aaa的目录
mkdir /usr/aaa //在指定目录下创建一个名为aaa的目录
rm -f aaa //递归删除当前目录下的aaa目录
rm -rf aaa //递归删除当前目录下的aaa目录(不询问)
rm -rf* //将当前目录下的所有目录和文件全部删除
find/目录/参数/文件名称 //查找目录或文件
mv 当前目录名称 新目录名称 //将当前目录改为新目录(重命名)eg:mv aaa bbb将aaa改为bbb
mv 目录名称 目录新位置 //目录剪切
cp -r 目录名称 目录拷贝目标位置 //目录拷贝
文 件 的 增 删 查 改 : \textcolor{Purple}{文件的增删查改:} 文件的增删查改:
- touch 【增】
- rm -rf 【删】
- cat或more或less或tail 【查】
- vi或vim【改】
touch aa.txt //在当前目录中创建一个名为aa.txt的文件
rm -rf aa //删除文件
cat 文件或文件路径 //从第一行显示文件内容
tac 文件或文件路径 //从最后一行显示文件内容
more 文件名 //一页一页翻动文件,百分比显示
less 文件名 //可以往前翻动文件
tail -n 数字 文件名 //指定行数或者动态查看,只查看文件最后【数字】行
vi或vim 文件名 //打开文件 → 按键:i/o/a进入编辑模式
==注:==基本上vi分为三种状态:
1)命令行模式[command mode]:控制屏幕光标移动,字符、字或行的查找、移动复制某区段及进入Insert mode下,或者到last line mode。
[1]控制光标移动:
↑
,↓
-[2]删除当前行:
dd
-[3]查找:
/字符
[4]进入编辑模式:
i
,o
,a
[5]进入底行模式:
:
2)编辑模式[Insert mode]:在此模式下,可以做文字输入,按ESC
键可回到命令行模式。
3)底行模式[last line mode]:将文件保存或者退出vi,也可以设置编辑环境,eg:寻找字符串、列出行号等。
- [1]退出编辑:
:q
- [2]强制退出:
:q!
- [3]保存并退出:
:wq
压 缩 文 件 操 作 : \textcolor{Purple}{压缩文件操作:} 压缩文件操作:
- Windows的压缩文件扩展名:
文件名.zip
或文件名.rar
- Linux的打包文件:
文件名.tar
- Linux的压缩文件:
文件名.gz
- Linux的打包并压缩文件:
文件名.tar.gz
tar [-zcvf] 打包压缩后的文件名 需要打包的文件 //eg:tar -zcvd aaa.tar aba.txt
tar [-zxvf] 需解压的压缩文件名 //eg:tar -zxvf aaa.tar
注释:
z:调用gzip压缩命令进行压缩
x:代表解压
c:打包文件
v:显示运行过程
f:指定文件名
查 找 命 令 : \textcolor{Purple}{查找命令:} 查找命令:
ps -ef | grep sshd //查找指定ssh服务进程
ps -ef | grep sshd | grep -v grep //查找指定服务进程,排除grep本身
ps -ef | grep sshd -c //查找指定进程个数
find . -name "*.log" -ls //在当前目录查找以`.log` 结尾的文件,并显示详细信息
find . type f -name ".log" //查找当前目录,以``.log`结尾的普通文件
find /root/ -perm 600 //查找/root/目录下权限为600的文件
find . type d | sort //查找当前所有目录并排序
find . -size +100M //查找当前目录大于100M的文件
updatedb
locate /etc/sh //搜索etc目录下所有以sh开头的文件
locate pwd //查找好pwd相关的所有文件
whereis ls //将和ls文件相关的文件全都查找出来 定位可执行文件、源代码文件、帮助文件在文件系统中的位置
which pwd //查找pwd命令所在的路径 在path变量指定的路径中,搜索某个系统命令位置,并返回第一个搜索结果
which java //查找path中java的路径
s u 、 s u d o : \textcolor{Purple}{su、sudo:} su、sudo:
- su 用于用户之间的切换,但是切换前的用户依然保持登录状态。如果是root向普通或虚拟用户切换不需要密码,反正普通用户切换到其他任何用户都需要密码验证(缺点:如果某个用户需要使用root权限,则必须将root密码告诉此用户)。
su test //切换到test用户,但是路径还是/root目录
su -test //切换到test用户,但是路径变为/home/test
su : //切换到root用户,但是路径还是原来的路径
su - : //切换到root用户,并且路径也为/root
vi /etc/sudoer 或 visudo
- sudo 是为所有想使用root权限的普通用户设计,可以让普通用户具有临时使用root权限的权利,仅需输入自己账户的密码即可。
系 统 服 务 : \textcolor{Purple}{系统服务:} 系统服务:
service iptables status //查看iptables服务状态
service iptables start //开启iptables服务
service iptables stop //停止iptables服务
service iptables restart //重启iptables服务
chkconfig iptables off //关闭iptables服务的开机自启动
chkconfig iptables on //开启iptables服务的开机自启动
其 他 命 令 : \textcolor{Purple}{其他命令:} 其他命令:
pwd //查看当前目录路径
ps -ef //查看所有正在运行的进程
kill pid 或 kill -9 pid //结束进程
inconfig 或 inconfig | more //查看网卡信息
ping ip //查看与某台机器的连接情况
netstat -an //查看当前系统的端口
netstat -an | grep 8080 //查看指定端口
setup //配置网络
service network restart //重启网络
su - 用户名 //切换用户
chkconfig iptables off //关闭防火墙
Ctrl l //清屏
2、Java基础
(1)三大特性:封装(属性私有化),继承(代码复用),多态(接口+抽象 interface+abstruct)
(2)集合:List列表,Map键值对映射,Set(也是列表,只是列表内的数据不能有重复)
-
List列表
- List是一个接口(继承了Collection接口):
public interface List<E> extends Collection<E>{...}
- Java遍历List集合的4种方式
public class Test { public static void main(String[] args) { // 循环遍历List的4中方法 List<String> strList = new ArrayList<>(); strList.add("aaa"); strList.add("bbb"); strList.add("ccc"); // 1. 普通遍历方式 for (int i = 0; i < strList.size(); i++) { System.out.println(strList.get(i)); } // 2.增强的for循环 for (String str : strList) { System.out.println(str); } // 3. 使用Iterator迭代器 Iterator<String> it = strList.iterator(); while (it.hasNext()) { String str = (String) it.next(); System.out.println(str); } // 4. java8 Lambda方式 // strList.forEach(System.out::println);//和下面的写法等价 strList.forEach(str -> { System.out.println(str); }); } }
- LinkedList
-
Set列表
-
Map列表
(3)并发:前期简单过一下线程和锁,后面再继续深入
(4)I/O:文件I/O
(5)数据结构+算法:可以专门去Leecode网站刷一刷
(6)三大框架:Struts、Hibernate、Spring
注: ①java中的TODO用法:类似于一个标签,标记需要处理或完成的任务【设置任务标签:Window→preference→java→complier→task tags】
代码里面加入//FIXME 表示优先级别比较高,需要处理的缺陷问题的任务
代码里面加入//XXX 表示虽然任务已经完成但是还需要优化处理的任务
代码里面加入//DONE表示这个任务已经处理完了,其实可以删除这个标签了
在【Windows→show View→Tasks】中看已查看标记的任务
推荐书籍:Java书单-核心篇
3、SSM框架 (SpringBoot拓展看Java后端笔记)
属于web的核心,Spring + Spring MVC + Mybatis
i、Spring
Spring 是Java EE轻量级开源框架,用于简化Java企业级应用的开发难度好开发周期,Spring现在用的不多(xml配置比较繁琐)。推荐Spring Boot,但是Spring核心理念一样,两个核心理念一样,DI(依赖注入)和AOP(面向切面编程);Bean的生命周期;IOC(控制反转)
==注:==DI(依赖注入)其实是一种关系模式,存在在IoC容器中,IoC根据其依赖关系创建对象。
Sping项目结构
Spring体系结构
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rQCiKi1B-1644819433065)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]
1)Data Access/Integration(数据访问/集成)
包括JDBC、ORM、OXM、JMS和Transactions模块
- JDBC模块:提供了一个JDBC 的样例模板
- ORM模块:“对象—关系”映射框架无缝集成的API,包括JPA、JPO、Hibernate和Mybatis
- OXM模块:将Java对象映射成XML数据,或将XML数据映射成Java对象
- JMS模块:异步通信
- Transactions事务模块:支持编程和声明式事务管理
2)Web模块
包括Web、Servlet、WebSocket和Portlet组件
- Web模块:
- Servlet模块:提供Spring MVC Web
3)Core Container(Spring 的核心容器)
提Beans模块、Core核心模块、Context上下文模块和SpEL表达式模块组成
- 提供了框架的基础部分,包括控制反转和依赖注入
- 封装Spring框架的底层部分,包括资源访问、类型转换及一些常用工具类
- 接口
- 支持访问和修改属性值,方法调用,支持访问及修改数组
Springd项目结构和SpringBoot基本结构相似
控制反转(IoC)——容器
管理所有Java对象的实例化和初始化,降低代码之间的耦合度,它类似于Bean工厂,生产出Spring Bean,在Spring框架中有两种类型的IoC容器,分别是BeanFactory
和 ApplicationContext
。
- BeanFactory容器由org.springframework.beans.factory.BeanFactory 接口定义,在加载配置文件时不会立即创建Java对象,只有在程序运行使用时被创建。
- ApplicationContext是BeanFactory接口的子接口,对其拓展
BeanFactory接口与ApplicationContext接口的区别:
BeanFactory接口
1)Spring的原始接口,对原始接口的实现类功能比较单一
2)BeanFactory接口实现类的容器,在每次获得对象时才会创建对象
ApplicationContext接口
1)每次容器启动时就会创建容器中配置的所有对象
2)提供的功能较多
3)从类的路径下加载配置文件:ClassPathXmlApplicationContext
从硬盘的绝对路径下加载配置文件:FileSystemXmlApplication
实 现 I o C 思 想 需 要 D I 做 支 持 \textcolor{red}{实现IoC思想需要DI做支持} 实现IoC思想需要DI做支持
- 该容器管理的对象成为Bean
Spring实例化bean的三种方式
(1)空参数构造【构造器实例化创建】
<beans xmlns:xsi="http://www.w3.org/2001/SMLSchema-instance" xmlns="http://www.springframework.org.schema/beans" xsi:schemLocation>
<!--空参数构造创建-->
<bean name="hello" class="cn.itcats.spring.hello.HelloWorld"></bean>
</beans>
(2)静态工厂创建【即调用静态方法创建】——调用UserFactory类的静态createUser方法创建名为user的对象,放进容器
<bean name="user" class="cn.itcats.UserFactory" factory-method="createUser"></bean>
(3)实例工厂创建【调用非静态方法创建】——需要配置两个bean,因为无法通过类名调用静态方法
<bean name="user2" factory-bean="userFactory" factory-method="createUser"></bean>
<bean name=“userFactory” class=“cn.itcats.UserFactory”></bean>
DI依赖注入
注入方式:1)set方式注入 2)构造方法 3)字段注入
<beans>
<!-- set方式注入--> <!--学生类-->
<bean name="student" class="cn.itcats.spring.domain.Studnet">
<!--值类型注入:为Student对象中名为name属性注入 Carrie 作为值-->
<property name="name" value="Carrie"></property>
<property name="grade" value="90"></property>
<!--引用类型注入:为teacher属性注入下方配置的teacher对象-->
<property name="teacher" ref="teacher"></property>
</bean>
<!--教师类-->
<bean name="teacher" class="cn.itcats.spring.domain.Teacher">
<property name="name" value="Mrs.Zhang"></property>
<property name="className" value="Technology"></property>
</bean>
</beans>
<!--使用构造函数注入-->
<bean name="student2" class="cn.itcats.spring.domain.Student">
<!--name属性:构造函数的参数名称-->
<!--index属性:构造函数的参数索引-->
<!--type属性:构造函数的参数类型-->
<constructor-arg name="name" index="1" type="java.lang.String" value="Carrie"></constructor-arg>
<constructor-arg name="grade" index="0" type="java.lang.Integer" value="65"></constructor-arg>
<constructor-arg name="teacher" index="2" ref="teacher"></constructor-arg>
</bean>
注入类型:1)值类型value注入 2)引用类型ref注入
Spring的三种配置方式
1)基于XML的配置
- spring.XML
2)基于注解的配置
3)基于Java的配置
Spring中的AOP事务
①四大基本特性【ACID】:1)原子性【Atomicity】 2)一致性【Consistency】 3)隔离性【Isolation】 4)持久性【Durability】
②事务分为编程式事务控制和声明式事务控制
编程式事务事务控制【自己手动控制】
JDBC代码:
Conn.setAutoCommit(false); //设置手动控制事务
Hibernate代码:
Session.beginTransaction(); //开启一个事务
声明式事务控制【Spring自身有提供对事务的管理】——常用
1)基于XML方式的声明式事务管理 2)基于注解方式的声明式事务管理
③五大通知类型:1)前置通知 2)环绕通知:控制事务、权限控制 3)后置通知:记录日志[方法已经成功调用] 4)异常通知:异常处理、控制事务 5)最终通知:记录日志
ii、Mybatis:
-
Mybatis,流行的ORM(对象关系映射),将Java对象映射到数据库;基于Java的持久层框架,负责java对象和数据实体之间的映射
Mybatis以SQL语句为核心的不完全的关系型映射框架。消除了所有JDBC代码和参数的手工设置
iii、Spring MVC
- Spring MVC :Web的三层架构:Model(模型->数据库实体对象),View(视图->展示),Contriller(控制器->处理情趣)
推荐书籍:Spring实战(第五版)【Spring概念深入理解】、Spring Boot实战【Spring Boot入门参考】
推荐视频:Spring5-B站-狂神说、Spring Boot2-B站-尚硅谷
4、数据库
Mysql,最流行的关系型数据库之一
- SQL语法
- 事物特性:ACID(Atomicity原子性、Consistency一致性、Isolation隔离性、Durability持久性)
- 索引,主键,外键
Redis,非关系型数据库,高性能的key-value数据库,主要用于缓存
MongoDB,一个文档型的非关系型数据库,数据以JSON格式存储(可嵌套),存储和查询都很方便,减少了Mysql中多表联查的操作
5、前端
前端需要大致接触,不需要向前端开发那么专业
(1)Vue
- vue,是一套自下而上的渐进式JS框架
- 支持模板语法,支持响应式(不用再手动刷新页面,当修改了某个变量,视图会自动刷新)
- 结构化代码,会使html代码变得干净许多
(2)html
- html+css+js:前端基础
-HTML文档结构
1)HTML文档头部<header>
2)HTML文档主体部分<body>
html标记大部分都是成对出现:有开始标记,有结束标记
换行标记:<br>
段落标记:<p>
标题:<hn>
n取整数,n的取值为1-6,随着数字越大,标题字体越小
字体font:<font>
字体加粗:<b>
字体斜体:<i>
字体下划线:<u>
字体删除线:<strike>
下角标:<sub>
上角标:<sup>
-HTML图像标记
<img src = "绝对路径|相对路径" width height></img>
尽可能使用相对路径
-超链接标记
<a href = "目标资源路径" target="_blank"> </a>
或 <a href = "目标资源路径" target="_self"> </a>
超链接有文字超链接,也有图片超链接:在两者之间继续使用
-HTML列表
有序列表<ol>
、无序列表<ul>
列表项:<li>
列表显示效果类型:<ul或ol type = "dise\a\i\circle\square">
-表格标记
表格<table>
:
<body>
<table borer="1">
<caption>表格标题</captionc>
<!--仅出现一次,每一列的第一行为标题,会自动加粗-->
<tr>
<th>标题1</th>
<th>标题2</th>
<th>标题3</th>
</tr>
<!--行数-->
<tr>
<!--列数-->
<td>内容1</td>
<td>内容2</td>
<td>内容3</td>
</tr>
<!--行数-->
<tr>
<!--列数-->
<td>内容4</td>
<td>内容5</td>
<td>内容6</td>
</tr>
</table>
</body>
-表单标记
表单<form>
:
- 文本框(text)、密码框(password)、单选按钮(radio)、复选框(checkbox)、下拉列表(select)、文件上传标记(file)、多行文本(textarea)
- 表单提交方式:
get
默认方式,表单提交的数据会在地址栏显示,提交数据有大小限制:128K;post
表提交的数据不会在地址栏显示,提交数据无大小限制 check
、select
表示被默认选中
<body>
<fieldset>
<legend><h2>新用户注册页面</h2></legend>
<form action="login.html" method="post" onsubmit="return validateForm(this)">
<p>用户账号:<input type="text" name="username" /></p>
<p>用户口令:<input type="password" name="password" /></p>
<p>确认口令:<input type="password" name="confirmpwd" /></p>
<p>真实姓名:<input type="text" name="" /></p>
<p>性 别:
<input type="radio" name="sex" value="male" />男
<input type="radio" name="sex" value="female" />女
<input type="radio" name="sex" value="other" />保密</p>
<p>教育程度:<select name="education">
<option value="0">--请选择教育程度--</option>
<option value="xx">小学</option>
<option value="cz">初中</option>
<option value="gz">高中</option>
<option value="bk">本科</option>
<option value="ss">硕士</option>
<option value="bs">博士</option>
</select></p>
<p>个人爱好:<input type="checkbox" name="hobby" value="trip">旅游
<input type="checkbox" name="hobby" value="music">音乐
<input type="checkbox" name="hobby" value="sports">运动
<input type="checkbox" name="hobby" value="read">阅读
<input type="checkbox" name="hobby" value="game">游戏
</p>
<p>自我介绍:<textarea name="self introduction" cols="50" rows="7" ></textarea></p>
<p align="center"><input type="submit" value="注册" onclick="skip()"> <input type="reset" value="取消">
<form>
</fieldset>
</body>
注: 表的标题在上方居中,图的标题在其下方居中
-HTML框架
框架frameset
:基本组成部分就是frame,当然,frameset是可以嵌套另一个frameset,主要通过frameset将整个网页按照划分多个区域
- 一般情况下,frameset框架不写在
<body>
中
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>显示用户基本信息页面</title>
<style type="text/css">
</style>
</head>
<frameset rows="15%,*">
<frame src="title.html" scrolling="no" />
<frameset cols="20%,*">
<frameset rows="10%,*">
<frame src="welcome.html">
<frame src="click.html" scrolling="no"/>
<frame name="main" src="informantion.html"/>
</frameset>
</frameset>
</frameset>
<body>
<fieldset>
</fieldset>
</body>
</html>
(3)css:层叠样式表
-
CSS有内部样式表和外部样式表两种:
- CSS内部样式表是嵌入在当前页面中,只会对当前的内容进行修饰;
- CSS外部样式表是以引用的方式链接到当前页面或多个页面中,因此,凡是引用该CSS样式的页面,都可以使用
id选择器方式呈现:#tagName id=“tagName”
类选择器:.tagName class=“tagName”
注: 如果要对html已有标记进行修饰,则为可以直接使用该标记作为本央视的tagName
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <style type="text/css"> </<style type="text/css"> a{ font-size: 16px; color: blue; <!--超链接下划线取消--> text-decoration: none; } a:hover{ color: burlywood; text-decoration: none; } </style> </head> <body> <p><a href="http://www.baidu.com" target="main">百度首页</a></p> <p><a href="http://www.163.com">网易首页</a></p> <p><a href="http://www.sina.com.cn">新浪首页</a></p> </body> </html>
(4)js
JS:轻量级编程语言,可插入HTML页面的编程代码
-
node.js:基于Chrome V8引擎的JS运行时,用来构建易于扩展到网络应用;可跨平台、类库较多,单线程,需要在系统配置环境变量path,添加根目录
查 看 n o d e 和 n p m 版 本 : \textcolor{Purple}{查看 node 和 npm 版本:} 查看node和npm版本:
node -v npm -v
运 行 前 端 界 面 : \textcolor{Purple}{运行前端界面:} 运行前端界面:
npm install //安装node模块在本地目录node_modules下 npm run npm run <name>
补充:
npm包管理工具:
node package manager一个一个服务器中存储共享代码,创建者用npm publish将代码提交在registry上,其他人想要使用该代码就运行npm install下载,之后会额外出现在node_moduies目录下 -
BootStrap,很流行的前端框架,AdminLTE后台管理模板
推荐书籍:Vue官网
6、消息中间件
主要用于分布式系统,处理消息的收发
主流的有RabbitMQ ,Kafka,RocketMQ;
只需要学习一两个,但应用场景不一样
**RabbitMQ **主要用在企业内部,适合对数据一致性,可靠性要求高的场景(推荐),基于AMQP协议,高可用、高可靠
**Kafka **主要用在大数据方面,对数据的偶尔丢失,重复是可以容忍,适合目前互联网的大数据业务(推荐),基于发布订阅的容错消息系统
RocketMQ 是阿里基于Kafka的思想设计而成的,适用于高可用、高吞吐量的场景,eg:电商系统
推荐书籍:RabbitMQ 官网(看完前6个章节,对消息队列有大致的思路)
7、RPC框架
全称:Remote Procedure Call,即远程过程调用;
目前市面上流行的RPC框架有Dubbo和SpringCloud,两个最好都学习
- Dubbo是阿里开源的一个项目,只支持Java
- SpringCloud是基于多个组件构成的微服务架构,只支持Java
8、Java后端
-
微服务结构(SpringBoot+Zookeeper+Docker+Jenkins)
Docker架构:类似于轻量级的虚拟机
image(静态定义)、container(镜像运行时的实体)【可以被创建-启动-停止-删除-暂停】、reposition(保存镜像)
(1)SpringBoot学习笔记
Spring Boot的基础结构共三个文件
- src/main/java 程序开发的编写业务程序以及主程序入口
- src/main/resources 存放静态文件和配置文件
- src/test/java 测试程序
搭建一个Spring Boot项目
1)通过访问:https://start.spring.io/
选择构建工具、开发语言以及项目信息;点击GENRATE,它会自动配好信息,生成项目模板,解压后,使用IDEA或Eclipse按照Maven项目的方式导入;
- demain文件夹主要用于实体[Entity]与数据访问层[Repository]
- service层,主要用于业务类代码
- controller层,负责页面访问控制
3)在src/main/resources文件下创建一个Application.java,用于做一些框架配置
4)在pom.xml文件中添加web依赖
<dependencies>
<!--web依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
注: 一般pom.xml文件中默认有两个模块:
- spring-boot-starter:核心模块,包括主动配置支持、日志和yaml
- spring-boot-starter-test:测试模块,包括JUnit、Hamcrest、Mockito
5)在src/main/java的controller目录下添加一个controller.java
package cn.Carrie.Demo.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "Hello Spring Boot!";
}
}
6)启动主入口[maven项目中会自带一个主入口文件]
遇到的问题:无法在主入口启动DemoApplication.java,调试controller.java已成功,说明接口已经连接上,原因为JDK版本不一致,解决办法一将系统中JDK环境变量全部卸载,重新安装。但是由于在pom文件中,java version版本不一致。最后,解决办法:自己在导入项目模板时,java version 的版本过高,与自己所配置的JDK不一致。修改pom文件的版本即可
7)maven项目的基本结构
Spring Boot配置文件优先级
==注:==→优先级指的是配置属性生效的优先级,不是读取文件的优先级;
→所有配置文件都去读取的话,生效属性优先级高的读取的优先级反而低
- 默认位置配置文件的优先级
①–file:./config/
②–file:./
③–classpath:/config/
④–classpath:/
- properties和yml优先级:properties > yml
- 若启动命令带–spring.config.location–,则配置文件从其他地方读取,以上所有属性都会失效
Spring Boot返回Json数据及数据封装
Spring Boot中默认使用的json解析框架是Jackson。而Jackson框架对常用数据类型
Java Web的安全框架
Java Web有两大安全性框架
- Spring Secuirty:认证(who)、授权(你能干什么)、攻击防护(防止伪造身份),创建大量的filter和interceptor来进行请求的验证和拦截,以此来达到安全的效果
- Shiro:Apache下开源,是Java安全框架,可以用来实现身份验证、授权、加密和会话管理
(2)Zookeeper学习笔记
(3)Docker学习笔记
(4)
(5)XM文件头部的xmlns:xsi详解
- xmlns表示默认的命名空间:Namepace【全称:XML Namespace】,可以保证全局唯一性的字符串(直接利用统一资源标识符【URL】)
- xmlns:xsi定义了一个空间命名前缀xsi对应的唯一字符串
http://www.w3.org/2001/XMLSchema-instance
==注:==URI是地址(类似于网络地址),URL是资源信息,URL是URI的一个子集,表示“统一资源定位符”,不仅是唯一标识资源,还提供了定位该资源的信息
(6)Maven开源项目:
-Maven环境配置:
项目 | 要求 |
---|---|
JDK | Maven3.3要求JDK 1.7或以上 |
磁盘 | Maven自身安装需要大约10MB空间 |
内存 | 没有最低要求 |
-Maven POM
POM(Project Object Module)是Maven工程的基本工作单元 ,是一个XML文件,用于描述项目如何构建,申明项目依赖等。执行任务或目标时,Maven会在当前目录中查找POM,读取后,获得所需配置信息,然后执行目标;该文件用于管理:源代码、配置文件、开发者的信息好和角色、问题追踪系统、组织信息、项目授权、项目的url、项目的依赖关系等。在Maven项目中可以没有代码,project可以什么都没有,但必须包含pom.xml文件。
所 有 P O M 文 件 都 需 要 p r o j e c t 元 素 和 四 个 必 须 字 段 : g r o u p I D 、 a r t i f a c t I D 、 v e r s i o n 、 m o d e l V e r s i o n \textcolor{green}{ 所有POM文件都需要project元素和四个必须字段:groupID、artifactID、version 、modelVersion} 所有POM文件都需要project元素和四个必须字段:groupID、artifactID、version、modelVersion
特殊元素进行合并而不是覆盖:dependences、developers、contributors、plugin列表(包括plugin下面的reports)、resources
节点 | 描述 |
---|---|
project | 工程的根标签 |
version | 工程的版本号 |
groupID | 工程组的标识,一般由域和公司名称组成 |
artifactID | 工程的名称,工程的标识 |
modelVersion | 模型版本需要设置为4.0 |
搭建maven项目必须填写groupID和artifictID,这两个统称为坐标。 g r o u p I D \textcolor{cornflowerblue}{groupID} groupID会分成多个段,eg:以两段为例,第一段为域名,域分为org(非营利性组织)、cn(中国)、com(商业组织);第二段为公司名称,类似向Apache公司旗下的Tomcat项目:groupID为org.apache,域为org,公司名称:apache。 a r t i f i c t I D \textcolor{cornflowerblue}{artifictID} artifictID就是所做项目或工程的名称。
<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.0</modelVersion>
<!-- 基本设置 The Basics -->
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
<packaging>...</packaging>
<dependencies>...</dependencies>
<parent>...</parent>
<dependencyManagement>...</dependencyManagement>
<modules>...</modules>
<properties>...</properties>
<!-- 构建过程的设置 Build Settings -->
<build>...</build>
<reporting>...</reporting>
<!-- 项目信息设置 More Project Information -->
<name>...</name>
<description>...</description>
<url>...</url>
<inceptionYear>...</inceptionYear>
<licenses>...</licenses>
<organization>...</organization>
<developers>...</developers>
<contributors>...</contributors>
<!-- 环境设置 Environment Settings -->
<issueManagement>...</issueManagement>
<ciManagement>...</ciManagement>
<mailingLists>...</mailingLists>
<scm>...</scm>
<prerequisites>...</prerequisites>
<repositories>...</repositories>
<pluginRepositories>...</pluginRepositories>
<distributionManagement>...</distributionManagement>
<profiles>...</profiles>
</project>
1.1基本配置(the Basics)
<?xml version="1.0" encoding="UTF-8"?>
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<!--
含义:组织标识,定义了项目属于哪个组,风向标,坐标,或者说若把本项目打包
用途:此名称则是本地仓库中的路径,列如:otowa.user.dao,在M2_REPO目录下,将是: otowa/user/dao目录
命名规范:项目名称,模块,子模块
-->
<groupId>com.sd</groupId>
<!--
含义:项目名称也可以说你所模块名称,定义当面Maven项目在组中唯一的ID
用途:例如:user-dao,在M2_REPO目录下,将是:otowa/user/dao/user-dao目录
命名规范:唯一就好
-->
<artifactId>sd-echarts-datashow</artifactId>
<!--
含义:项目当前的版本号,也就是项目名称
用途:例如:0.0.1-SNAPSHOT,在M2_REPO目录下,将是:otowa/user/dao/user-dao/0.0.1-SNAPSHOT目录
-->
<version>2.0.1-SNAPSHOT</version>
<!-- 打包的格式,可以为:pom , jar , maven-plugin , ejb , war , ear , rar , par -->
<packaging>war</packaging>
<!-- 元素声明了一个对用户更为友好的项目名称 -->
<name>maven</name>
</project>
1.2POM之间的关系——继承、聚合和依赖
1.2.1继承
设项目project A的pom.xml文件
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.tiantian.mavenTest</groupId>
<artifactId>projectA</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
</project>
情况一:有项目project A和project B,且project B与project A的pom.xml文件处于同一个目录下(父子关系),即:project B在project A的子目录下,project B文件中需要有<parent></parent>
<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/maven-v4_0_0.xsd">
<parent>
<groupId>com.tiantian.mavenTest</groupId>
<artifactId>projectA</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.tiantian.mavenTest</groupId>
<artifactId>projectB</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
</project>
情况二:有项目project A和project B,但是两个项目处于同一目录(非父子关系),project B中需要有<parent><relativePath></relativePath></parent>
<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/maven-v4_0_0.xsd">
<parent>
<groupId>com.tiantian.mavenTest</groupId>
<artifactId>projectA</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath>../projectA/pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.tiantian.mavenTest</groupId>
<artifactId>projectB</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
</project>
1.2.2聚合
聚合:在A类中包含可以引用B类(类中的类)是has-a的关系,eg:A类对象中包含许多信息,同时也包含B类的对象;B类自己本身也包含许多信息。
情况一:有项目project A和project B,且project B与project A的pom.xml文件处于同一个目录下(父子关系),即:project B在project A的子目录下,project B中需要有<packing>pom</packing><modules><module>project B</module></modules>
<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.0</modelVersion>
<groupId>com.tiantian.mavenTest</groupId>
<artifactId>projectA</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>projectB</module>
</modules>
</project>
情况二:有项目project A和project B,但是两个项目处于同一目录(非父子关系),project B中需要有<packing>pom</packing><modules><module>../project B</module></modules>
<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.0</modelVersion>
<groupId>com.tiantian.mavenTest</groupId>
<artifactId>projectA</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>../projectB</module>
</modules>
</project>
1.2.3聚合和继承同时存在
有项目project A 和project B,需要将project B继承project A,同时把project B聚合到project A中,此时project A 和project B存在在同一个目录下,project A需要添加<modules><module>../project B</module></modules>
<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.0</modelVersion>
<groupId>com.tiantian.mavenTest</groupId>
<artifactId>projectA</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>../projectB</module>
</modules>
</project>
project B需要新增一个parent元素,即<parent><relativePath>../project A/pom.xml</relativePath></parent>
以及<packing>jar<packing>
<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.0</modelVersion>
<parent>
<groupId>com.tiantian.mavenTest</groupId>
<artifactId>projectA</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath>../projectA/pom.xml</relativePath>
</parent>
<groupId>com.tiantian.mavenTest</groupId>
<artifactId>projectB</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
</project>
1.2.4依赖(重点)
依赖关系列表(dependency list)
项目之间的依赖通过dependences元素下的dependency元素,定义一次dependency元素就是定义一个依赖关系,每一个依赖关系中,需要包含groupId、artifactId和version 三个节点。文件格式为<dependencies><dependency>+groupID+artifictID+version</dependency></dependencies>
<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.0</modelVersion>
<groupId>com.tiantian.mavenTest</groupId>
<artifactId>projectB</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring-boot-starter</artifactId>
<version>${shiro.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--redis高级客户端依赖-->
<dependency>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
</dependency>
</dependencies>
</project>
-Maven构建配置文件
配置文件分为三种类型:项目级【定义在项目的POM文件pom.xml中】,在pom.xml文件中使用activeProfiles或者profiles元素指定,可以通过各种方式触发;用户级【定义在Maven的设置文件中】;全局【定义在Maven全局的设置xml文件中】
注: 配置文件采用的是<profiles>
节点
追求:三高(高并发、高可用、高性能),安全,存储,业务等
9、工具
Navicat,数据库的图形化管理工具
Git,版本管理工具
Eclipse、Intellij IDEA,web,VScode开发工具
把精力放在java基础,设计模式,jvm原理,spring+springmvc原理及源码,linux,mysql事务隔离与锁机制,mongodb,http/tcp,多线程,分布式架构(dubbo,dubbox,spring cloud),弹性计算架构,微服务架构(springboot+zookeeper+docker+jenkins),java性能优化,以及相关的项目管理等等。