struts2和hibernate的面试题

1.struts2和struts的区别?
1) 两个框架都是MVC的WEB框架,

2) struts1是老牌框架,应用很广泛,有很好的群众基础,使用它开发风险很小,成本低,Struts2核心设计思想主要源自Webwork,实现更优雅,更容易扩展

3) Struts2修改和完善了struts1中的一些缺陷,struts1中一些悬而未决问题在struts2得到了解决。

4) struts1的前端控制器是一个Servlet,名称为ActionServlet,struts2的前端控制器是一个filter,在struts2.0中叫FilterDispatcher,在struts2.1中叫StrutsPrepareAndExecuteFilter。

5) struts1的action需要继承Action类,struts2的action可以不继承任何类;struts1对同一个路径的所有请求共享一个Action实例,struts2对同一个路径的每个请求分别使用一个独立Action实例对象,所有对于struts2的Action不用考虑线程安全问题。

6) 在struts1中使用formbean封装请求参数,在struts2中直接使用action的属性来封装请求参数。

7) struts1中的多个业务方法放在一个Action中时(即继承DispatchAction时),要么都校验,要么都不校验;对于struts2,可以指定只对某个方法进行校验,当一个Action继承了ActionSupport且在这个类中只编写了validateXxx()方法,那么则只对Xxx()方法进行校验。

8) 与Struts1不同,Struts2对用户的每一次请求都会创建一个Action,所以Struts2中的Action是线程安全的。

9) Struts2的Action比较容易进行单元测试,Struts1则需要一些特殊的支持才可以进行测试Struts 1有哪些核心组件?Struts 2结构体系的运行原理(重点)
2.struts2的默认包struts2-default.xml文件的作用
struts-default 包是 struts2 内置的,它定义了 struts2 内部的众多拦截器和 Result 类型,而 Struts2 很多核心的功能都是通过这些内置的拦截器实现,如:从请求中把请求参数封装到 action、文件上传和数据验证等等都是通过拦截器实现的。当包继承了 struts-default 包才能使用 struts2 为我们提供的这些功能
struts-default 包 是 在 struts-default.xml中定义,struts-default.x ml 也是 Struts2 默认配置文件 Struts2 每次都会自动加载 struts-default.xml 文件。
通常每个包都应该继承 struts-default 包
3.struts2拦截器和过滤器的区别?
1、拦截器是基于java的反射机制的,而过滤器是基于函数回调

2、过滤器依赖与servlet容器,而拦截器不依赖与servlet容器

3、拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用

4、拦截器可以访问action上下文、值栈里的对象,而过滤器不能

5、在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次
4.struts2的运行原理 执行流程
```
1 用户发送请求;

2 这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin)
3 接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请求是否需要调用某个Action ;

4  如果需要处理,ActionMapper会通知FilterDispatcher,需要处理这个请求,FilterDispatcher会停止过滤器链以后的部分,(这也就是为什么,FilterDispatcher应该出现在过滤器链的最后的原因)。FilterDispatcher把请求的处理交给ActionProxy ;

5 ActionProxy通过Configuration Manager询问框架的配置文件struts.xml,找到需要调用的Action类 。(在服务器启动的时候,ConfigurationManager就会把struts.xml中的所有信息读到内存里,并缓存,当ActionProxy带着URL向他询问要运行哪个Action的时候,就可以直接匹配、查找并回答了)
6 ActionProxy创建一个ActionInvocation的实例。 
7 ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到一系列相关拦截器(Intercepter)的调用。 
8 一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可 能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2 框架中继承的标签。

 9 最后,ActionInvocation对象倒序执行拦截器。

10.ActionInvocation对象执行完毕后,响应用户。

 

注意:2.1.3之后的核心过滤器由FilterDispatcher换成StrutsPrepareAndExecuteFilter。
```
5.文件的上传下载

点击查看

6.action是单例吗?
    struts2中action是多例的,即一个session产生一个action
Struts2会对每一个请求,产生一个Action的实例来处理.
Spring的Ioc容器管理的bean默认是单实例的.
首先从数据安全性的问题上考虑,我们的Action应该保证是多例的,这样才不会出现数据问题。但是如果有的action比如只有admin才能操作,或者某些action,全站公用一个来提高性能,这样的话,就可以使用单例模式。
不过,Spring的bean可以针对每一个设置它的scope,所以,上面的问题就不是问题了。如果用单例,就在spring的action bean配置的时候设置scope=”prototype”。
7.struts2如何定位action中的方法
   在struts2中在访问一个菜单链接时,我们只需要将相应的package 命名空间和 action的name进行组合,并加上相应的后缀,就可以直接访问到相应的Action了,那么这个过程是如何进行的,多个相同命名空间的 package是如何满足互不冲突的呢,这就需要详细了解struts2中是如何解析路径信息,并根据访问路径寻找相应的action配置了。

整个过程我们可以分成以下几个步骤进行处理

解析xml,将所有可以访问到的路径信息进行保存
根据访问请求信息,取其中可用的路径
根据路径进行查找,最终查找到我们所需要的Action

