框架部分之Struts2和Hibernate[面试题]

上一遍文章[Java高级部分(面试题)(二)]


1.谈谈你对Struts2的理解

  • 1.Struts2是一个MVC框架,MVC是一种开发模式,把业务逻辑代码与视图代码分离,通过控制器连接业务逻辑与视图.MVC将应用程序分成了视图,模型,控制器三部分,使代码结构层次清晰,降低耦合度,代码重用性高
  • 2.结合Struts2处理请求的工作流加以说明:
    客户端发送一个请求到服务器,Tomcat会接受这个请求,Tomcat会读取项目中web.xml中的配置,判断请求是否符合Struts2过滤器StrutsPrepareAndExecuteFilter过滤的路径,如果符合会把这个请求交给Struts2处理,StrutsPrepareAndExecuteFilter会分析请求的路径,根据Struts.xml中的配置,请求路径匹配package标签的namespace属性加上action标签的name属性,跳转到对应的action类,默认执行execute方法,如果使用动态方法调用,会执行action类对应的方法,方法执行完成后返回一个字符串,这个字符串对应的Struts.xml中action标签下的result标签name属性根据result标签的配置跳转到对应的jsp页面,在jsp页面中呈现数据,返回给客户端
    3.结合Struts2优点说明:
    a.实现MVC模式,结构清晰,使开发者只关注业务逻辑的实现
    b.有丰富的tag可以用,Struts的标记库(Taglib),如能灵活动用,则能大大提高开发效率
    c.页面导航使系统的脉络更加清晰.通过一个配置文件,即可把握整个系统各部分之间的联系,这对于后期的维护有着莫大的好处.尤其是另一批开发者接手这个项目时,这种优势体现的更加明显
    d.提供Exception处理机制
    e.数据库连接池管理
    f.支持I18N

2.Struts2优缺点

优点:

  • a.实现MVC模式,结构清晰,使开发者只关注业务逻辑的实现
  • b.有丰富的tag可以用,Struts的标记库(Taglib),如能灵活动用,则能大大提高开发效率
  • c.页面导航使系统的脉络更加清晰.通过一个配置文件,即可把握整个系统各部分之间的联系,这对于后期的维护有着莫大的好处.尤其是另一批开发者接手这个项目时,这种优势体现的更加明显
  • d.提供Exception处理机制
  • e.数据库连接池管理
  • f.支持I18N

缺点:

  • 1.转到展示层时,需要配置forward,每一次转到展示层,相信大多数都是直接转到jsp,而涉及到转向,需要配置forward,如果有十个展示层的jsp,需要配置十次Struts,而且还不包括有时候目录,文件变更,需要重新修改forward,注意,每次修改配置之后,要求重新部署整个项目,而Tomcat这样的服务器,还必须重新启动服务器,如果业务变更复杂频繁的系统,这样的操作简直不可想像.现在就是这样,几十上百个人同时在线使用我们的系统,大家可以想象一下,我的烦恼有多大
  • 2.Struts的Action必须是Thread-safe方式,它仅仅允许一个实例去处理所有的请求.所以Action用到的所有的资源都必须统一同步,这就引起了线程安全的问题
  • 3.测试不方便,Struts的每个Action都同Web层耦合在一起,这样它的测试依赖于Web容器,单元测试也很难实现.不过有一个Junit的扩展工具Struts TestCase可以实现它的单元测试
  • 4.类型的转换,Struts的FormBean把所有的数据都作为String类型,他可以使用工具Commons-Beanutils进行类型转化.但它的转化都是在class级别,而且转化的类型是不可配置的,类型转化时的错误信息返回给用户也是非常困难的
  • 5.对Servlet的依赖性过强,Struts处理Action时必须要依赖ServleRequest和ServletResponse,所以它摆脱不了Servlet容器
  • 6.前端表达式语言方面,Struts集成了JSTL,所以它主要使用JSTL的表达式语言来获取数据.可是JSTL的表达式语言在Collection和索引属性方面处理显得很弱
  • 7.对Action执行的控制困难,Struts创建一个Action,如果想控制它的执行顺序将会非常困难.甚至你要重新去写Servlet来实现你的这个功能需求
  • 8.对Action执行前和后的处理.Struts处理Action的时候是基于class的hierarchies,很难在action处理前和后进行操作
  • 9.对事件支持不够.在Struts中实际是一个表单Form对应一个Action类(或DispatchAction),换一句话说:在Struts中实际是一个表单只能对应一个事件,Struts这种事件方式称为application event,application event 和 component event相比是一种粗粒度的事件

