S2SH中的一些被问到的问题...

来源:互联网 发布:文化部动漫黑名单知乎 编辑:程序博客网 时间:2024/06/05 19:54

struts2:
1-1:为什么每次请求都要创建一个Action对象?
re:为了防止线程迸发,如果每次都使用同一个Action进行数据修改和传递的话,容易引起线程迸发,使线程不安全。
1-2:ModelDriven拦截器的配置中refreshModelBeforeResult解决了什么问题?
re:在数据输出之前将数据接收的Bean里面的数据清空。解决了数据混淆的可能性。
re:更新ValueStack中的model对象,先把旧的model对象从ValueStack中移除,然后再把新的model对象压进ValueStack!
1-3:为什么在web.xml中配置的StrutsPrepareAndExecuteFilter要过滤所有的请求?
re:1.可以将数据进行过滤
    2.可以进行数据的转码将数据进行统一的编码
    3.StrutsPrepareAndExecuteFilter  是struts2框架的核心部件,它与action一起作为MVC结构的控制器,耦合显示逻辑与业务逻辑。

StrutsPrepareAndExecuteFilter 负责将所有请求拦截,并通过配置文件找到相应的action,action根据请求调用业务逻辑,并将结果返回给页面

。 
1-4:请你给我谈谈ValueStack?
re:1.所谓值栈就是在一个栈里面堆了一大坨的数值,在action中可以这样获得ValueStack vs1 = ActionCont ext.getContext().getValueStack

();
    2.其实值栈就类似于一个map的容器,里面存放的是键值对,但是有个区别,这个值栈的键都是String类型的。我们一般可以这样来拿出值栈里

面的内容
名字属性获取 :<s:property value="user.username"/> 也可以用el表达式${aa}或者ognl表达式<s:property value="#request.user.username"/>
其中ognl表达式主要就是去访问值栈,它的查找路线为用于按request > session > application顺序访问其属性(attribute),#user.username

相当于按顺序在以上三个范围(scope)内读取user.username属性,直到找到为止
1-5:Struts2是如何实现MVC设计模式的?
re:MVC = 模型、视图、控制器模型:这个一般不由Struts来做视图:视图也不算struts的强项,但是struts提供优秀的标签来支持视图的展示,

利用标签,struts可以将数据合理的展示给用户控制器:struts的重要功能,提供struts的过滤器,拦截用户的请求,查找struts配置文件,为其

匹配一个对应的Action,这个Action负责调用模型,获得数据,然后对数据做部分处理,接着Action再将处理后的数据,为其选择一个视图进行输


Spring:
2-1:你为什么要用Spring?
re:1.Spring能很好的与各大框架进行了集成,平常不用spring的时候还要创建一个工厂来创建对象,这个spring相当与做了这个工厂帮你做了创

建对象的功能;
    2.还有它通过AOP帮助管理事务,你在用Hibernate的时候如果不用spring的时候每次都要写事务的提交这些代码有了他管理后就不必去管事务

提交了没有。
    3.还有它的面向切面编程(AOP)还可以在写重要记录日志的时候添加一条记录后需要在数据里同时添加一条添加成功了或失败的记录那么就可

以用Spring里的Aop来处理,虽然不用Aop也能做但是不用Spring的Aop就会写很多重复的代码了。
2-2:请你聊一聊IOC/DI/AOP?
re:1.依赖注入和控制反转Spring的两大基础作用主要是将所有组件在Spring提供的外部容器中加载,提高安全性,减低耦合性,使各个框架或者类

之间的依赖性降低。
   2.

2-3:什么是声明式的事务管理?为什么要使用声明式的事务管理?Spring如何实现声明式的事务管理?
re:1.声明事物管理主要是将在进行对数据库中数据进行添加或者修改的时候需要执行事物管理。主要是避免在执行数据修改和添加的时候数据添加

或者修改不完全,导致数据丢失。
   2.Spring 的声明式事务治理的底层是建立在 AOP 的基础之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加进一个事

务,在执行完目标方法之后根据执行情况提交或者回滚事务。 使用声明式的事务治理可重用性高。
2-4:把spring和hibernate集成,定义事务管理特性的时候,为何要将除了添加、删除、更新操作之外的方法,即主要执行 查询任务的方法定义为

read-only?
re:因为添加和删除和更新都涉及到数据库的修改,而查询并为涉及数据修改,所以只需要定义只读,这样可以提高效率,进行更加方便的事物管理

。而事务管理主要是为添加和删除和更新设计的。

 

Hibernate:
3-1:请你谈谈你对OR映射的理解?
re:对象关系映射,把关系数据库的数据结构与你的对象关联起来,以操纵对象操纵关系数据库。
3-2:很多人说Hibernate不适合大项目,性能有问题,你是如何理解的?
re:因为Hibernate属于大型框架,里面对许多方法的封装比较多,让SQL控制权降低。这样的话,适用性就会降低,在不必要的操作上会浪费时间。