具体查看

8.struts2如何访问servletAPL
 1.完全解耦合的方式
 Struts2框架中提供了一个类,ActionContext类,该类中提供一些方法,通过方法获取Servlet的API。

 2.使用ServletActionContext中静态方法直接访问Servlet的API
 Struts2中提供了一个静态类,它里面的方法可以获取到我们的HttpServletResponse, HttpServletRequest

 使用接口注入的方式
9.怎么实现ajax?
需要注意的如果返回的数据是json格式数据,在xml配置中需要继承json-default
10.说出struts2中至少五个拦截器、
exception、fileUpload、i18n、modelDriven、params、prepare、validation 等

解析:
<interceptors>
        <interceptor name="alias" class="com.opensymphony.xwork2.interceptor.AliasInterceptor"/>
        <interceptor name="autowiring" class="com.opensymphony.xwork2.spring.interceptor.ActionAutowiringInterceptor"/>
        <interceptor name="chain" class="com.opensymphony.xwork2.interceptor.ChainingInterceptor"/>
        <interceptor name="conversionError" class="org.apache.struts2.interceptor.StrutsConversionErrorInterceptor"/>
        <interceptor name="cookie" class="org.apache.struts2.interceptor.CookieInterceptor"/>
        <interceptor name="cookieProvider" class="org.apache.struts2.interceptor.CookieProviderInterceptor"/>
        <interceptor name="clearSession" class="org.apache.struts2.interceptor.ClearSessionInterceptor" />
        <interceptor name="createSession" class="org.apache.struts2.interceptor.CreateSessionInterceptor" />
        <interceptor name="debugging" class="org.apache.struts2.interceptor.debugging.DebuggingInterceptor" />
        <interceptor name="execAndWait" class="org.apache.struts2.interceptor.ExecuteAndWaitInterceptor"/>
        <interceptor name="exception" class="com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor"/>
        <interceptor name="fileUpload" class="org.apache.struts2.interceptor.FileUploadInterceptor"/>
        <interceptor name="i18n" class="com.opensymphony.xwork2.interceptor.I18nInterceptor"/>
        <interceptor name="logger" class="com.opensymphony.xwork2.interceptor.LoggingInterceptor"/>
        <interceptor name="modelDriven" class="com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor"/>
        <interceptor name="scopedModelDriven" class="com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor"/>
        <interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>
        <interceptor name="actionMappingParams" class="org.apache.struts2.interceptor.ActionMappingParametersInteceptor"/>
        <interceptor name="prepare" class="com.opensymphony.xwork2.interceptor.PrepareInterceptor"/>
        <interceptor name="staticParams" class="com.opensymphony.xwork2.interceptor.StaticParametersInterceptor"/>
        <interceptor name="scope" class="org.apache.struts2.interceptor.ScopeInterceptor"/>
        <interceptor name="servletConfig" class="org.apache.struts2.interceptor.ServletConfigInterceptor"/>
        <interceptor name="timer" class="com.opensymphony.xwork2.interceptor.TimerInterceptor"/>
        <interceptor name="token" class="org.apache.struts2.interceptor.TokenInterceptor"/>
        <interceptor name="tokenSession" class="org.apache.struts2.interceptor.TokenSessionStoreInterceptor"/>
        <interceptor name="validation" class="org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor"/>
        <interceptor name="workflow" class="com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor"/>
        <interceptor name="store" class="org.apache.struts2.interceptor.MessageStoreInterceptor" />
        <interceptor name="checkbox" class="org.apache.struts2.interceptor.CheckboxInterceptor" />
        <interceptor name="datetime" class="org.apache.struts2.interceptor.DateTextFieldInterceptor" />
        <interceptor name="profiling" class="org.apache.struts2.interceptor.ProfilingActivationInterceptor" />
        <interceptor name="roles" class="org.apache.struts2.interceptor.RolesInterceptor" />
        <interceptor name="annotationWorkflow" class="com.opensymphony.xwork2.interceptor.annotations.AnnotationWorkflowInterceptor" />
        <interceptor name="multiselect" class="org.apache.struts2.interceptor.MultiselectInterceptor" />
        <interceptor name="deprecation" class="org.apache.struts2.interceptor.DeprecationInterceptor" />
11.struts2有那几种结果类型
dispatcher(转发)、redirect(重定向)、chain(转发到某个action上)、redirectAction(重定向到某个action上)等

hibernate

1.解释ORM
对象关系映射
2.比较JDBC DButils Mybatis Hibernate
JDBC: 原生访问数据库的方式, 其它三个都是对 JDBC 不同程度的包装 访问数据库比较麻烦, 代码重复度极高

dbutils: 是对jdbc进行了相对简单的包装, 主要就是能自动封装查询结构 集, 需要在代码中写 sql 语句

Mybatis: 进一步封装 jdbc, Sql 语句写在配置文件中, 面向对象操作, 有一 二级缓存功能