3.Struts2的核心组件有哪些

1.StrutsPrepareAndExecuteFilter:整个Struts2的调度中心,它对请求进行过滤并决定Struts2是否出来该请求
2.Struts2.xml:Struts2的应用配置文件,它负责配置系统中用到的action
3.Action:Struts2的动作执行单元实际处理用户的请求,封装业务所需的资源
4.Result:action运行后要转向下一个资源,可以是视图也可以说其他的action
5.Struts标签:用于页面上遍历后台传过来的数据

4.Struts2的执行过程

  • 1.客户端发送一个请求到服务器,Tomcat会接收这个请求
  • 2.Tomcat会读取项目中的web.xml中的配置
  • 3.判断请求是否符合Struts2过滤器StrutsPrepareAndExecuteFilter过滤的路径
  • 4.如果符合会把这个请求交给Struts2处理
  • 5.StrutsPrepareAndExecuteFilter会分析请求路径,根据Struts.xml中的配置,请求路径匹配package标签的namespace属性加上action标签的name属性,跳转到对应的action类
  • 6.默认执行execute方法,如果使用动态方法调用,会执行action类中的对应方法,方法执行完成后会返回一个字符串
  • 7.这个字符串对应Struts.xml中action标签 下的result标签的name属性
  • 8.根据result标签的配置跳转到对应的jsp页面,在jsp页面中呈现数据,返回给客户端

5.为什么要使用Struts2

  • 1.开源
  • 2.MVC框架
  • 3.纯pojo的action
  • 4.更好的标签特性
  • 5.易测性
  • 6.易扩展性

6.Struts.xml中result的type有哪些类型

Dispatch:Struts2默认的结果类型,把控制权转发给应用程序里的某个资源,不能把控制权转发给一个外部资源,若需要控制权重定向到一个外部资源,应该使用redirect结果类型
Redirect:把响应重定向到另一个资源
RedirectAction把响应重定向到另一个action
Freemarcker,velocity,chain,httpherder,xslt,plainText,stream,json


7.谈谈你对Hibernate的理解

1.hibernate是ORM框架,ORM是对象关系映射,类–>表,属性–>表中的列,对象–>表中的每一条数据,是为了解决面向对象与关系数据库之间互不匹配的现象的技术.使我们编程的思想更面向对象了,不用去考虑关系型数据库
2.hibernate工作流程是:configuration类读取并解析hibernate.cfg.xml配置文件,读取解析映射信息,创建sessionFactory,打开session,创建事务,持久化操作,关闭session,整个应用停止关闭sessionFactory
3.hibernate优点说明:

  • a.程序更加面向对象,提高开发效率
  • b.提高了生产率,不用写SQL语句
  • c.hibernate使用的是hql,支持方言配置,方便数据库移植
  • d.对jdbc代码进行封装,编程更简便了
  • e.hibernate是个轻量级框架,对代码无侵入性

8.什么是ORM

ORM是对象关系映射,类–>表,属性–>表中的列,对象–>表中的每一条数据,是为了解决面向对象与关系数据库之间互不匹配现象的技术
优点:使我们编程的思想更面向对象了,不用去考虑关系型数据库

9.ORM工作原理

实现ORM的几个关键的点:
映射类:即数据库表对应的实体类bean
映射文件:定义映射类与数据库表的字段对应关系
java反射:可以通过解析映射文件,动态的创建实例对象

[扩展阅读]

10.Hibernate数据的三个状态

1.瞬时状态(临时状态):当new对象时候,处于瞬时状态(如果程序运行完了,该对象会被垃圾回收)
2.持久状态:跟session有关,就是持久状态,持久状态的对象,任何的修改,都会影响到数据库中与之对应的数据
3.托管状态(游离状态):当session不在管理对象的时候,脱离了session的管理,处于托管状态的对象,修改属性,对数据库数据没有任何影响
企业开发中,使用saveOrUpdate(obj):来替代save(obj)或update(obj)方法
避免因为状态的改变,导致方法出错,saveOrUpdate(obj)
可以根据obj的状态,来选择是save()还是update()

11.Hibernate中load和get的区别

如果数据库中,没有userID的对象,如果通过get方法加载,则返回的是一个null;如果通过Load则返回一个代理对象,如果后面代码调用user对象的某个属性,会抛出objectNotFoundException
Load支持延迟加载,get不支持

12.Hibernate的工作原理

