清单为复习课时老师说的重点,高亮部分为PPT上标明“考”的部分。全部整理自PPT,仅供参考。
JavaEE重点清单
- 控制反转
- AOP
- SSM框架
- JSF
七、SSM
IOC
控制反转。PPT中通过举例进行解释,在此引用百度百科的解释。比较多点赞的博客,但本人不认同第三点“IOC也叫依赖注入(DI)”段落。
Class A中用到了Class B的对象b,一般情况下,需要在A的代码中显式的new一 个B的对象。
采用依赖注入技术之后,A的代码只需要定义一个私有的B对象,不需要直接new来获得这个对象,而是通过相关的容器控制程序来将B对象在外部new出来并注入到A类里的引用中。而具体获取的方法、对象被获取时的状态由配置文件(如XML)来指定。
PPT中的中文解释
spring ioc指的是控制反转,IOC容器负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。交由Spring来管理这些,实现解耦。
在Spring IOC容器的代表就是org.springframework.beans包中的BeanFactory接口,BeanFactory接口提供了IOC容器最基本功能;而org.springframework.context包下的ApplicationContext接口扩展了BeanFactory,还提供了与Spring AOP集成、国际化处理、事件传播及提供不同层次的context实现 。
BeanFactory提供了IOC容器最基本功能,而 ApplicationContext 则增加了更多支持企业级功能支持。ApplicationContext完全继承BeanFactory,因而BeanFactory所具有的语义也适用于ApplicationContext。
广义IOC的两种实现 1.依赖查找(DL);2.依赖注入(DI)。
依赖查找:容器中的受控对象通过容器的API来查找自己所依赖的资源和协作对象。这种方式虽然降低了对象间的依赖,但是同时使用到了容器的API,造成了我们无法在容器外使用和测试对象。
依赖注入:自身对象中的内置对象是通过注入的方式进行创建,无需依赖特定的容器和API。容器全权负责组件的装配,它会把符合依赖关系的对象通过属性(JavaBean中的setter)或者是构造子传递给需要的对象。
四种注入方式:1.构造函数方法注入;2.setter方法注入;3.接口注入;4.基于注解的依赖注入。
Spring的IoC设计支持以下功能:依赖注入、依赖检查、自动装配、支持集合、指定初始化方法和销毁方法、支持回调。其中,最重要的就是依赖注入,从 XML 的配置上说, 即 ref 标签。对应 Spring RuntimeBeanReference 对象。对于 IoC 来说,最重要的就是容器。容器管理着 Bean 的生命周期,控制着 Bean 的依赖注入。
AOP
面向切面编程。通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等待,Struts2的拦截器设计就是基于AOP的思想。
概念
名词 | 解释 |
Aspect(切面) | Aspect 声明类似于 Java 中的类声明,在 Aspect 中会包含着一些 Pointcut 以及相应的 Advice |
Joint point(连接点) | 表示在程序中明确定义的点,典型的包括方法调用,对类成员的访问以及异常处理程序块的执行等等,它自身还可以嵌套其它 joint point |
Pointcut(切点) | 表示一组 joint point,这些 joint point 或是通过逻辑关系组合起来,或是通过通配、正则表达式等方式集中起来,它定义了相应的 Advice 将要发生的地方 |
Advice(增强) | Advice 定义了在 Pointcut 里面定义的程序点具体要做的操作,它通过 before、after 和 around 来区别是在每个 joint point 之前、之后还是代替执行的代码 |
Target(目标对象) | 织入 Advice 的目标对象. |
Weaving(织入) | 将 Aspect 和其他对象连接起来, 并创建 Adviced object 的过程 |
两类实现AOP的技术:
- 采用动态代理技术
- 利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行。
- 两种动态代理机制
- JDK代理
- 基于接口的代理,会生成目标对象的接口类型的子对象。
- CGLib代理
- 基于类的代理,不需要基于接口,会生成目标对象类型的子对象。
- CGLib采用底层的字节码技术,可以为一个类创建一个子类,在子类中采用方法拦截的技术拦截所有父类方法的调用并顺势织入横切逻辑。
- 优缺点
JDK动态代理是面向接口,在创建代理实现类时比CGLib要快,创建代理速度快。CGLib动态代理是通过字节码底层继承要代理类来实现(如果被代理类被final关键字所修饰,那么抱歉会失败),在创建代理这一块没有JDK动态代理快,但是运行速度比JDK动态代理要快。
- 采用静态织入的方式
- 引入特定的语法创建“方面”,从而使得编译器可以在编译期间织入有关“方面”的代码。
SSM
Spring
轻量:从大小与开销两方面而言都是轻量级的。非侵入式,应用中的对象不依赖于spring特定类。
控制反转:降低耦合,容器在对象初始化时主动传递依赖
面向切面:spring提供了面向切面编程的丰富支持,通过分离应用的业务逻辑与系统级服务进行内聚性的开发
容器:spring包含并管理应用对象的配置和生命周期。
Spring的七大模块
见此博客
Mybatis
优点:1.易于上手和掌握;2.sql写在xml里,便于统一管理和优化;3.解除sql与程序代码的耦合;4.提供xml标签,支持编写动态sql。
Mybatis与Hibernate的区别
hibernate | mybatis |
全自动:完全通过对象关系模型实现对数据库的操作,拥有完整的JavaBean对象与数据库的映射结构来自动生成sql。 | 半自动:仅有基本的字段映射,对象数据以及对象实际关系仍然需要通过手写sql来实现和管理。 |
可移植性好,通过强大的映射结构和hql语言,降低了对象与数据库的耦合。 | 需要手写SQL,与数据库的耦合性直接取决于程序员写sql的方法 |
完整的日志系统 | 欠缺日志系统,功能较为薄弱 |
学习成本高 | 需要关心更多细节 |
无法直接维护sql | 便于SQL直接优化 |
缓存机制更优,用户无需关心sql,二级缓存时若出现脏数据,系统会报错并提示 | 在每个具体的表-对象映射中进行详细配置 |
Spring MVC
运行原理
- 客户端提交请求到DispatcherServlet
- DispatcherServlet控制器查询一个或者多个HandlerMapping,找到处理该请求的Controller
- DispatcherServlet将请求提交给Controller
- Controller调用业务逻辑进行处理,返回ModelAndView
- DispatcherServlet查询一个或者多个ViewResoler视图解析器,找到ModelAndView指定的视图
- 视图负责将结果显示在客户端
DispatcherServlet是整个SpringMVC的核心,负责接收HTTP请求组织协调SpringMVC的各个阻成部分,主要工作为:1.截获符合特定格式的URL请求;2.初始化DispatcherServlet上下文对应的WebApplicationContext,并将其与业务层、持久层的WebApplicationContext建立关联;3.初始化spring MVC的各个组成组件,装配到DispatcherServlet中。
八、JSF
用于构建Web应用程序的新标准Java框架,它提供了一种以组件为中心来开发JavaWeb用户界面的方法,从而简化了开发;提供了标准的编程接口、丰富的UI组件库、事件驱动模型等完整的Web应用框架;通过JSF,可以在页面中轻松自如地使用Web组件,捕获用户行为产生的事件,执行验证,建立页面导航。
优点与缺点
优点:UI组件;事件驱动模式;用户界面到业务逻辑的直接映射;请求处理生命周期的多阶段划分;Web开发的官方标准之一。
缺点:很多限制,将事件等强耦合到组件中,没有直接开发jsp页面来得灵活自由;基本组件库功能比较弱。
JSF数据传递方法:
- 从JSF页面传递参数给受管Bean
- 使用
</f:param>
- 使用
</f:attribute>
- 直接绑定属性
- 在请求之间传递对象
- 在受管Bean之间通信
数据类型转换
- 标准转换器
- JSF定义了一系列标准的转换器(Converter)。对于基本数据类型,JSF会使用Boolean、Byte、Character、Double、Float、Integer、Long、Short等自动进行转换。对于BigDecimal、BigInteger,则会使用BigDecimal、BigInteger进行转换,对应的标签是
<f:convertDateTime>
和<f:convertNumber>
,它们各自提供一些简单的属性,可以在转换时指定一些转换的格式细节。
- 自定义转换器
- 通过实现javax.faces.convert.Converter接口自定义转换器
数据验证
- 标准验证器
- 语法检验
- 检验输入数据是否满足格式
- J检验是否填入了值,或值的长度、大小等是否符合要求
- 语意检验
- 语法检验后,进一步验证输入的数据语意上是否正确,例如检查使用者输入的邮箱地址是否符合格式
- JSF提供了三种标准验证器:
<f:validateDoubleRange
、<f:validateLongRange>
、<f:validateLength>
,都具minimum、maximum两个属性。
- 自定义验证器
- 实现javax.faces.validator.Validator接口,其validate方法用于验证,验证错误抛出ValidatorException异常。信息的严重程度、概述、详细内容可以使用
<h:messages>
显示在页面上。
生命周期
JSF中使用Lifecycle接口来表示生命周期。
RESTORE_VIEW(恢复视图)
APPLY_REQUEST_VALUES(应用请求值)
PROCESS_VALIDATIONS(验证请求值)
UPDATE_MODEL_VALUES(更新模型值)
INVOKE_APPLICATION(调用应用)
RENDER_RESPONSE(渲染响应)
在每个阶段的前后会引发javax.faces.event.PhaseEvent
,如果想在每个阶段的前后捕捉这个事件,以进行一些处理,则可以实现javax.faces.event.PhaseListener
接口,实现该接口的类称为JSF监听器。PhaseListener有三个必须实现的方法getPhaseId()
、beforePhase()
与afterPhase()
,其中getPhaseId()
传回一个PhaseId对象,代表Listener想要被通知的时机,即上面6个时机加上ANY_PHASE(任何阶段转换时都通知)
事件处理
- 动作事件
<h:commandButton value="送出" actionListener="#{testBean.processAction}"
action="#{textBean.outcome}" />
- 即时事件
- 指JSF视图组件在取得请求值之后,立即处理指定的事件,而不再进行后续的转换器处理、验证器处理、更新模型值等流程。
<h:commandButton value="#{msgs.Text}" immediate="true"
actionListener="#{user.changeLocale}"/>
- 值变事件
- 改变了JSF输入组件的值后提交表单,就会发生值变事件(ValueChangeEvent)
- 处理方法
- 直接设定JSF输入组件的valueChangeListener属性
- 实现javax.faces.event.ValueChangeListener接口,通过
<f:valueChangeListener>
标签注册。