1.简述Struct2基本流程
引入问题:
struts核心过滤器拦截的是*.action请求
WebRoot
|-- login.jsp
.. 用到struts标签
直接访问:login.jsp, 会不会有问题?
会有问题; 如果用struts的功能,必须经过核心过滤器!
过滤器: init()/doFilter()/destroy()
在tomcat启动时候实例化,且调用init()方法
访问时候调用doFilter方法
----------------
Struts流程:
一、 Tomcat服务器启动
1. 服务器启动,加载自身config/web.xml, 以及webapps下所有项目的web.xml
2. 创建过滤器对象
创建struts核心过滤器实例
3. 初始化
执行过滤器init()方法
---> 加载默认Properties配置文件
---> 加载xml
struts-default.xml, 【所有需要创建的bean、默认的包(结果类型、所有拦截器、默认的拦截器栈)】
struts-plugin.xml, 【插件配置】
struts.xml 【自定义配置】
二、 用户访问
用户每次访问,执行doFilter()方法:
1. 每次访问struts,都会创建ActionContext对象 【 prepare.createActionContext(request, response);】
1.1 然后,创建ValuStack值栈对象
ValueStack 结构
|-- root 根元素数据
|-- context 非根元素(map)
1.2 给ValustStack封装数据, 所有的map数据都放入值栈
--> 把代表request/session/application的map、以及HttpServletRequest等对象都放入值栈中
1.3 把值栈的map数据,拷贝一份给ActionContext!
所以,我们可以通过ActionContext获取struts运行的数据!
2. ActionMapping
struts把请求的参数(路径等信息), 封装为一个ActionMapping对象!
判断:
---> 如果请求静态资源(jsp), 就放行
---> 如果请求的是action,才执行Action(的过程)
3. 如果访问的是struts的action, 执行:execute.executeAction(request, response, mapping);
(Action创建、拦截器的调用)
4. ConfigurationManager 配置管理器类,管理各配置文件
5. 根据配置管理器对象, 创建Action的代理 , 通过Action的代理,创建Action实例!
6. 再依次默认的18个拦截器
2.说一下struct2的Interceptor有什么用?
struts的每一个功能,都是通过一个个拦截器实现!
(其余自由扩展....)
拦截器怎么实现? 与过滤器区别?
总共? 默认? 不够?
3. 为什么要用Hibernate? 简述工作原理!
hibernate简化繁琐的jdbc操作!大大提升开发效率!
hibernate实现了对象关系映射,即ORM,
通过hibernate把对象直接通过映射,保存到数据库!
从数据库取出来的就是封装好的对象!
# 创建配置管理对象,Configuration
# 加载主配置文件:hibernate.cfg.xml
同时加载所有的映射信息!
# 加载完主配置文件后,就可以创建SessionFactroy
# 创建操作数据库的Session对象
# 操作数据库
# 最后提交事务、关闭session!
4. Hibernate是如何延迟加载? 并简述Hibernate缓存机制?
lazy
true
false
extra
通过设置lazy属性,实现延迟加载!
load/集合属性/对象关联的属性,默认都是延迟加载!
基于session的缓存,以及基于sessionFactroy缓存!
区别:
session缓存,一级缓存,不能共享缓存数据!
sessionFactroy缓存,二级缓存,基于应用程序的缓存,缓存数据可以给不同的session共享!
...
5. 为什么要用spring?
6. 简述spring工作原理?
可以简述Spring六大模块!
Spring的核心IOC与AOP!
IOC, 提供了可以把对象创建交给外部容器! 解耦!
AOP, 面向切面编程,典型应用: spring声明式事务管理就用到了aop编程!
IOC容器创建对象原理:
反射技术!
Spring创建bean:
1. 通过加载容器配置文件applicationContext.xml,创建IOC容器对象
2. 容器中的bean会被创建
lazy-init=true (只对单例有效)
在第一次从容器中获取对象时候,创建bean
lazy-init=默认
在创建容器对象时候,会创建所有的单例的bean
3. 多例的bean,在每次从容器获取对象的时候才创建!
Aop编程原理:
jdk动态代理、cglib子类代理!
Aop执行过程:
1. 先配置切入点表达式,指定拦截哪些方法
即给哪些类生产代理对象!
2. 当对象符合切入点表达式规则,
如果对象有实现接口,用jdk动态代理! (从ioc从其中获取对象时候,必须用接口接收!)
如果对象没有实现接口,用cglib子类代理! (目标对象不能为final)
7. Spring如何管理事务?
声明式事务管理,管理事务!
管理事务过程:
1. 配置事务管理器类
jdbc: DataSourceTransactionManager
hibernate: HibernateTransactionManager
2. 配置事务通知
<tx:advice>
3. 切面配置
配置切入点表达式,应用通知!
<aop:config>
...
8. 简述SSH整合
简述:
SSH, 指Spring与Struts整合;
Spring与Hibernate整合;
Spring创建Struts的Action
Spring创建hibernate的SessionFactory
SSH,事务管理,交给spring声明式事务管理!
dao操作,
1. 注入sessionFactory到dao 【hibernate】
2. 注入hibernateTemplate到dao 【spring api】
3. dao继承HibernateDaoSupport工具类 【spring api】