Hibernate: 对 jdbc 封装得最彻底的框架, 纯面向对象, 可以不用写 SQL
3.hibernate的检索方式有哪些
在hibernate开发过程中,查询是最多用到的。我们肯定会问自己一个问题:
Hibernate的检索方式有很多,load/get检索,HQL(find,Query)检索,QBC(Criteria,QBE)检索以及本地数据库SQL检索.
那么,在实际应用中到底选择哪一种检索好?它们之间的检索有哪些联系和区别呢?

答:
哪一种检索并无根本的优劣,而是要看不同的情况,结合各种查询的优点和缺点,考虑采用哪种检索会更加简单和合适一点。

HQL功能最强大,适合各种情况,但是动态条件查询构造起来很不方便
Criteria最适合动态条件查询,不太适合统计查询,QBE还不够强大,只适合相当简单的查询
NativeSQL可以实现特定数据库的SQL,但是可移植性就牺牲了

Hibernate2的Criteria功能不够完善,所以Hibernate2上面可用的只有HQL和NativeSQL,Hibernate3的Criteria已经非常强大了。

针对web应用来说,大部分常规查询都是动态条件查询,所以首选使用Criteria,并且Hibernate3提供了DetachedCriteria,可以在web层构造好DetachedCriteria再进入session执行查询,非常方便实用的特性。

但是涉及到统计查询和非常复杂的关联查询,Criteria就无能为力了,这种情况下我选择使用HQL。

最后如果必须使用某些数据库的特性,例如Oracle的"...connect with ... by"这样的SQL,则选择使用NativeSQL。
4.hibernate中的Java对象的状态有哪些
在Hibernate中,对象有三种状态:临时状态、持久状态和游离状态。

下面分别来说说这些状态:

临时状态:当new一个实体对象后,这个对象处于临时状态,即这个对象只是一个保存临时数据的内存区域,如果没有变量引用这个对象,则会被jre垃圾回收机制回收。这个对象所保存的数据域数据库没有任何关系,除非通过Session的save或者saveOrUpdate把临时对象于数据库关联,并把数据插入或者更新到数据库,这个对 象才转换为持久对象。

持久状态:持久化对象的实例在数据库中有对应的记录,并拥有一个持久化表示ID。对持久化对象进行 delete操作后,数据库中对应的记录被删除,那么持久化对象与数据库记录不再存在对应关系,持久化对象变成临时状态。持久化对象被修改变更后,不会马上同步到数据库,直到数据库事务提交。在同步之前,持久化对象是脏数据。

游离状态:当Session进行了close,clear或者evict后,持久化对象拥有持久化标示符与数据库对应记录一致的值,但是因为回话已经消失,对象不在持久化管理之内,所以处理游离状态(托管状态)游离状态的对象与临时状态对象是十分相似的,只是它还含有持久化标识。
5.load和get的区别
1、 查询的时机不一样 
             get方法任何时刻都是立即加载,只要调用get方法,就马上发起数据库查询。
             load方法默认情况下是延迟加载,真正用到对象的非OID字段数据才发起查询。
             load方法是可以通过配置的方式改为立即加载。
            配置的方式
         
    由于load方法是hibernate的方法所以只有XML的方式:

       <classname="Customer" table="cst_customer"lazy="false">  

2、返回的结果不一样
               get方法永远返回查询的实体类对象
                load方法返回的是代理对象

     立即加载:是不管用不用马上查询。
     延迟加载:是等到真正用的时候才发起查询
6.描述使用hibernate进行大量批量更新的经验
直接通过 JDBC API 执行相关的 SQl 语句或调用相关的存储过程是最佳的方式
7.getcurrentsession和opensession的区别
①. getCurrentSession() 它会先查看当前线程中是否绑定了 Session, 如果有则直接返回, 如果没有再创建. 而openSession() 则是直接 new 一个新的 Session 并返回。
②. 使用ThreadLocal 来实现线程 Session 的隔离。
③. getCurrentSession() 在事务提交的时候会自动关闭 Session, 而 openSession() 需要手动关闭.
8.说说hibernate的缓存
Hibernate缓存包括两大类:Hibernate一级缓存和Hibernate二级缓存:
1). Hibernate一级缓存又称为“Session的缓存”,它是内置的,不能被卸载。由于Session对象的生命周期通常对应一个数据库事务或者一个应用事务,因此它的缓存是事务范围的缓存。在第一级缓存中,持久化类的每个实例都具有唯一的OID。
2).Hibernate二级缓存又称为“SessionFactory的缓存”,由于SessionFactory对象的生命周期和应用程序的整个过程对应,因此Hibernate二级缓存是进程范围或者集群范围的缓存,有可能出现并发问题,因此需要采用适当的并发访问策略,该策略为被缓存的数据提供了事务隔离级别。第二级缓存是可选的,是一个可配置的插件,在默认情况下,SessionFactory不会启用这个插件。
当Hibernate根据ID访问数据对象的时候,首先从Session一级缓存中查;查不到,如果配置了二级缓存,那么从二级缓存中查;如果都查不到,再查询数据库,把结果按照ID放入到缓存删除、更新、增加数据的时候,同时更新缓存。
9.关联关系映射

连接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值