Struts2的工作流程
1.请求发送给strutsPrepareAndExcuteFilter,
2.strutsPrepareAndExcuteFiler判定请求是否是一个struts2请求.
3.若该请求是一个struts2请求,则strutsPrepareAndExcuteFiler把请求交给ActionProxy
4.ActionProxy创建一个ActionInvocation的实例,并进行初始化
5.ActionInvocation实例调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用.
6.action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果.调用execute方法,渲染结果.
7.执行各个拦截器invocation.invoke()之后的代码.
8.把结果发送给客户端.
struts2拦截器和过滤器的区别
过滤器依赖于servlet容器,而拦截器不依赖servlet容器.
struts2拦截器只能对action请求起作用,而过滤器几乎可以对所有的请求起作用.
拦截器可以访问action上下文(actionContext)对象,值栈(valueStack)里的对象,而过滤器不能.
在action的生命周期中,拦截器可以多次调用,而过滤器只能在容器初始化时被调用.
struts2的优点
基于MVC架构,框架结构更清晰
使用OGNL,OGNL可以快捷的访问值栈中的数据,只用值栈中对象的方法.
struts2的拦截器是一个action级别的aop,Struts2中的许多特性是通过拦截器来实现,例如处理异常,上传文件,验证等,拦截器是可配置与重用的.
valueStack
valueStack贯穿整个action的声明周期,保存在request域中,所以ValueStack和request的生命周期一样,当Struts2接受一个请求时,会创建一个actioncontext,valuestack,action.然后把action存进valuestack中,所以action的实例变量可以被OGNL访问,请求来的时候,action,valuestack的生命开始,请求结束它们的生命也结束.
值栈是多实例的,因为action是多例的,而每个action都有一个对应的值栈,action默认保存在栈顶.
valuestack本质上就是一个arraylist
拦截器的生命周期与工作过程
每个拦截器都实现了intercepter接口
在拦截器创建的时候立即调用init()方法,它在拦截器的生命周期中只被调用一次,用来初始化资源.
每拦截一个动作请求,调用一次 intercept(ActionInvocation invocation).
拦截器在销毁之前调用destroy,它在拦截器的生命周期中也只能被调用一次.
hibernate的get和load的区别
首先get和load都是根据id去获得相应的数据.
get方法:hibernate回去确认id对应的数据是否存在,它首先会去session(一级缓存)中查询,如果没有,再去二级缓存中查询,然后才会去数据库中查询,没有才会返回null;
load方法,hibernate会认定id对应的数据一定存在,它会先去session缓存中去查询,没有会根据lazy的属性值来确定是否延迟加载,如果lazy='true',就使用延迟加载,返回该代理对象,等到真正访问该对象的属性时才会去二级缓存中查询,如果没有,查询数据库,还没有就会抛出org.hibernate.ObjectNotFoundException异常,如果lazy='false',那么加载机制和get一样.
hibernate中的命名sql查询
命名查询指的是<sql-query>标签在映射文件中定义的sql查询,可以通过使用session.getNamedQuery()方法对它进行调用,命名查询使你可以使用你所指定的一个名字拿到特定的查询.当然hibernate中也可以使用@NameQuery来定义单个的命名查询,@NameQueries来定义多个命名查询,
hibernate中的sessionFactory
sessionFactory就是创建hibernate的session工厂,sessionfactory通常是在应用启动时创建好,应用程序中的代码用它来获取session对象.作为一个单个的数据存储,它也是线程安全的,所以多个线程可以同时使用一个sessionFactory.
hibernate中的session
它负责维护数据库的连接,而且线程不是安全的,也就是说,hibernate中的session不能在多个线程间进行共享,session使用之后进行关闭,我们可以通过ThreadLocal绑定session的方式解决session的线程安全问题.
spring中的aop
spring用代理类包裹切面,把他们织入到spring管理的bean中,也就是代理类伪装成目标类.它会截取目标类的方法进行调用,对目标类的调用都变成调用目标类的代理类,代理类执行了切面,再把调用转发给真正的目标类.
springmvc的工作原理
1.客户端提交请求到DispatcherServlet.
2.由DispatcherServlet查询一个或多个handlermapping,找到处理请求的Controller
3.DispatcherServlet将请求交给controller
4.controller处理业务逻辑后返回modelandview对象
5.DispatcherServlet查询一个或多个viewResoler视图解析器,找到modelandview指定的视图.
6.视图负责将结果显示到客户端.
hibernate与mybaties的区别
hibernate完全可以通过对象模型实现对数据库的操作,拥有完整的javabean对象与数据库映射结构来自动生成sql,而mybatis仅有基本字段映射,对象数据以及对象实际关系仍然需要通过手写sql来实现和管理.
hibernate日志系统非常健全,涉及广泛,包括:sql记录,关系异常,优化警告,缓存提示,脏数据警告等;
由于mybatis的sql都是写在xml里,因此优化sql比hibernate方便许多,而hibernate的sql很多都是自动生成的,无法直接维护sql;写sql的灵活程度hibernate不及mybatis
struts2和springmvc的区别
struts2是类级别的拦截,一个类对应一个request上下文.
springmvc是方法级别的拦截器,一个方法对应一个上下文,而方法同时又跟一个url对应.
springmvc方法之间基本上独立,独享request,response数据.方法之间不共享变量.
struts2虽然方法之间是独立的,但是action之间的变量确实共享的
因为struts2有自己的拦截器机制,而springmvc用的是独立的aop方式,这样导致struts2的配置文件量更大.
springmvc集成了ajax,使用非常方便,
spring的入口是servlet,struts2的入口时filter.