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

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.

时间: 2024-07-31 20:13:09

框架应该弄明白的理论问题的相关文章

关于java中是引用传递还是值传递的问题!!!经常在笔试中遇到,今天终于弄明白了!

关于JAVA中参数传递问题有两种,一种是按值传递(如果是基本类型),另一种是按引用传递(如果是對象).首先以两个例子开始:1)public class Test2 { public static void main (String [] args) { StringBuffer a = new StringBuffer ("A"); StringBuffer b = new StringBuffer ("B"); operate (a,b); System.out.

弄明白CMS和G1,就靠这一篇了

目录 1 CMS收集器 安全点(Safepoint) 安全区域 2 G1收集器 卡表(Card Table) 3 总结 4 参考 在开始介绍CMS和G1前,我们可以剧透几点: 根据不同分代的特点,收集器可能不同.有些收集器可以同时用于新生代和老年代,而有些时候,则需要分别为新生代或老年代选用合适的收集器.一般来说,新生代收集器的收集频率较高,应选用性能高效的收集器:而老年代收集器收集次数相对较少,对空间较为敏感,应当避免选择基于复制算法的收集器. 在垃圾收集执行的时刻,应用程序需要暂停运行. 可

Java高级工程师需要弄明白的20个知识点

一般的程序员或许只需知道一些JAVA的语法结构,能对数据库数据进行CRUD就可以应付了.但要成为JAVA(高级) 工程师,就要对JAVA做比较深入的研究,需要不断学习进步,以下对高级工程师需要突破的知识点做个简要整理. 1.对多线程的了解,尤其是对线程池的理解,对ThreadPoolExecutor构造参数各个作用的理解.了解Fxied Pool.Cached Pool分别的作用 2.对锁的了解,synchronized.Lock接口(及其对应的实现的理解) 3.对JDK中HaskMap.Arr

弄明白handler机制

一.Looper类 首先,你得知道一个类,Looper类,顾名思义,Looper就是循环者的意思,那么Looper类的存在就是为了让一个普普通通的线程变成一个会循环执行的线程,我们可以理解为长生不老药,吃了就能不老. 普通的Thread类只需要执行Looper.prepare()方法就可以循环执行了. prepare()方法是Looper类的静态方法,如下: public class Looper { private static final String TAG = "Looper"

弄明白ThreadLocal类

1.ThreadLocal类的由来 因为有问题,人类就会想法设法的创造一些东西出来解决问题,嗯,这句话同意吧. 假如目前有这么一个问题:有个家庭,三个孩子都想看妈妈买的一本童话书,但是只有一本书,该如何是好? 方法一:家里没钱买第二本了,那就排队看,谁跑得快来到妈妈面前的就先看.后面来晚的,候着等着.等前面的看完再到你.于是 以时间换空间的synchronized 类出现了. 方法二:多大的事儿,你们爸爸有钱,随便任性.立马再买两本一模一样的,人手一本.于是以空间换时间的ThreadLocal类

弄明白android 网络库之Volley

1.Volley是什么? Volley是Google 官方在2013 Android IO大会上推出的新网络通信框架, 一个使得android 网络通信更加容易并且迅速的HTTP库.它并且可以通过开放的AOSP仓库进行使用. 它有以下特性: (1)自动调度网络请求: (2)支持多并发的网络连接: (3)磁盘和内存响应缓存使用标准HTTP缓存特性: (4)支持请求优先级: (5)取消请求API.你可以取消一个请求,或者你可以设定块或取消的请求范围: (6)易于定制,例如,重试和补偿: (7)强大的

3分钟弄明白JAVA三大修饰符

JAVA的三个修饰:static,final,abstract,在JAVA语言里无处不在,但是它们都能修饰什么组件,修饰组件的含义又有什么限制,总是混淆.所以来总结对比一下. 1 static静态修饰符 static修饰符能够修饰属性,方法,初始代码块.不能修饰局部变量和类. 首先要明白属性分为静态和非静态,静态的称为静态属性,又叫类变量,非静态的称为实例变量. 静态变量和静态方法统称为静态成员. 修饰属性 静态属性又称类变量,它不属于某个对象,是属于类的,是所有对象共同享有. eg:类名.静态

移动开发必须要弄明白的问题】详解Eclipse转Android Studio

2015-12-09 13:01:244264浏览3评论 AS出来一年多了,最近才从Eclipse转到AS,但我并不觉得使用Eclipse有多落后,它们都只是一个工具而已,哪个顺手就用哪个,用得好都能提高生产力,不会合理利用,再好的工具也是惘然.很多使用Eclipse的Android程序员不知道代码重构的快捷键.如何在运行时调试.一个Workspace一大堆工程......,我想即使转到Android Studio也并不见得比Eclipse顺手. 下面将自己在Eclipse转AS过程中遇到的一些

弄明白Android 接口回调机制

以前对于这个机制理解不够深刻,现在重新整理下思路. 一.建模 我理解的接口回调就是,我这个类实现了一个接口里的方法doSomething,然后注册到你这里,然后我就去做别的事情去了,你在某个触发的时机回头来调用我doSomething的方法.好比,我给你打电话问某个难题,你电话里想不出来,于是说等想到了再回我电话.于是接口回调机制比喻模型如下 第一步: 首先,你我得约定,这个实现的方法是咋样的,叫什么名字,需要传入传出什么.为什么要这样呢?你我得约定电话联系,不是微信扣扣.这就是约定的接口. 我