1.configuration类读取并解析Hibernate.cfg.xml配置文件
2.读取解析映射信息,创建sessionFactory
3.打开session
4.创建事务
5.持久化操作
6.提交事务
7.关闭session
8.整个应用停止,关闭sessionFactory

13.Hibernate的优缺点

优点:

  • 1.对jdbc访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码
  • 2.Hibernate是一个基于JDBC的主流持久性框架,是一个优秀的ORM实现,它很大程度的简化DAO的编码工作,程序更加面向对象,提高开发效率
  • 3.提高了生产效率,不用写SQL语句
  • 4.Hibernate使用的是hql,支持方言配置,方便数据库移植
  • 5.Hibernate是个轻量级框架,对代码无侵入性

缺点:

  • 1.效率比JDBC略差
  • 2.不适合批量操作
  • 3.对表的操作不够灵活

14.Hibernate是如何延迟加载的

Hibernate中存在一些查询方法,在查询的时候并没有立刻访问数据库查询数据,而是返回了一个空对象,这个对象并不是null而是经过new的对象,但对象中除了ID这种属性外其他属性都是null,当程序使用对象时Hibernate才会真正的发送语句去查询数据库,将返回的数据填充到对象的属性值.这种将推迟查询队形机制称为延迟加载
为什么要用延迟加载:

  • 1.推迟的时间内由于没有数据加载可以节约内存空间,提高内存的使用率
  • 2.如果对象查询出来并没有使用,那么延迟加载的对象根本没有访问数据库,可以减少数据可得访问次数

如何使用延迟加载:

  • 1.在Hibernate里面有一些方法自动支持延迟加载,只要调用就可以使用
  • 2.具有延迟加载的方法如下:
    session.load();
    query.iterate();
    关联映射属性加载,属性名是lazy,如果查询不存在延迟加载就会抛异常

15.如何优化Hibernate

使用双向一对多关联,不使用单向一对多
灵活使用单向一对多
不使用一对一,用多对一取代
配置对象缓存,不适用集合缓存
一对多集合使用bag,多对多使用set
继承类使用显式多态
表字段要少,表关联不要怕多,有二级缓存

16.Hibernate的主键生成策略

1.sequence,通知Hibernate框架,主键的值采用指定序列生成,然后插入数据库,主要用于Oracle,DB2

<generator class="sequence">
  <param name="sequence">foo_seq</param>//必须加上
</generator>

2.identity,通知Hibernate框架,主键值采用数据库自动增长机制,每次进行save()操作,Hibernate都会根据(数据库)自增的方式,生成一个ID值,不用程序员参与,主要用于MySQL,Sqlserver

<generator class="identity"></generator>

3.uuid(西方常用),Hibernate每次进行save()操作,都会随机生成一个32的不重复的字符串,不用程序员去参与维护,PO类的ID属性必须为String
4.native根据dialect(方言)不同,来自动的选择identity或sequence智能选择.是企业中常用的
5.assigned不推荐使用,程序员自己维护主键的ID值,当数据量很大时的时候很难维护

17.Hibernate有哪5个核心接口

configuration接口:配置Hibernate,根据其启动Hibernate,创建SessionFactory对象;
SessionFactory接口:初始化Hibernate,充当数据存储源的代理,创建session对象,SessionFactory是线程安全的,意味着它的同一个实例可以被应用的多个线程共享,是重量级,二级缓存
session接口:负责保存,更新,删除,加载和查询对象,是线程不安全的,避免多个线程共享一个session,是轻量级,一级缓存
Transaction接口:管理事务
query和criteria接口:执行数据库的查询

18.什么是重量级,什么是轻量级

轻量级是指它的创建和销毁不需要消耗太多的资源,意味着可以在程序中经常创建和销毁session的对象;重量级意味着不能随意的创建和销毁它的实例,会占用很多的资源

19.Hibernate查询方式有多少种

主键查找:session.get()或load()
hql查询:session.createQuery("hql")
sql查询:session.createSQLQuery("sql")
criteria查询(QBC):session.createCriteria()

20.拦截器的作用,拦截器和过滤器的区别

拦截器是对调用的action起作用,他提供类一种机制可以使开发者可以定义在一个action执行的前后执行的代码.拦截器只能拦截action,说白了拦截器其实就是一个action的功能块.拦截器可以抽象出一部分代码可以用来完善原来的action.同时可以减轻代码冗余提高重用率
过滤器是拦截用户请求,范围比拦截器大

[简言]
爱或不爱,爱就在那里,不增不减

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值