SSM框架

第一章 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)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值