事务的四大特性
1.原子性:事务中所有操作是不可再分的原子单位
事务中所有操作要么全部执行成功,要么全部执行失败
2.一致性:业务数据之和在事务前后保持一致
3.隔离性:在并发操作中,不同事务应该隔离开来,
使每个并发中的事务不会相互干扰
4.持久性:一旦事务提交成功,事务中所有的事务操作
都必须被持久化保存到数据库中,即使提交事务后,
数据库马上崩溃,在数据库重启时,也必须能通过保证
通过某种机制恢复数据
开启事务:start transaction;
结束事务:commit(提交事务)或rollback(回滚事务)
事务并发读
多个事务对相同的数据同时进行操作,这叫做事务并发。
1.脏读(dirty read):在一个事务中,读取到另一个事务未提交更新的数据,即读取到了脏数据;
2.不可重复读(unrepeatable read):对同一记录的两次读取结果不一致,因为在两次查询期间,
有另一事务对该记录做了修改(是针对修改操作)
3.幻读(虚读)(phantom read):对同一张表的两次查询结果不一致,因为在两次查询期间,
有另一事务进行了插入或者是删除操作(是针对插入或删除操作);
事务隔离级别
1、READ UNCOMMITTED(读未提交数据)
安全性最差,可能出现任何事务并发问题(比如脏读、不可以重复读、幻读等)但性能最好(不使用!!)
2、READ COMMITTED(读已提交数据)(Oracle默认)
安全性较差,性能较好
3、REPEATABLE READ(可重复读)(MySQL默认)
安全性较高,性能较差
4、SERIALIZABLE(串行化)
安全性最高,不会出现任何并发问题,因为它对同一数据的访问是串行的,非并发访问;
性能最差;(不使用!!)
MySQL的默认隔离级别为REPEATABLE READ,即可以防止脏读和不可重复读
JavaScript数据类型
1.基本数据类型
(1)数值类型(number)
特殊值:Infinity(无穷大) / -Infinity(负无穷大) / NaN(非数字)
(2)字符串类型(string)
(3)布尔类型(boolean)
(4)undefined
undefined类型的值只有一个,就是undefined,表示变量未定义(但不是指对象没有声明)。
是指声明了变量,但没有为变量赋值,该变量的值就是undefined。
(5)null
null类型的值也只有一个,就是null,表示空值。
可以作为函数的返回值,表示函数返回的是一个空的对象。
2、复杂数据类型
主要指对象(JS的内置对象、自定义的对象、函数、数组)
HTTP协议概述
HTTP协议是用于规定浏览器和服务器之间的通信方式/规则
主要规定了浏览器给服务器发送的请求信息的格式
以及规定了服务器给浏览器发送响应信息的格式
HTTP协议在工作时所遵循的基本原则
1.一次请求,只对应一次响应
2.请求只能由浏览器发起,服务器只能被动的等待请求,根据请求作出回应
Servlet概述
Servlet是由SUN公司提供的一门动态Web资源开发技术
Servlet本质上是一段Java程序,和之前的Java程序不同的是,Servlet程序无法独立运行,需要将Servlet程序放在服务器中(比如tomcat服务器),由服务器调用才可以执行。
Servlet: 服务器端的Java程序.
Servlet是运行在服务器端的Java程序,其作用是什么?
其作用是对服务器接收过来的请求进行处理(作用为处理请求)
通过Eclipse创建Servlet,默认继承HttpServlet。由于HttpServlet也是Servlet接口的子类,让HelloServlet继承HttpServlet,相当于间接实现了Servlet接口。
继承HttpServlet类,默认会覆盖doGet方法和doPost方法,两个方法的作用为:
*** doGet方法:**当浏览器发送请求的方式为GET提交时, 将会调用doGet方法来处理请求
*** doPost方法:**当浏览器发送请求的方式为POST提交时,
将会调用doPost方法来处理请求
Eclipse默认发布Web应用的位置
Tomcat服务器中默认只有一台虚拟主机,叫做localhost主机
而localhost主机发布web应用的位置是webapps。
servlet生命周期
1.Servlet容器创建Servlet实例
2.调用实例的init(),初始化
3.调用service()方法,处理请求
4.调用实例的destroy()方法(不是我们调用,是底层调用)
servlet九大内置对象
request和response介绍
request是代表HTTP请求信息的对象,response是代表HTTP响应信息的对象。
当浏览器发请求访问服务器中的某一个Servlet时,服务器将会调用Servlet中的service方法来处理请求。在调用service方法之前会创建出request和response对象。
request域对象所具备的三大特征
1.**生命周期:**在服务器调用Servlet程序的service方法之前,会创建代表请求的request对象,在请求处理完,响应结束时,会销毁request对象。
2.**作用范围:**在一次请求范围内,都可以获取到同一个request对象。
3.**主要功能:**和请求转发配合使用,从Servlet带数据到JSP(带数据到目的地)
请求转发和重定向的区别
请求转发:
1.转发是一次请求,一次响应
2.请求转发前后,浏览器的地址栏地址不会发生变化。(浏览器–访问–> A --转发–> B,地址栏地址始终指向A的地址)
3.请求转发前后的request对象是同一个(转发前在A中的request和转发到B后,B中的request对象和A中的request对象是同一个。基于这一点,可以通过request从A带数据到B)
4请求转发前后的两个资源必须属于同一个Web应用,否则将无法进行转发。(A–转发–>B,A和B必须属于同一个Web应用!)
重定向:
1.重定向是两次请求、两次响应
2.重定向前后,浏览器的地址栏地址会发生变化。(因为两次请求都是通过浏览器发起,浏览器知道这个跳转的过程,因此地址栏地址会变化)
3.重定向前后的request对象不是同一个(因为重定向是两次请求,服务器会根据两次请求创建两个不同的request对象,request对象不是同一个,也就不能在重定向时通过request带数据到目的地。)
4.重定向前后的两个资源可以是来自不同的web应用,甚至可以是来自不同的服务器。(进行跳转的两个资源之间没有限制)
JSP概述
JSP和Servlet都是由SUN公司提供的动态Web资源开发技术。
JSP看起来像一个HTML,但和HTML不同的是,JSP中可以书写Java代码,可以通过Java代码展示动态的数据。
JSP本质上是一个Servlet程序
JSP表达式
格式:<%= 常量、变量、表达式 %>
作用:计算表达式的结果,将结果输出到浏览器中,由浏览器负责解析并显示。
JSP脚本片段
格式:<% 若干Java语句 %>
作用:在翻译后的Servlet中,将脚本片段中的Java语句复制粘贴到Servlet的对应的位置执行。
JSP指令
指令的格式:<%@ 指令名称 若干属性声明... %>
指令的作用:用于指挥JSP解析引擎如何将一个JSP翻译成一个Servlet程序。
1、page指令:用于声明JSP的基本属性信息(比如JSP使用的编码,JSP使用的开发语言等)
<%@ page language="java"%>
-- language属性用于指定当前JSP使用的开发语言,目前只有java语言支持
<%@ page import="java.util.Date"%>
-- import属性用于导入包,如果不导入包,在使用其他包下的类时,就需要在类名前面加上包路径,例如: java.util.Date date = new java.util.Date();
<%@ page pageEncoding="UTF-8"%>
-- pageEncoding属性是用于指定当前JSP使用的编码,Eclipse工具会根据这个编码保存JSP文件。
保证pageEncoding属性指定的编码和JSP文件保存时使用的编码相同,可以避免JSP文件出现乱码!
2、taglib指令:用于引入JSTL标签库或者其他的自定义标签库
EL表达式
格式:${ 常量/表达式/变量 }
(放在EL中的变量得先存入域中,才可以获取变量的值)
作用:
1.计算放在其中的表达式的结果,将结果输出在当前位置。
2.主要作用:用于从域对象中获取数据,将获取到的数据输出在当前位置。
域对象:pageContext、request、session、application
获取作用域中JavaBean对象的属性值:
<%-- user.name 底层调用的仍然是 getName()方法–%>
${ user.name }
JSTL标签库
1、<c:set></c:set>
– 用于往域中添加属性,或者修改域中已有的属性值
2、<c:if></c:if>
– 构造简单的 if…else…结构语句
3、<c:forEach></c:forEach>
– 对集合或数组等中元素进行循环遍历或者是执行指定次数的循环.
Maven是什么?
Maven是一站式的项目管理工具,负责管理项目的生命周期。(创建/维护/打包/部署)
使用Maven开发,可以简化项目配置,统一项目结构。总之,Maven可以让开发者的工作变得更简单。
什么是会话
当浏览器发请求访问服务器开始,一直到访问服务器结束,浏览器关闭为止,这期间浏览器和服务器之间产生的所有请求和响应加在一起,就称之为浏览器和服务器之间的一次会话。
Session域对象的三大特征
(1)生命周期:
**创建session:**第一次调用request.getSession()方法时,会创建一个session对象。(当浏览器在服务器端没有对应的session时,调用request.getSession()方法服务器会创建一个session对象。)
销毁session:
- 超时销毁:默认情况下,当超过30分钟没有访问session,session就会超时销毁。(30分钟是默认时间,可以修改,但不推荐修改)
- 自杀:调用session的invalidate方法时,会立即销毁session。
- 意外身亡:当服务器非正常关闭时(硬件损坏,断电,内存溢出等导致服务器非正常关闭),session会随着服务器的关闭而销毁;
当服务器正常关闭,在关闭之前,服务器会将内部的session对象序列化保存到服务器的work目录下,变为一个文件。这个过程叫做session的钝化(序列化);再次将服务器启动起来,钝化着的session会再次回到服务器,变为服务器中的对象,这个过程叫做session的活化(反序列化)。
**(2)作用范围:**在一次会话范围内(获取到的都是同一个session对象)
**(3)主要功能:**在整个会话范围内实现数据的共享
cookie和session的区别
cookie::
1.cookie是将会话中产生的数据保存在浏览器客户端, 是客户端技术(JS可以访问cookie)
2.cookie是将数据保存在客户端浏览器,容易随着用户的操作导致cookie丢失或者被窃取,因此cookie中保存的数据不太稳定,也不太安全。
3.但cookie将数据保存在客户端,对服务器端没有太多影响,可以将数据保存很长时间。
4.总结:因此cookie中适合存储需要长时间保存、但对安全性要求不高的数据。
session:
1.session是将会话中产生的数据保存在服务器端,是服务器端技术
2.session将数据存在服务器端的session对象中,相对更加的安全,而且更加稳定。不容易随着用户的操作而导致session中的数据丢失或者是被窃取。
3.但session是服务器端的对象,在并发量较高时每一个浏览器客户端在服务器端都要对应一个session对象,占用服务器的内存空间,影响效率。
4.总结:因此session中适合存储对安全性要求较高,但不需要长时间保存的数据。
什么是MyBatis
MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注SQL本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。
为什么要使用MyBatis
(1)Mybatis对JDBC对了封装,可以简化JDBC代码;
(2)Mybatis自身支持连接池(也可以配置其他的连接池),因此可以提高程序的效率;
(3)Mybatis是将SQL配置在mapper文件中,修改SQL只是修改配置文件,类不需要重新编译。
(4)对查询SQL执行后返回的ResultSet对象,Mybatis会帮我们处理,转换成Java对象。
mybatis中的占位符
#{}占位符:相当于JDBC中的问号(?)占位符,是为SQL语句中的参数值进行占位,大部分情况下都是使用#{}占位符; 并且当#{}占位符是为字符串或者日期类型的值进行占位时,在参数值传过来替换占位符的同时,会进行转义处理(在字符串或日期类型的值的两边加上单引号)
${}
:是为SQL片段进行占位,将传过来的SQL片段直接拼接在${}占位符所在的位置,不会进行任何的转义处理。(由于是直接将参数拼接在SQL语句中,因此可能会引发SQL注入攻击问题)
mybatis动态SQL标签
标签:是根据test属性
中的布尔表达式的值,从而决定是否执行包含在其中的SQL片段。如果判断结果为true,则执行其中的SQL片段;如果结果为false,则不执行其中的SQL片段
标签:用于对包含在其中的SQL片段进行检索,在需要时可以生成where关键字,并且在需要时会剔除多余的连接词(比如and或者or)
foreach标签:可以对传过来的参数数组或集合进行遍历,以下是foreach标签上的各个属性介绍:
collection:
必需,值为遍历的集合类型,例如:如果参数只是一个数组或List集合,则collection的值为array或list;如果传的是多个参数,用map封装,collection则指定为map中的key。
item:
必需,若collection为数组或List集合时,item表示其中的元素,若collection为map中的key,item表示map中value(集合或数组)中的元素
open:
可选,表示遍历生成的SQL片段以什么开始,最常用的是左括号’(’
close:
可选,表示遍历生成的SQL片段以什么结束,最常用的是右括号’)’
separator:
可选,每次遍历后给生成的SQL片段后面指定间隔符
mybatis里SQL语句中的特殊符号
小于号(<)在xml文件中是特殊字符,被xml文件当成了标签的开始符号。
解决方法:
1.可以使用 <
代替 <
2.将特殊符号包含在CDATA区( <![CDATA[ ]]> )中
什么是Spring?
spring是分层的JavaSE及JavaEE应用于全栈的轻量级开源框架,以IoC(Inverse Of Control:控制反转/反转控制)和AOP(Aspact Oriented Programming:面向切面编程)为核心,提供了表现层SpringMVC和持久层SpringJDBC以及业务层事务管理等众多模块的企业级应用技术,还能整合开源世界中众多著名的第三方框架和类库,逐渐成为使用最多的JavaEE企业应用开源框架。
Spring的本质是管理软件中的对象,即创建对象和维护对象之间的关系
Spring的优势
1).方便解耦,简化开发
通过 Spring提供的 IoC容器,可以将对象间的依赖关系交由Spring进行控制,避免硬编码所造成的过度程序耦合。用户也不必再为较为底层的需求编写代码,可以更专注于上层的应用。
2).AOP 编程的支持
通过 Spring的 AOP 功能,方便进行面向切面的编程,许多不容易用传统OOP(Object Oriented Programming:面向对象编程) 实现的功能可以通过 AOP 轻松应付。
3).声明式事务的支持
可以将我们从单调烦闷的事务管理代码中解脱出来,通过声明式方式灵活的进行事务的管理,提高开发效率和质量。
4).方便程序的测试
可以用非容器依赖的编程方式进行几乎所有的测试工作,测试不再是昂贵的操作,而是随手可做的事情。
5).方便集成各种优秀框架
Spring可以降低各种框架的使用难度,提供了对各种优秀框架(Struts、Hibernate、Hessian、Quartz等)的直接支持。
6).降低 JavaEE API 的使用难度。
Spring对 JavaEE API(如 JDBC、JavaMail、远程调用等)进行了薄薄的封装层,使这些API 的使用难度大为降低。
7).Spring框架源码是经典学习范例
Spring的源代码设计精妙、结构清晰、匠心独用,处处体现着大师对Java设计模式灵活运用以及对 Java技术的高深造诣。它的源代码无疑是Java技术的最佳实践的范例。
spring的架构
核心容器Spring Core:
核心容器,提供Spring框架的基本功能。核心容器的主要组件是BeanFactory,它是工厂模式的实现。BeanFactory 使用控制反转(IOC)模式,将应用程序的配置和依赖性规范与实际的应用程序代码分开。
Spring Context:
Spring上下文,是一个配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。
Spring AOP:
通过配置管理特性,Spring AOP 模块直接将面向切面的编程功能集成到了 Spring 框架中。可以很容易地使 Spring框架管理的任何对象支持AOP。Spring AOP模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,就可以将声明性事务管理集成到应用程序中。
Spring DAO:
JDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。
Spring ORM:
Spring 框架插入了若干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括JDO、Hibernate和iBatis SQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。
Spring Web:
Web上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文。所以Spring 框架支持与 Jakarta Struts的集成。Web模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。
Spring MVC框架:
MVC 框架是一个全功能的构建 Web 应用程序的 MVC 实现。通过策略接口,MVC 框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP、Velocity、Tiles、iText 和 POI。
什么是程序的耦合
在软件工程中,耦合指的就是指对象之间的依赖关系。对象之间的依赖程度越高,耦合度就越高。对象之间的耦合越高,维护成本越高。因此对象的设计应使类和构件之间的耦合最小。
降低程序之间的依赖程度,即降低程序之间的耦合度的过程就叫做解耦。
工厂模式解耦介绍
在实际开发中可以将三层(表现层、业务层、持久层)的对象都使用配置文件配置起来,当启动服务器加载应用时,可以通过工厂读取配置文件,根据配置文件中的配置将这些对象创建出来,在接下来使用的时候,直接拿过来使用即可。
那么,这个负责读取配置文件,根据配置文件创建并返回这些对象的类就是工厂。
可以通过【工厂+接口+配置文件】的方式解除程序中的耦合。
Bean和JavaBean
Bean: 可重用组件(计算机英语)
JavaBean:使用Java语言编写的可重用组件,例如:service层、dao层等
通常分为业务Bean和实体Bean
业务Bean:处理业务逻辑,service层、dao层
实体Bean:封装数据,例如,为了封装员工信息而编写的Emp实体类.
什么是控制反转(IOC)
IOC(Inverse Of Control)控制反转,即,把创建对象的权利交给框架。
也就是指将对象的创建、对象的存储、对象的管理交给了spring容器。
(spring容器是spring中的一个核心模块,用于管理对象,底层可以理解为是一个map集合)
Bean对象的单例和多例概述
在Spring容器中管理的Bean对象的作用域,可以通过scope属性或用相关注解指定其作用域。
最常用是singleton(单例)或prototype(多例)。
1) singleton:单实例,是默认值。这个作用域标识的对象具备全局唯一性。
2) prototype:多实例。这个作用域标识的对象每次获取都会创建新的对象。
为什么用单实例或多实例?
之所以用单实例,在没有线程安全问题的前提下,没必要每个请求都创建一个对象,这样子既浪费CPU又浪费内存;
之所以用多例,是为了防止并发问题;即一个请求改变了对象的状态(例如,可改变的成员变量),此时对象又处理另一个请求,而之前请求对对象状态的改变导致了对象对另一个请求做了错误的处理;
用单例和多例的标准只有一个:当对象含有可改变的状态时(更精确的说就是在实际应用中该状态会改变),使用多实例,否则单实例;
Spring DI依赖注入(两种)
DI(Dependency Injection)依赖注入 。
依赖注入,即组件之间的依赖关系由容器在应用系统运行期来决定,也就是由容器动态地将某种依赖关系的目标对象实例注入到应用系统中的各个关联的组件之中。
1.set方式注入
通过set方式为普通属性赋值:
<property name="name" value="韩少云"></property>
通过set方式为对象属性赋值
<property name="userInfo" **ref**="userInfo">
2.构造方法注入
<constructor-arg name="userInfo" ref="userInfo"></constructor-arg>
MVC设计模式
MVC设计模式是一种通用的软件编程思想
在MVC设计模式中认为, 任何软件都可以分为三部分组成:
(1)控制程序流转的控制器(Controller)
(2)封装数据处理数据的模型(Model)
(3)负责展示数据的视图(view)
并且在MVC设计思想中要求一个符合MVC设计思想的软件应该保证上面这三部分相互独立,互不干扰,每一个部分只负责自己擅长的部分。
如果某一个模块发生变化,应该尽量做到不影响其他两个模块。这样做的好处是,软件的结构会变得更加的清晰,可读性强。有利于后期的扩展和维护,并且代码可以实现复用。
!!!Spring执行原理!!!
(1)
.用户发送请求 至 前端控制器(DispatcherServlet);
提示:DispatcherServlet的作用:接收请求,调用其它组件处理请求,响应结果,相当于转发器、中央处理器,是整个流程控制的中心
(2)
.前端控制器(DispatcherServlet)收到请求后调用处理器映射器(HandlerMapping)
处理器映射器(HandlerMapping)找到具体的Controller(可以根据xml配置、注解进行查找),并将Controller返回给DispatcherServlet;
(3)
.前端控制器(DispatcherServlet)调用处理器适配器(HandlerAdapter)。处理器适配器经过适配调用具体的Controller;(Controller–> service --> Dao --> 数据库)
Controller执行完成后返回ModelAndView,
提示:Model(模型数据,即Controller处理的结果,Map) View(逻辑视图名,即负责展示结果的JSP页面的名字)
处理器适配器(HandlerAdapter)将controller执行的结果(ModelAndView)返回给前端控制器(DispatcherServlet);
(4)
.前端控制器(DispatcherServlet)将执行的结果(ModelAndView)传给视图解析器(ViewReslover)
视图解析器(ViewReslover)根据View(逻辑视图名)解析后返回具体JSP页面
(5)
.前端控制器(DispatcherServlet)根据Model对View进行渲染(即将模型数据填充至视图中);
前端控制器(DispatcherServlet)将填充了数据的网页响应给用户。