一、Struts2
1.简介
struts2是一个基于MVC设计模式的web层框架。它的核心是过滤器(StrutsPrepareAndExecuteFilter)。
2.运行所需
struts所需jar包,相应的action类(一般继承ActionSupport),web.xml,struts.xml,相应的jsp页面
(1)web.xml:配置struts2的过滤器StrutsPrepareAndExecuteFilter,以及一些常量的配置。
(2)struts.xml:配置相应的action及其所属类的路径,还有以及相应结果的返回方法。
3.运行过程
(1)配置文件执行流程:
默认的属性文件default.properties—–>加载struts-default.xml—–>struts-plugin.xml—–>struts.xml—–>加载struts.properties—–>加载配置提供类—->加载web.xml,过滤器初始化参数—->加载Bean对象
(2)在配置文件都加载后大致的执行过程
用户发送请求的action,这个action请求会先经过核心过滤器,核心过滤器里面有一连串的拦截器
,在经过他们后,根据action名找到相应的执行类,通过配置找到相应要执行的方法,执行完方法后会有个返回值,再根据这个返回值,会执行相应的操作,调用相应的返回结果。
4.过滤器中拦截器的调用
拦截器其实就是利用一个action的代理在递归的调用,如果访问都没有错,那么就执行相应的动作。
具体过程:
先初始化,然后执行doFilter,之后调用executeaction()方法,在其内部调用dispatcher.serviceAction();创建代理,代理会执行innovation.invoke()方法,这个方法就是一个递归,会递归执行所有拦截器。如果都没有错,那么就执行相应的动作。
5.OGNL(对象图导航语言)
<%@ taglib uri="/struts-tags" prefix="s"%>
<s></s>//就这个s标签
6.值栈ValueStack
ValueStack是struts的一个接口,OgnlValueStack是ValueStack的实现类,客户端发起一个请求,struts2会创建一个action实例,同时也会创建一个OgnlValueStack实例。OgnlValueStack贯穿整个action的生命周期。
ValueStack是struts2的数据中转站,保存了struts2框架中的数据信息。
所以,就可以从中获取数据。
ValueStack:
- root: 相当于一个ArrayList。
- context:相当于一个Map。
一般是从root中获取值的。从root中获取数据不加#,从context中获取数据加#。在jsp页面用“name”获取。
7.补充一个页面显示错误信息的标签
<s:actionerror cssStyle="color:red"/> <!--显示action级别的错误信息-->
<s:fielderror cssStyle="color:blue"/><!--显示field级别的错误信息-->
二、Hibernate
1.简介
Hibernate是一个持久层的ORM框架。其核心是ORM)(对象关系映射)
2.ORM
对象关系映射就是将java实体和数据库表建立映射关系,对java对象的操作,就是对数据库表的操作。
3.运行所需
hibernate所需jar包,实体类,实体类映射文件(Bean.xml),hibernate.cfg.xml配置文件,数据库白表,测试类。
Bean.xml:配置实体映射,实体与数据库表的映射及映射关系(一对一,一对多,多对多)。一般的命名方式:实体类名.hbm.xml
hibernate.cfg.xml:数据库源,以及hibernate相关配置,添加实体映射。
4.运行过程
加载核心配置文件hibernate.cfg.xm–>创建sessionFactory工厂—->通过工厂创建session对象—->然后开启事务—->执行相应的操作—->提交事务—->释放资源。
Configuration configuration=new Configuration().configuration();-
—>
SessionFactory sessionFactory=configuration.buildSessionFactory();
—->
Session session=sessionFactory.openSession();
—->
Transaction transaction=session.beginTransaction();
—->
session.save…..get…load…..
—->
transacion.commit()
—->
session.close()
5.Hibernate一级缓存
以及缓存是session级别的缓存,随session的创建而存在,随session的销毁而销毁。其中主要有一个快照区,只要是执行过一次的操作,它会存在快照区,下次执行操作时回和它对比,如果一样就从缓存区中取,不在就去数据库中查。主要优点是减少过多的查找,提高效率。
6.get与load方法的区别
get
- 采用的是立即加载,执行到这行代码的时候,就会马上发送SQL语句
- 查询后返回的是真实对象本身
- 查询一个找不到的对象的时候,返回null
load
- 采用延迟加载,执行到这段代码的时候,不会发送SQL语句,当真正使用这个对象的时候才会发送SQL语句。
- 查询返回的是代理对象,是利用javassist技术产生的代理。
- 查询一个找不到的对象的时候,返回ObjectNotFoundException
7.持久化类的编写规则
1.对持久化类提供一个无参的构造方法
2.属性需要私有,对私有属性提供公有的get\set方法
3.对持久化类提供一个唯一标识OID的属性区分是否是同一个对象
4.持久化类中的对象尽量使用包装类类型
5.持久化类不要使用final修饰
8.主键生成策略
分类
1.自然主键
2.代理主键
生成策略
1.increment:hibernate中提供的自动增长机制,适用于short、int、long类型的主键。在单线程中使用。
2.indentity:底层使用数据库自带的自动增长机制,适用于short、int、long类型的主键。支持MySql,不支持Oracle。
3.sequence:采用的是序列方式。适用于short、int、long类型的主键。支持Oracle,不支持MySql。
4.uuid:适用于hibernate中的随机方式生成字符串主键,适用于字符串类型的主键。
5.native:本地策略,可以在identity和sequence之间进行自动切换。
6.assigned:hibernate放弃外键的管理,需要手动编写程序或用户自己设置。
7.foreign:外部的,一对一的关系映射的情况下适用,其他表的属性字段是一个表的主键。
9.持久化类的三种状态
1.瞬时态
- 没有唯一OID,没有被session管理
2.持久态
- 有唯一OID,被session管理
3.脱管态
- 有唯一OID,没有被session管理
10.Hibernate事务管理
1.事务:事务指的是逻辑上的一组操作,组成事务操作的各个单元必须全部成功。
2.事务的特性(ACID)
原子性:代表事务不可分割
一致性:代表事务执行的前后,数据的完整性保持一致
隔离性:代表一个事务执行的过程中,不应该受到其他事务的干扰。
持久性:代表事务执行完成后,数据就持久到数据库中。
3.不考虑隔离性可能引发的问题
读的问题
脏读:一个事务读到另一个事务未提交的数据。
不可重复读:一个事物读到另一个事务已经提交的update数据,导致在前一个事务多次查询结果不一致。
虚读:一个事务读到另一个事务已经提交的insert数据,导致在前一个事务多次查询结果不一致。
4.设置事务的更新级别
Read uncommitted:以上读的问题都会发生。
Read committed:解决脏读,但是不可重复读和虚读有可能发生mysql
Repeatable read:解决脏读和不可重复读,但是虚读有可能发生orecal
Serializable:解决所有读的问题。
11.Hibernate级联操作
1.要想在一的一方影响多的一方
配置一的一方的配置文件.hbm.xml,在< set>中添加属性:cascade=”save-update”
2.要想在多的一方影响一的一方
配置多的一方的配置文件.hbm.xml,在< many-to-one>中添加属性:cascade=”save-update”
3.如何防止多余的SQL语句
使用在一的一方的set中使用属性inverse=”true”,这是由于在未设置inverse之前,双方都会维护外键,所以会有多余的更新语句。在设置后,一的一方会放弃对外键的维护权。
12.连接查询
1.交叉连接
表与表之间的笛卡儿积
select * from table_a,table_b;
2.内连接
inner join(inner可以省略),内连接就是表的交集
①.隐式内连接
select from table_a,table_b where table_a.id=table_b.aid;
②.显示内连接
select from table_a inner join table_b on table_a.id=table_b.aid;
3.外连接
①.左外连接
left outer join(outer可以省略)即左边表与右边表的交集加上左边表与右边表没有交集的部分。
select from table_a left outer join table_b on table_a.id=table_b.aid;
②.右外连接
right outer join,右边表与左边表的交集,加上右边表与左边表没有交集的部分。
select from table_a right outer join table_b on table_a.id=table_b.aid;
三、Spring
1.简介
Spring是Java EE/SE开发的一站式框架。所谓一站式,就是指spring可以开发每个层,每一层都有其对应的解决方案。
web层:springMVC
service层:spring声明式事务,spring的Bean管理
dao:spring的JDBC模板和ORM模板
2.spring核心
1.IOC
控制反转,将实体对象反转给spring来管理,这样就可以通过spring的配置文件来管理和操作对象。
2.DI
依赖注入,前提是有控制反转,通过配置文件或注解向spring管理的实体注入属性
3.AOP
面向切面编程,是一种思想,对程序代码进行横向抽取然后在用到的地方横向切入的技术。通过这种技术可以在对源程序不用修改的前提下对程序进行扩展和增强。其最主要的就是通过动态代理生成代理对象,来实现相应的操作。
3.运行所需
spring所需jar包,配置applicationContext.xml,接口和实现类,测试类。
编写接口及接口方法,在配置文件中配置< bean>,在实现类中getBean获得spring管理的对象,调用相应的方法。
4.spring IOC注解与XML
1.XML
就是通过配置文件配置< bean>来实现在测试类中通过加载配置文件和getBean的方式获得实体的操作权。
(1)< bean>标签
- id: 唯一标识,即对管理类的标识,不能有特殊字符
- name:可以重复的标识,可以有特殊字符
- class:交给spring管理的类的全路径
- init-method:Bean被初始化的时候执行的方法
- destroy-method:Bean被销毁的时候执行的方法
- scope:作用范围
singleton:默认的,spring会采用单例模式创建对象
prototype:多例模式
request:应用在web项目中,spring创建这个类以后,将这个类存入到request范围中
session:应用在web项目中,spring创建这个类以后,将这个类存入到session范围中
globalsession:应用在web项目中,必须在porlet环境中使用,如果没有这种环境则相当于session
单例模式:每次new的都是一个对象
多例模式:每次new的都是不同的对象
porlet:有子应用的程序,只要在父应用登陆过,可以不用登陆就可以使用子应用
2.注解
通过在applicationContext.xml中配置包扫描,< context:component-scan base-package=”pers.zx.spring.test” />,在接口的实现类中通过注解来注入属性和对象。在测试类中getBean();
(1)组件注解
@Component:
修饰一个类,将这个类交给Spring管理
这个注解有三个衍生的注解,和component功能类似
1.@Controler:修饰web层 @RequestMapping()修饰动作
2.@Service:修饰service层
3.@Repository:修饰dao层
(2)属性注解
1.普通属性
@Value:设置普通属性的值
2.对象类型属性
(1)Autowired:按照对象的类型来设置属性的值完成注入,即不管上面三种注解的名称与这个是否一样,都可以运行。
@Qualifier:和@Autowired一起完成按照名称进行属性值的设置
@Autowired
@Qualifier(value=”user”)
(2)@Resource:完成对象类型的属性的注入,按照名称来完成属性注入的。
@Resource(name=”user”)
(3)其他注解
1.生命周期相关的注解
@PostConstruce:初始化方法
@PreDestroy:销毁方法
在相应的方法上面加这些注解
2.Bean作用范围的注解
@Scope
@Scope(“prototype”)
注意:使用注解方式不用设置set方法
5.AOP实现原理
1.JDK动态代理
适用于实现接口的类,产生代理对象
2.Cglib动态代理
适用于未实现接口的类,产生代理对象
6.AOP开发Aspectj
Aspectj是面向切面编程的框架
具体实现:
(1)xml方式
创建被增强类和增强类,配置注入被增强类和增强类,配置切入点和切面。
被增强类:就是原始的类
增强类:就是要加给被增强类的方法。
配置注入:< bean>
AOP配置:相应的增强方法,配置的地方。< aop:config>和< aop:aspect>
(2)注解方式
在增强类中配置@Aspect注解,方法上配置@Before(value=”execution(要被增强类的包名路径和方法)”)…….
在配置文件中配置扫描注解的标签,注入增强类和被增强类
在测试类中还是要注入相应的注解,比如属性注入的注解等,就IOC那块的注解,然后测试就可以了,不用的话就写set方法。
7.JDBC模板
JDBCTemplate就是封装了一些对于数据库的操作,可以通过配置来使用它,
具体用法:
在配置文件中配置数据源,配置jdbc模板,在模板中注入数据源,之后在测试类中声明模板和set方法,就可以直接用模板里的方法。
8.Spring事务管理
1.声明式事务管理xml方式
核心是AOP的思想
要配置事务管理平台,注入数据源—->配置事务增强及管理的规则方法—->aop配置,配置哪些方法被事务管理,然后在调用这些方法的时候就会自动被事务管理了。
2.声明式事务管理注解方式
在配置文件中配置事务管理平台注入数据源,开启注解事务,然后去相应的service类上配置@Transactional
四、Mybatis
1.简介
Mybatis是面向sql的持久层框架,类似于Hibernate,它封装了jdbc访问数据的过程。他相较于hibernate的好处就是更灵活的sql操作。
2.运行所需
引入jar包,实体类,接口及相应的方法,以及接口的映射文件,SqlMapConfig.xml。测试类通过工厂生成的session对象获取接口的代理对象,实现相应的操作。
- 接口:放想实现的方法声明
- 映射文件:映射接口全路径,以及声明的方法,还有入参和返回类型。这里的所有参数都要和接口中的一致
- SqlMapConfig.xml:配置数据源和映射的接口映射文件。
- 测试类通过SqlSessionFactroy引入配置文件,然后在通过它创建session对象,通过session和mapper产生mapper的代理对象,来进行操作。
注意:具体的操作在mapper.xml中
3.运行过程
Mybatis是一个基于sql的持久层框架,关键在于核心配置文件以及mapper映射文件,在执行过程中,它会先创建一个SqlSessionFactory工厂,然后利用SqlSession创建session对象,在session对象中有个具体的执行者executor,其里面含有一个MappedStatement来对数据库进行具体的输入输出映射,所以就可以通过这个session来完成对数据库的操作。
4.Spring整合Mybatis
1.映入相应的jar包
2.编写实体类
3.编写接口以及映射文件
4.编写SqlMapConfig.xml配置mapper.xml
5.编写applicationContext.xml配置文件
- 配置数据源
- 配置SqlSessionFactory,注入数据源,注入Mybatis核心配置文件,注入别名包扫描等。
- 配置包扫描,对mapper包进行扫描。
- 接口中声明的方法直接在service层的实现类中调用就可以啦,通过mapper接口对象。此时如果不是使用注解则需要set方法。
为什么可以这样用,那是因为在配置文件中有包扫描,可以看成spring中的注入。五、SpringMVC
1.简介
SpringMVC是基于servlet的web层框架,不同于Struts2基于类级别的拦截器,SpringMVC是基于方法进行拦截的。它也是单例的,相比Struts2多里的要更加减少服务器的负担。2.运行所需
相应的jar包,web.xml,springmvc.xml,测试类,jsp页面。 - web.xml:配置前端控制器,加载springmvc.xml配置文件,配置拦截路径
- springmvc.xml:配置包扫描,扫描所需要扫描的动作类
- 测试类:动作类注解@Controller,访问路径注解@RequetMapping,以及要执行的操作。
- jsp:跳转的页面,接收返回信息
3.运行过程
首先请求会经过拦截器,通过拦截器加载核心配置文件springmvc.xml,之后通过核心配置文件找到所要扫描的包,根据url中的action名找到相应的动作,然后执行相应的动作,最终结果返回给jsp页面。
4.SpringMVC三个核心组件
处理器映射器
找到相应的执行方法
处理器适配器
执行相应的方法
视图解析器
对方法的返回值进行视图解析,跳转相应的界面
5.注意
1.可以在web.xml配置乱码解析过滤器
2.也可以配置异常处理,这个要声明异常类以及在springmvc.xml中声明< bean>
3.一些绑定参数最好和页面的参数名称一致,操作更方便
六、Maven
1.简介
Maven是一个项目管理工具,基于项目对象模型(pom),可以对java项目进行构建、依赖管理。
2.标签
< groupId>:一般用包名表示,表示项目是那个组织开发的。
< artifactId>:项目名称
< version>:版本
3.Maven仓库
1.本地仓库
2.远程仓库
3.中央仓库
maven找jar包先从本地仓库找,本地仓库没有就去远程仓库(私服)找,如果远程仓库没有就会去中央仓库去下载。最终的使用都是使用的本地仓库的jar包。
4.Maven常用命令
(1)mvn compile
将src/main/java下的文件编译为class文件输出到target目录下。
(2)mvn test
test是maven工厂的测试命令,执行src/test/java下的单元测试类
(3)mvn clean
清理命令,执行clean会删除target目录的内容
(4)mvn package
打包命令,对java工厂打包成jar包,对web工程打包war包
(5)mvn install
安装命令,执行install将maven打包成jar或war包发布到本地仓库
一般用 clean tomcat7:run 跑项目
如果项目创建有问题,就update一下就可以了。
5.Maven项目三种类型
jar:java工程
war:web工程
pom:聚合工程
6.加入依赖作用范围的方式
<dependency>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
<scope>依赖的作用范围</scope>
</dependency>
scope:
依赖的范围由强到弱的顺序是:compile>provided>runtime>test
7.Maven工程的拆分与聚合
1.工程拆分
将项目的模块拆分成不同的工程,在用到的地方引入就好了。类似于把不同的工程搭在一起,如果一个工程写的通用的话,可以用到很多地方。比如:dao
2.工程聚合
通过一个父工程把各个子工程聚合在一起形成一个完整的项目。
3.工程间的继承
由于工程之间也有继承关系,所以只需要在父工程中引入所有依赖就可以了,子工程继承父工程就可以了。
4.举个例子
以crm系统为例,里面由dao\service\web三个模块。
(1)创建父工程crm:new一个maven工程,选择pom
(2)创建子工程crm_dao:new 一个maven模型,选择jar
(3)创建子工程crm_service:new 一个maven模型,选择jar
(4)创建子工程crm_web:new 一个maven模型,选择war模块间的依赖,比如service依赖dao
在service模块中添加依赖
此时service中就可以用dao中的类和方法了。
8.SSH分模块开发
1.dao模块
实体类,实体的映射文件,hibernate.cfg.xml,以及applicationContext-dao.xml(实体类与实体映射文件包路径相同)
- user.hbm.xml:实体映射文件,配置实体与数据库表之间的映射。
- hibernate.cfg.xml:是一些有关hibernate的配置,比如方言,是否显示sql语句等。
- applicationContext-dao.xml:配置数据源,配置sessionFactory,在其中注入数据源,注入hibernate.cfg.xml,注入hibernate.hbm.xml映射文件,最后配置实体类,里面注入数据源dataSource。
2.service模块
需要编写spring的配置文件applicationContext-service.xml,其中编写事务,注入dao
- applicationContext-service.xml:配置事务管理器,事务的通知tx,以及aop切面,最后设置service实体,在其中注入dao实体
3.web模块
编写web层的applicationContext-web.xml文件,以及struts.xml配置action,还有web.xml配置过滤器。
- struts.xml
配置访问的action以及返回的结果。 - web.xml
配置spring过滤器,加载spring配置文件,配置struts过滤器,以及防止spring延迟加载的过滤器openSessionInView - applicationContext-web.xml
设置web实体,设置多例,注入service实体。
七、SSH
1.简介
SSH就是把Struts、Spring、Hibernate整合在一起开发项目。
2.具体配置
0.导入jar包
1.对于ssh中spring的配置文件applicationContext.xml
某一层要是想使用另一层的方法就需要将另一层的对象注入到自己的内部,就是谁用到谁就要把谁注入到自己内部,一般都是吧自己需要的对象或属性注入进来,在注入进来之后要在用到的地方使用set方法注入。
举个例子:
<!-- 配置service -->
<bean id="customerService" class="pers.zx.ssh.service.impl.CustomerServiceImpl">
<property name="customerDao" ref="customerDao"></property>
</bean>
要在service层调用dao层的方法,将它们联系在一起。
2.在整合ssh的时候,有关配置文件
- hibernate.cfg.xml去掉
- applicationContext.xml :
0配置各层的关系,配置dao注入sessionFactory,配置service注入dao,配置web注入service
0事务管理平台,配置切面。
0数据库连接池。
0配置sessionFactory注入dataSource,以及hibernate.hbm.xml注入,配置hibernate属性。 - struts.xml :动作跳转,注意这里由于applicationContext.xml中整合了struts2,所以action中的class就是applicationContext.xml中配置的web层实体的id
- JavaBean.hbm.xml:实体映射
- web.xml:
配置spring过滤器,加载spring配置文件,配置struts过滤器,以及防止spring延迟加载的过滤器openSessionInView
在applicationContext.xml中:
整合hibernate时,需要配置sessionFactory工厂,来注入连接池,以及配置hibernate的相关属性,
和对象关系映射。
由于hibernate是持久层的一个ORM框架,所以需要给dao层用,所以最后要将这个sessionFactory注入到
dao层。是在dao层使用相应的Hibernate模板的相应的方法的。
别忘了把Spring中配置的struts的id放到struts.xml中,class=id
还有配置事务管理,以及在web.xml中配置struts和spring的过滤器,其中spring的过滤器分为两个,一个是防止多次创建工厂的监听器ContextLoaderListener,还有一个是防止延迟加载的过滤器OpenSessionInViewFilter。
八、SSM
1.简介
**SSM是Spring、SpringMVC、Mybatis的整合。
2.具体实现
1.创建实体对象
包含对象属性,及get/set方法。
2.创建dao层
创建mapper接口及mapper.xml
mapper接口:声明相应的方法。
mapper.xml:配置映射接口,入参,方法返回类型
注意:映射为接口的全路径,而且里面方法的id为接口中方法的名称,入参类型为方法的参数类型,返回结果类型也是方法的返回结果类型。
3.创建service层
里面包含service接口和实现类,接口中声明相应的方法,接口的实现类中实现这些方法,具体就是调用dao层的方法,在servcie实现类中,声明dao层接口对象,调用其方法。
注意:这个dao层接口需要在service层注入这时需要set或者利用注解不需要set。
4.创建web层
调用service层,同样也需要注入,或者注解,来调用service层的方法。最后将结果返回给页面。
5.配置文件
(1)SqlMapConfig
一个空文件,但不可以少,要在dao的spring配置文件中引入。
(2)applicationContext-dao.xml
配置数据源
配置SqlSessionFactory:注入数据源,注入mybatis配置文件,注入别名包扫描等属性
配置mapper包的扫描:就是放mapper接口和mapper.xml的包,主要利用注解来实现属性注入和对象设置。非xml配置。
(3)applicationContext-service.xml
配置service层的包扫描,可以使用注解的方式设置对象和注入属性
(4)applicationContext-tran.xml
配置事务管理,注入数据源dataSource,配置通知和切面
(5)springmvc.xml
配置web层action包的扫描(执行动作)。
配置注解驱动(用最新的配置:映射器、适配器)。
配置web层的poperties文件。
配置视图解析器。
配置防止静态资源无法访问的标签。
(6)web.xml
配置spring核心过滤器
加载spring配置文件
配置spring监听器,防止过多创建工厂
配置过滤器解决乱码问题
配置springmvc的拦截器,以及加载springmvc.xml
注意:没有用注解需要有set方法和xml配置,有注解需要配置包扫描不需要set。