导入:
1.SSM(SpringMVC + Spring + MyBatis)
SpringMvc:入口为前端控制器;针对于方法级别的请求的,也就是一个方法对应于一个请求。
MyBatis:创建SqlSessionFactory
2.SSH(struts2 + spring + Hibernate) ---- Web应用程序开源框架(不过听说已过时。)
struts2:入口为filter过滤器;是针对一个Action类来进行请求的,即一个Action类对应于一个请求。
Hibernate:创建SessionFactory
一,spring
1.概念:Spring是一栈式的轻量级开源框架
- 一栈式:意思就是spring可以很方便的和其他企业级开源框架或者第三方核心类库整合;
- 轻量级:在使用spring时不需要依赖其相关的API(也就是说不需要实现任何的接口);
- 容器:spring就是一个容器,主要用来创建和管理对象。
2.两大核心:
1)IoC(Inverse Of Control:控制反转)
Bean的依赖注入:依赖注入(Dependency Injection),简称DI。它是 Spring 框架核心 IOC 的具体实现。在编写程序时,通过控制反转,把对象的创建权交给了 Spring。通过IOC 解耦只是降低他们的依赖关系,但不会消除。例如:业务层仍会调用持久层的方法,通过框架把持久层对象注入业务层,而不用我们自己去手动获取。
2)AOP(Aspect Oriented Programming:面向切面编程)
-
概念:AOP 是 OOP 的延续。
-
作用:在程序运行期间,在不修改源码的情况下对方法进行功能增强。
-
优势:减少重复代码,提高开发效率,并且便于维护。
-
底层实现:通过spring提供的动态代理方式来实现,在运行期间,Spring通过动态代理技术动态的生成代理对象,代理对象方法执行时进行增强功能的介入,再去调用目标对象的方法,从而完成功能的增强。
常用的动态代理:
1)JDK 代理 : 基于接口的动态代理技术
2)cglib 代理:基于父类的动态代理技术 -
AOP的相关术语:
1)Joinpoint(连接点):所谓连接点是指那些被拦截到的,有可能执行的方法。
2) Pointcut(切入点):所谓切入点是指我们要对哪些连接点进行方法的执行。(连接点的范围广)
3)Advice(通知/ 增强):所谓通知是指具体增强的方法。
4)Aspect(切面):是切入点和通知的结合
5)Weaving(织入):这是一个动词,是切入点和通知结合的过程。 -
通知的五种类型:
1)前置通知-before
2)后置通知-afterReturning
3)环绕通知-around
4)异常抛出通知-afterThrowing
5)最终通知-after(不论是否有异常,都会执行)
注意:(异常抛出通知和后置通知只会执行其中的一个)
try{前置通知
目标方法
后置通知}catch{
异常抛出通知
}finally{
最终通知
}
-
切点表达式:
切点表达式:execution("* 全包名.*.*(..)")
3.优势:
1)方便解耦,简化开发
2)AOP 编程的支持
3)声明式事务的支持
4)可以方便和其他第三方框架整合
二,springMVC
-
概述:SpringMVC 是一种基于 Java 的实现 MVC 设计模型的请求驱动类型的轻量级 Web 框架。
-
执行流程:(盗的图哈哈哈)
-
拦截器:Spring MVC 的拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理。
拦截器和过滤器的区别:
拦截器 | 过滤器 |
---|---|
使用范围:只有springMVC框架才能使用 | 使用范围:servlet的规范,所有的web应用均可使用 |
拦截范围:/*只能拦截控制器方法(底层是AOP,只会对方法增强) | 拦截范围:/*拦截所有请求,包括静态资源,js,css等 |
运行环境:只要有JDK即可 | 运行环境:必须依赖servlet容器 |
4.处理器映射器和处理器适配器的概念:
处理器映射器 : 根据用户提交的url和自身的映射规则找到对应的处理器,返回处理器执行链。
处理器适配器 : 根据处理器类型找到对应的处理器适配器,然后调用处理器中的业务方法,也就是我们写的controller。
关系 : 都是由前端控制器控制,映射器是找到处理器类型,适配器是调用该处理器的方法。
三,Mybatis
1.概念:mybatis 是一个优秀的基于java的持久层框架,它内部封装了jdbc,使开发者只需要关注sql语句本身,而不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。
mybatis框架通过ORM(对象关系映射)思想采用反射、内省等底层机制完成数据库表到实体类属性的映射。
-
反射机制:在运行期,动态的获取类的方法和属性,进行操作
-
内省机制:在反射的基础上,操作JavaBean对象。主要操作JavaBean对象的属性以及属性对应的get和set方法
2.使用Mybatis代理方式实现dao(或者mapper)时遵守的规则:
1、mapper配置文件中的namespace必须是接口的全限定类名;
2、mapper配置文件中的statement中的id必须和接口的方法名一致;
3、mapper配置文件中statement中的parameterType必须和方法的参数类型一致;resultType必须和方法的返回值真实类型(也就是泛型)一致;
4、接口的类名和mapper配置文件的名称是一致的
例如: UserMapper.java / UserMapper.xml;
5、接口所在的目录和mapper配置文件所在的目录结构一致 。
<mappers>
<!--通过对包扫描,找到包下的所有接口,会根据这个接口的名称加上.xml组合再去resources目录下根据和接口一致的目录下寻找对应的映射文件-->
<package name="域名.包名.mapper"/>
</mappers>
3.MyBatis核心配置文件常用标签:
- properties标签:该标签可以加载外部的properties文件(例如:加载jdbc.properties);
- typeAliases标签:设置类型别名;
- environments标签:数据源环境配置标签;
- typeHandlers标签:配置自定义类型处理器 (例如:Date日期类型->long类型的毫秒值);
- plugins标签:配置MyBatis的插件 (例如:分页助手插件);
- mappers标签:告诉 MyBatis 到哪里去找映射文件;
- settings标签:
1.使用mapUnderscoreToCamelCase(默认为false)—是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN 到经典 Java 属性名 aColumn 的类似映射。
2.使用useGeneratedKeys(默认为false) ----允许 JDBC 支持自动生成主键,需要驱动支持。 如果设置为 true 则这个设置强制使用自动生成主键,尽管一些驱动不能支持但仍可正常工作(比如 Derby)。
<settings>
<setting name="useGeneratedKeys" value="true"/>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
4. ${} 和 #{} 的区别
$表示的是sql的拼接,所有的sql语句必须程序员自己保证正确性。
- 注意:表达式只能是 ${value}
#表示占位符,通过日志查看,先给定一个?来占位;可以防止sql注入。
- 如果参数只有一个,表达式可以是任意的字符串— #{任意字符}
- 如果参数是一个对象,表达式必须为对象的属性名
5.多表查询时的映射文件
- 一对一配置:使用<resultMap>来配置 (或者 <resultMap>+<association>来配置)
--例如:一个订单对应一个用户
- 一对多配置:使用<resultMap>+<collection>来配置
--例如:一个用户有多个订单
- 多对多配置:使用<resultMap>+<collection>来配置
--例如:一个人有多个角色,一个角色可以被多个人扮演
6.MyBatis的注解:
- @Insert:实现新增
- @Update:实现更新
- @Delete:实现删除
- @Select:实现查询
- @Result:实现结果集封装
- @Results:可以与@Result 一起使用,封装多个结果集
- @One:实现一对一结果集封装
- @Many:实现一对多结果集封装
其他有关概念:
1.关于el表达式的param隐含对象:
1)request.getParameter(): 是通过提交表单时类似post,get等方式传过来的数据,从页面传到服务器端,返回string类型的数据。
2)request.getAttribute(): 只会存放到web容器中,request域中,再通过request域来获取数据。
3)el表达式中的隐含对象:param
${param.name}实际上相当于request.getParameter(“name”);
未完待续…