但是只要将Hibernate里的配 置进行优化,也能提高其性能。但不一定用了hibernate就不使用sql了,一些复杂的比如说统计需要的数据一般都是

直接用sql执行的。使用hibernate最重要的一点是看你如何使用懒加载,在适当的时候使用懒加载会进一步提高性能。
3-3:Hibernate为什么一定要定义一个数据库标识?
re:可以让映射文件变得简洁,消除无用的噪音(比如TBL_前缀等)。Hibernate使用的默认策略是几乎什么都不做,所以使用标识的作用就是使数

据操作更加简洁和方便
3-4:为什么Hibernate建议你的实体类实现hashCode和equals方法?
re:多对多双向关系时,假如hashCode和equals正常写之,将出现load不上的问题。经常使用Set集合来保存相关对象,而Set集合是不答应重复的。

而hibernate正是用"=="比较两个对象是否是同一个,所以它会用比较hashCode和用equals来比较。
3-5:谈谈你对Hibernate实体类中的数据库标识与数据库主键之间关系的认识?
re:数据库标识是为了方便和简洁映射文件,而主键是为了使数据不会重复。
3-6:谈谈你对Hibernate关联映射与数据库外键之间关系的认识?
re:关系映射中一个外键就相当于一个对象的实例,这样就形成了1-1 ,1-N,N-1,N-N这种关系。Hibernate在进行映射的时候会将数据库的关系也

进行映射将数据库中的外键也使用标签的形式进行管理,这样在人为操作的时候就不需要手动的管理数据库关系了。
3-7:调用session.save()方法,hibernate一定会发出insert语句吗?谈谈你的理解
re:save, 把一个瞬态的实例持久化标识符,及时的产生,它要返回标识符,在save之前hibernate会往根据主键查一次,看能否保存。
不会,具体执行步骤如下:
 1. 首先在Session内部缓存中进行查找,如果发现则直接返回。
 2. 执行实体类对应的Interceptor.isUnsaved方法(如果有的话),判断对象是否为未保存状态。
 3. 根据unsaved-value判断对象是否处于未保存状态。
 4. 如果对象未保存(Transient状态),则调用save方法保存对象。
 5. 如果对象未已保存(Detached状态),则调用update方法将对象与Session重新关联。
3-8:调用session.update()方法,hibernate一定会发出update语句吗?谈谈你的理解
update是把一个脱管状态的对象或自由态对象(一定要和一个记录对应)更新到数据库。在update之前hibernate会往根据主键查一次,看能否可以

更新。 具体执行步骤同上。
3-9:请你聊一下以下名词、概念或用法:lazy、lazy=”extra”、inverse、fetch、fetch=”join”、fetch=”subselect”、batch-size
re:lazy:只有真正使用该对象内普通属性时,才会创建,对于hibernate而言,正真使用的时候才会发出sql,load支持lazy(懒加载),get不支

持懒加载。
extra:一种比较聪明的懒加载策略,即调用集合的size/contains等方法的时候,hibernate lazy=”extra”时并不会往加载整个集合的数据,而

是发出一条聪明的SQL语句,以便获得需要的值,只有在真正需要用到这些集合元素对象数据的时候,才往发出查询语句加载所有对象的数据。
inverse:标记由哪一方来维护关联关系(双向关联中会用到,inverse默认值为false。假如inverse设置为true,表示将由对方维护两者之间的关

联关系)。
fetch是抓取策略:
fetch = "select"是在查询的时候先查询出一个实体,然后在根据一个查询出多个实体,会产生1+n条sql语句。
fetch = "join"是在查询的时候使用外连接进行查询,不会差生1+n的现象。
fetch = "subselect”发送一条select语句抓取在前面查询到的所有实体对象的关联集合。
batch-size 是来设置批量更新的HQL/SQL数目 假如达到此数目会提交给数据库 但是天生的HQL/SQL语句一个也不会少。
3-10:配置了lazy=”true”一定会实现懒加载吗?
re:get()是不能实现懒加载的。必须使用load(),fetch要使用select。
3-11:请你谈谈Hibernate中的“N+1”问题
re:一对多是查询一次会带出N次查询。就是一些主外键关系的对象。当进行一个表的查询时,当这个表与另外的表是多对一,或者是一对多关联时

,就会出现N+1题目,当查询一条语句时,比如主键name=1,而与这个 name相关联的另一张表对应name的有N个记录,这时就出另外发出N条语句往查

询,而我又不要那些记录,这时就是N+1问题。
3-12:请你谈谈Hibernate有哪些最佳实践?
re:数据库建模,ORM是Hibernate中比较经典。
No1.对象-关系映射。
 hibernate支持关系型数据库,并且它与sql紧密结合的程度较高,有自己的查询语言hql,它与sql的区别在于hql是面向对象的而不是针对

数据模型。但是如果需要也可以在hibernate中使用 sql.并且hibernate还提供了灵活的映射机制,以及session级缓存,和sessionfactosy级缓存

。只是session级缓存是非线程安全的,如果多线程访问可能引起数据存取的不一致,甚至系统宕机。


 

原创粉丝点击