第一章 SSM
1.1 JavaEE
1.1.1 Servlet+JSP
1.Tomcat
Web容器:给动态页面提供一个运行的环境
2.Servlet
1)生命周期
init:初始化,Servlet创建之后,执行一次
service:处理用户的请求,每请求一次,执行一次
destroy:销毁,项目关闭时执行一次
2)配置
Web.xml
Servlet
Servlet-name
Servlet-class
Servlet-mapping
Servlet-name
url-pattern
注解
3)HttpServlet类
抽象类->GenericServlet类->Servlet接口
实现doGet和doPost方法
4)Request,Response对象
Request:请求对象->
接收客户端浏览器的数据:url,参数,客户端的信息
获取项目运行的信息:路径,获取Session,ServletContext
请求转发request.getRequestDispatcher(路径).forward(request,response);
Response:响应对象->向客户端返回数据:HTML代码,文件、图片、JSON
设置返回数据的类型setContentType()
获取流getWrite();
重定向:response.sendRedirect(路径);
设置Cookie:AddCookie()
5)请求转发和重定向
区别
操作对象
谁干的:转发是一种服务器的行为,重定向是服务器向客户端浏览器发送302状态码+location,由浏览器再发送一次新的请求,是一种客户端行为
请求次数:转发只有一次请求,只有一对Request和Response对象,request传递数据,重定向会有两次请求,生成两对Request和Response对象,不能使用Request传递数据。
地址栏:转发地址栏不变,重定向会变成转发后的地址。
6)请求类型方式
Get:1)地址栏2)超链接3)表单默认提交4)Ajax、框架默认请求
Post:1)表单的Method设置为post,2)Ajax、框架指定请求方式
Put
Delete
Head
Options
Trace
Get和Post区别
参数传递的方式不同:get是使用?&=,url拼接,post请求头的数据域。
参数的类型:get只能传字符串,post可以传递字符串和二进制
参数的长度:get受url限制,post不受,只要服务器允许可以传很大的数据
安全性:get更不安全,post相对安全。
3.请求保持
1)Cookie
基于客户端浏览器。
将数据保存在浏览器中。
2)Session
基于服务器。
将数据保存在服务器中,默认保存内存
区别
Cookie基于客户端,Session基于服务器的增加服务器的压力
Cookie只能保存字符串,Session可以保存对象
Cookie安全性低,Session安全性高
3)token
基于cookie,保存的数据被加密
分布式
1.1.2 JSP
JSP还是一个Servlet
在Tomcat运行JSP时,翻译成Servlet的Java代码,再编译成class文件,最后再执行。
1.基本语法
1)指令标签
<%@指令%>
page
include静态引入,翻译时将引入页面拷贝到当前页面中
taglib引入自定义标签库JSTL
2)动作标签
forward
include 动态引入,执行时,将引入页面执行结果加入到当前页面中
param传递参数,如同请求参数
3)内嵌Java代码
<%Java代码片段%> 翻译=>service方法中的内容
<%=表达式%> 输入值
<%!声明片段%> 翻译=>servlet下
2.九大内置对象和四大作用域
1)九大内置对象,隐含对象
Request
Response
Session
Application
Page
pageContext
config
out
exception
2)四大作用域
Page
Request
Session
application
3.EL表达式
简化输出
${属性}
${对象.属性}
${集合[下标]}
域对象
requestScope
sessionScope
applicationScope
param
cookie
4.JSTL
JSP的标准标签库
首先引入包
页面中taglib导入JSTL模块
Core:if、foreach、choose、when、otherwise
Fmt:dateFormat
Functions
Xml
sql
1.1.3 Filter
过滤器 登陆过滤器、编码过滤器
进入动态页面(Servlet,jsp)之前,对请求进行过滤的处理(拦截、放行)
init初始化
doFilter:执行过滤
destroy:销毁
配置:
Web.xml
Filter
Filter-name
Filter-class
Filter-mapping
Filter-name
url-pattern
注解
1.1.4 Listener
监听器 监听登录用户的信息
在项目运行时监听request、session、application三个域对象的生命周期,属性变化
六个接口
1.1.5 Ajax
异步请求
JS向服务器发送请求,JS使用(DOM操作)将数据更新到页面中
jQuery的ajax方法
Layui的异步操作,数据表格,上传图片
1.1.6 JavaEE的不爽
1.Servlet中的环境
参数的获取相当频繁
返回数据的方式也很麻烦
2.DBUtil不支持事务
对事务需求
3.Dao层
一些操作依然很复杂
4.实体类
数据库命名规范和Java实体类命名规范不同。
5.JSP也不爽
6.前端技术是最不爽的
HTML、CSS、JS、jQuery、Ajax
框架:简化以上所有的开发流程
1.2SSM
1.2.1 Spring
Spring是一个非常强大的框架,包含20多个子模块
Spring底层有两个核心技术,解耦(松耦合)
1)IoC:依赖倒转
2)AOP:面向切面编程,在不破坏原有代码的基础上(无代码侵入),对功能进行增强。
1.2.2 SpringMVC
Spring中的一个子模块Spring Web MVC
核心是代替Servlet,从而简化Servlet的操作
1.2.3 MyBatis
轻量级的持久层框架
1.3 SpringMVC
1.3.1 SpringMVC的使用
1.添加SpringMVC的依赖
2.在Web.xml中添加前端控制器的配置
3.配置SpringMVC的配置文件
4.编写Controller
1.3.2
核心组件:
1)前端控制器:请求接收,组织剩下的三个组件完成对请求的处理,SpringMVC的大脑。
2)处理器映射器:维护url与处理器之间的映射关系。
3)处理器适配器:执行处理器,
4)视图解析器:渲染视图
运行过程:
1)前端控制器,接收来自客户端的请求。
2)前端控制器调用处理器映射器,根据URL查询处理器
3)处理器映射器,返回查询到的处理器链
4)前端控制器将处理器链交给处理器适配器
5)处理器适配器准备好处理器需要的对象,执行处理器
6)处理器执行完成,返回ModelAndView
7)处理器适配器将ModelAndView返回给前端控制器
8)前端控制器,将ModelAndView交给视图解析器
9)视图解析器将视图进行渲染
10)视图解析器将渲染好的视图返回给前端控制器
11)前端控制器使用Response对象,将视图返回给客户端
1.3.3 处理器
1.返回值
1)没有返回值,默认的视图与url保持一致
2)String
返回值就是视图的名字
如果加了Redirect,就是重定向
3)ModelAndView
数据和视图
4)对象
引入Jackson
将对象转化为JSON字符串,返回
加上@Response
2.参数
1)自动注入来自客户端的参数
客户端的参数名,与处理器的参数名保持一致。
当两个参数的名字不一致的时候,使用RequestParam注解
集合
对象
日期
2)JavaEE的对象
Request
Response
Session
3)SpringMVC的对象
ModelAndView
Model
View
3.注解
1)@Controller
2)@RequestParam
3)@RequestParam
4)@ResponseBody
1.4spring
Java上一代框架SSH
Spring,Structs2,Hibernate(Spring Data JPA)
1.4.1 Spring的使用
1.添加Spring的依赖
2.
1.4.2 IoC
IoC:控制反转,把创建对象交给Spring容器
传统的对象,要使用new的方式进行创建,然后才能使用。
当需要使用对象时,找Spring容器要。这些对象在Spring容器创建时,由Spring通过反射、动态代理的方式进行创建。
DI:依赖注入
IoC基于DI实现的
1.4.3 属性的注入
1.Set方法注入
注入属性时通过调用Bean对象的set方法
2.构造器注入
在创建对象时,调用它的有参构造方法
3.自动注入
使用autowire属性,将注入方式可以设置为byType
1.4.4 注入不同类型的属性
1.注入简单类型
直接设置值
2.集合
1)数组
2)List
3)Set
4)Map
3.类
1)自动注入
2)引用已经存在的
3)直接创建Bean
1.4.5 Web项目中使用Spring
1.导入依赖
2.在Web.xml中配置Spring的监听器。
3.创建Spring的配置文件
4.配置扫描的包
5.在需要放到Spring容器中的类上添加注解
1.4.6 Spring中的常见问题
1.Bean对象的作用域
2.Bean对象的生命周期
3.循环依赖
有一个类A,它有一个B类型的属性b
有一个类B,它有一个A类型的属性a
当创建A类的对象时,需要使用B的对象
当创建B类的对象时,需要使用A的对象
一级缓存:存放完整的对象
二级缓存:存放不完整的Bean对象,属性尚未注入完成的对象
三级缓存:Bean工厂,用于创建Bean对象。
需要一个Bean对象时,先从一级缓存中查找,如果有直接取,如果一级缓存没有,去二级缓存查找,如果有直接取,如果二级缓存也没有,则交给三级缓存创建对象。
4.P标签
只是一种更加简洁的配置方式,调用Set方法。
1.4.7 AOP
AOP:面向切面编程
面向切面编程是对面向对象编程的一种补充,可以实现在不修改原有代码的情况下,对功能进行增强。(无代码侵入)
功能增强的方式有多种:
1)装饰者模式:
二十三种设计模式的一种。
IO流:InputStream-字节输入流,OutputStream-输出字节流,
ObjectInputStream对象输入流,ObjectOutputStream对象输出流。
2)代理模式:
功能在进行增强时,不能拓展新的功能,只能增强原有的功能。
2.1)静态代理
在静态代理的模式下,每一个需要增强的方法,都需要单独添加增强的代码,如果可以让所有的方法统一的增强,使用动态代理
2.2)动态代理
Java中动态代理有两种方式
(1)JDK的proxy类,在代码执行的过程中,动态创建一个代理对象
(2)使用cglib库,在代码编译时,直接添加增强的代码
动态代理的应用:
1)MyBatis:只需要写Mapper的接口,并没有编写他的实现类
MyBatis就是通过动态代理,创建Mapper接口的代理对象,代理对象中也有调用处理器
在调用处理器的invoke方法内,读取配置的SQL,执行
2)SpringAOP:利用动态代理,完成切的织入。
1.5 MyBatis
MyBatis是一个持久层框架
1.5.1使用MyBatis
1.引入依赖
2.构造配置文件
3.编写代码,通过配置文件来创建工厂
4.创建SqlSession对象
5.准备MyBatis的持久层
1)声明mapper接口
2)配置Mapper的SQL
namespace:配置为对应的Mapper接口的全名
为每个方法配置SQL操作
3)让MyBatis知道这里有一个Mapper
6.给SqlSession要Mapper层的对象
1.5.1 核心配置文件
1.环境
2.映射器
3.属性
4.设置
5.类型别名
6.类型转换器
7.数据库的方言
1.5.3 映射文件
1.Mapper标签
namespace:对应Mapper层的接口
<insert>配置插入的SQL
<update>配置删除的SQL
支持自动生成的组件的获取
useGeneratedKeys:true
keyColumn:设置数据表中主键字段的名字
keyProperty:设置实体类的主键属性的名字,获取到自增主键的值会保存在这个属性中。
<select>配置更新的SQL
<select>配置查询的SQL
resultType:查询结果集要映射到的实体类的类型,也可以自动解析
无论方法返回是单个实体对象,还是一个集合
只能设置实体对象类型
也可以使用Map
2.SQL配置
id:必须配置,对应的Mapper层接口的方法名,必须唯一,接口的方法不能重名/重载
parameterType:设置参数类型,不是必须要设置的,MyBatis可以自动解析这些类型
3.#{}和${}
#{}:参数绑定 相当于?,不存在SQL注入,
只有一个简单类型参数 #{随便写}
${}:字符串拼接 存在SQL注入
只有一个简单类型的参数 ${value}
1.5.4映射
查询结果集在默认情况下,会根据字段名字进行自动映射。
查询结果集,与实体类之间映射。
<resultMap>
id:唯一标识,被select标签引用
type:要映射成的实体类的全名
<id>:只用来配置主键字段的映射
<result>:只用来配置非主键字段的映射
column:查询结果集中的字段
property:被映射成的实体类的属性
1.5.5 高级映射
关系型数据库中,表与表之间可以存在三种关系:一对一、一对多、多对多。
一对一:解析成两个单向的一对一
一对多:解析成一个单向一对一,和一个单项一对多
多对多:解析成两个单向的一对多
1.5.6 缓存
执行过的SQL语句,将结果保存起来,再次查询时不需要再访问数据库,直接取出上次的结果使用。
减少对数据库的操作,提升效率。
1.一级缓存
基于SqlSession的,默认开启
当在一个Session中执行SQL时,查询缓存中是否有相应的数据
如果没有,这是才会调用数据库执行SQL
如果有,直接取缓存中的数组,不会再调用数据库
2.二级缓存
基于Mapper的缓存,默认是关闭的。
不同的SqlSession访问同一个Mapper时,缓存都是有效的
只需要在Mapper的映射文件中添加一个cache标签
<cache
eviction=”FIFO” 设置缓存刷新的方式
LRU最近最少使用
FIFO先进先出
SOFT软引用
Weak弱引用
flushInterval=”60000” 刷新时间,毫秒
size=”512” 设置缓存的大小,查询结果的数量,默认是1024
readOnly=”true”/> 只读
核心配置中,可以开启关闭缓存。
1.5.7 懒加载 延迟加载
在关联查询时,当使用association或者collection标签的select属性进行关联查询时,懒加载可以将关联对象设置为延迟加载,如果用不到就不加载,用到时再加载。
1.5.8整合SSM
1.传统JavaEE整合
//Spring 监听器 启动Spring容器 (Spring可以不用)
SpringMVC 前端控制器 先启动Spring容器,再启动SpringMVC
整合包:MyBatis-spring2.0.6
MyBatis
SqlSessionFactory交给Spring容器管理
SpringBoot整合
5)配置springmvc.xml
6)编写代码
缺点:
1)配置繁琐
2)包
2.SpringBoot
1)约定优于配置
制定好约定,代替大量一样配置,也可以单独配置
2)Maven依赖
项目构造工具
导包
编译
插件
SpringBoot是一个可以快速创建基于Spring项目的工具
1)创建项目
3)修改配置文件
第二章 项目详细设计
2.1 管理员模块
2.1.1 登录
View,Controller,Service,Mapper,Entity
各层 | 核心 | 相关-验证码 | 相关 |
View | admin/login.html | admin/login.html | in |
Interceptor | AdminInterceptor | ||
Controller | AdminController public String login() AdminAPIController public Result login(Admin admin, String vercode, HttpSession session) | VercodeController public void vercode(HttpSession session, HttpServletResponse response) | IndexController pubic String index() |
Service | AdminService Admin login(Admin admin) throw Exception; | ||
Mapper | AdminMapper Admin selectByUsername(String username); MySQL不区分大小写 MD5+salt | ||
Entity | MD5Util | VercodeUtil |
2.1.2 退出
各层 | 核心 | 相关-验证码 | 相关 |
View | index.html | ||
Interceptor | |||
Controller | AdminAPIController public Result logout(HttpSession session) | ||
Service | |||
Mapper | |||
Entity |
2.1.3 修改密码
各层 | 核心 |
View | admin/modifyPwd.html |
Controller | AdminController public String modifyPwd() AdminAPIController public Result modifyPwd(String oldPwd, String newPwd, String rePwd, HttpSession session) |
Service | AdminService int modifyPwd(integer id, String oldPwd, String newPwd, String rePwd) throw Exception |
Mapper | AdminMapper Admin selectById(Integer id); int update(Admin admin) |
Entity | Admin Result |
Util | MD5Util |
2.1.4 修改信息
各层 | 核心 |
View | admin/edit.html |
Controller | AdminController public String edit() AdminAPIController public Result edit(Admin admin, HttpSession session) |
Service | AdminService int edit(Admin admin) throw Exception |
Mapper | AdminMapper int update(Admin admin) |
Entity | Admin Result |
2.2分类模块
2.2.1 添加
各层 | 核心 | 关联 | 关联 |
View | /category/add.html | 图片上传 | 查询一级分类的接口 |
Controller | CategoryApiController public Result add(Category category) | UploadApiController public Result upload(HttpServletRequest request); //从request中取出图片,保存到服务器的硬盘上 | 查询接口 |
Service | CategoryService int add(Category category) throw Exception, //1.参数2.判断是否重名3.写入数据库 | ||
Mapper | CategoryMapper int insert(Category category); Category selectByName(String name); | ||
Entity | Category Result | ||
Util |
2.2.2 查询
各层 | 核心 | 关联 |
View | /category/list.html | 查询接口 |
Controller | CategoryApiController public Result search(integer page, integer limit, Category category) | |
Service | CategoryService List<Category>search(Category category); PageInfo search(integer page, integer limit, Category category); | |
Mapper | CategoryMapper List<Category>select(Category category); | |
Entity | Category Result | |
Util |
2.2.3 修改
各层 | 核心 | 关联 | 关联 |
View | /category/edit.html | 查询接口 | 数据回显,关联查询接口 |
Controller | CategoryApiController public Result search(Category category) | CategoryApiController public Result getById(Integer id) | |
Service | CategoryService int edit(Category category) throw Exception; //也不能重名,排除自己 | CategoryService Category getById(integer id) throw Exception; | |
Mapper | CategoryMapper Category selectByName(String name); int update(Category category); | CategoryMapper Category selectById(integer id); | |
Entity | Category Result | Category Result | |
Util |
2.2.4 删除
各层 | 核心 | 关联 |
View | 按钮 | 查询接口 |
Controller | CategoryApiController public Result remove(integer id); | |
Service | CategoryService int remove(Integer id) throw Exception; //判断分类下面是否有商品和子分类 | |
Mapper | CategoryMapper int delete(Integer id); List<Category>select(Category category); GoodsMapper List<Goods>selectByCategoryId(integer categoryId); | |
Entity | Category Goods Result | |
Util |
第三章 编码实现
3.1 创建项目
1.创建Spring项目
2.添加需要的依赖
Spring Web
Spring-tx
Spring-jdbc
Aspectjweaver
MyBatis
PageHelper
MySQL
Lombok
3.整合项目结构
1)删除demo
2)删除application.properties,创建application.yml
端口、数据库、MyBatis
3)添加需要的包
Controller
Service
Mapper
Entity
Util
Interceptor
config
4)视图
在static文件夹下,创建出各种文件夹
5)添加MyBatis映射文件的文件夹
6)添加常用的工具类和静态文件
VercodeUtil、MD5Util、Result类、UploadUtil类、Result类
Layui
3.2 编写代码
3.2.1 根据详细信息设计
创建好各层的接口的接口和类以及页面
不需要编写方法的实现
按照设计文档,自上而下的创建这些接口和类
1)实体类
2)