框架应该弄明白的理论问题

Posted 司机刹一脚

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了框架应该弄明白的理论问题相关的知识,希望对你有一定的参考价值。

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.

 

以上是关于框架应该弄明白的理论问题的主要内容,如果未能解决你的问题,请参考以下文章

用了三年 ThreadLocal 今天才弄明白其中的道理

数据库系统之关系数据理论——多值依赖到底是什么

如何弄明白动态规划?

图解 java 设计模式——彻底弄明白单例模式,工厂模式

Context都没弄明白,还怎么做Android开发?

Context 都没弄明白,还怎么做 Android 开发?