上一遍文章[Java高级部分(面试题)(二)]
文章目录
- 1.谈谈你对Struts2的理解
- 2.Struts2优缺点
- 3.Struts2的核心组件有哪些
- 4.Struts2的执行过程
- 5.为什么要使用Struts2
- 6.Struts.xml中result的type有哪些类型
- 7.谈谈你对Hibernate的理解
- 8.什么是ORM
- 9.ORM工作原理
- 10.Hibernate数据的三个状态
- 11.Hibernate中load和get的区别
- 12.Hibernate的工作原理
- 13.Hibernate的优缺点
- 14.Hibernate是如何延迟加载的
- 15.如何优化Hibernate
- 16.Hibernate的主键生成策略
- 17.Hibernate有哪5个核心接口
- 18.什么是重量级,什么是轻量级
- 19.Hibernate查询方式有多少种
- 20.拦截器的作用,拦截器和过滤器的区别
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.同时可以减轻代码冗余提高重用率
过滤器是拦截用户请求,范围比拦截器大
[简言]
爱或不爱,爱就在那里,不增不减