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


    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.

  • 相关阅读:
    【线段树 树链剖分 差分 经典技巧】loj#3046. 「ZJOI2019」语言【未完】
    【图论 思维】cf715B. Complete The Graph加强
    【A* 网络流】codechef Chef and Cut
    【主席树上二分】bzoj5361: [Lydsy1805月赛]对称数
    蓝书例题之UVa 10253 Series-Parallel Networks
    HAOI2019+十二省联考 游记
    Beyas定理
    CF739E Gosha is hunting DP+wqs二分
    wqs二分
    线性规划之单纯形算法
  • 原文地址:https://www.cnblogs.com/learnjfm/p/7608002.html
Copyright © 2020-2023  润新知