论坛首页 Java企业应用论坛

请牛人讨论一下SSh框架的原理和作用呗。

浏览 24974 次
精华帖 (1) :: 良好帖 (3) :: 新手帖 (5) :: 隐藏帖 (7)
作者 正文
   发表时间:2011-05-16  
HenryYu 写道
等你认清这些问题背后设计外,你就发现ssh多么烂的东西,这个世界本来可以很简单了,不再会被这些卖概念的框架给绑架了


确实我也有同感, 但是问题是这些框架本身做了一部分工作, 如果项目比较小的话, 自己实现这一部分需要占用很大的工作量, 所以这些东西还是有一定作用的。

能谈谈您对这些实现的想法的, 也就是这些东西是基于怎样的思想实现的呢。

学习这些东西其实最终的目的不是用他们, 而是在这些东西实现的基础上,得出自己比较好的实现。

基于存在既合理的想法, 所以 很多人用这些框架 说明这些东西有他的可取之处, 那么他的可取之处是什么呢?

如果需要自己实现这样的功能, 那么他的什么东西是可以拿来用的,什么东西是需要抛弃的呢。
0 请登录后投票
   发表时间:2011-05-16  
问题没有深度,只是时间的问题。网上搜索太慢,搞几本书看看基本就明白了
0 请登录后投票
   发表时间:2011-05-18  
离开了java JDK 你能做什么?
0 请登录后投票
   发表时间:2011-06-28  
徘徊在入门边缘的人,没法回答你
0 请登录后投票
   发表时间:2011-06-28  
你们都是标准的放下碗骂娘,老是一句“等你弄清楚了....”打发人,拜托反省下自己
0 请登录后投票
   发表时间:2011-10-11  
struts2

1-1:为什么每次请求都要创建一个Action对象?  

是出于对线程安全的考虑,每个request都不会相互影响

1-2:ModelDriven拦截器的配置中refreshModelBeforeResult解决了什么问题? 

先把旧的model对象从ValueStack中移除,然后再把新的model对象压入ValueStack!

官方解释:

set to true if you want the model to be refreshed on the value stack after action execution and before result execution. The setting is useful if you want to change the model instance during the action execution phase, like when loading it from the data layer. This will result in getModel() being called at least twice.

一般不需要配,顺便骂句谁出的这么坑爹的问题。

1-3:为什么在web.xml中配置的StrutsPrepareAndExecuteFilter要过滤所有的请求?

其实这里可以选择性的过滤,但是一般大家都是<url-pattern>/*</url-pattern>,所有的请求都必须经过StrutsPrepareAndExecuteFilter这个请求转发器。

它会去找struts.xml文件,一般放在src下面的第一层目录,然后找到相应的资源去转发。

1-4:请你给我谈谈ValueStack? 

所谓值栈就是在一个栈里面堆了一大坨的数值,在action中可以这样获得ValueStack vs1 = ActionContext.getContext().getValueStack();

其实值栈就类似于一个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设计模式的? 

自己去理解,按自己的request走一遍就知道了。不懂MVC还用STRUTS?



Spring

2-1:你为什么要用Spring?
XXX,为什么要用?好用才用的啊。spring有很多作用比如他的安全机制,事务管理,日志管理等等。。最主要的是把耦合度降到最低。
2-2:请你聊一聊IOC/DI?
把工厂和对象生成这两者独立分隔开来,提高灵活性和可维护性。具体的太多了。
2-3:什么是声明式的事务管理?为什么要使用声明式的事务管理?Spring如何实现声明式的事务管理?
Spring 的声明式事务管理在底层是建立在 AOP 的基础之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。
使用声明式的事务管理可重用性高。这里就列举一种最常用的配置吧。

<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>

<!--处理大型数据 Oracle中的lob字段处理-->
<bean id="nativeJdbcExtractor" lazy-init="true"
class="org.springframework.jdbc.support.nativejdbc.SimpleNativeJdbcExtractor" />
<bean id="lobHandler" lazy-init="true"
class="org.springframework.jdbc.support.lob.OracleLobHandler">
<property name="nativeJdbcExtractor">
<ref bean="nativeJdbcExtractor" />
</property>
</bean>

<!-- Hibernate SessionFactory -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="lobHandler" ref="lobHandler" />
<property name="mappingDirectoryLocations">
<list>
<value>classpath*:XXX</value>
</list>
</property>
<property name="hibernateProperties">
<props>
   <!-- <prop key="hibernate.jdbc.batch_size">50</prop>-->
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
<prop key="hibernate.cache.provider_class">${hibernate.cache.provider_class}</prop>
<prop key="hibernate.default_schema">${hibernate.default_schema}</prop>
</props>
</property>
</bean>
<bean id="txProxyTemplate" abstract="true"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref local="transactionManager"></ref>
</property>
<property name="transactionAttributes">
<props>
<prop key="save*">PROPAGATION_REQUIRED,-exception</prop>
<prop key="update*">PROPAGATION_REQUIRED,-exception</prop>
<prop key="delete*">PROPAGATION_REQUIRED,-exception</prop>
<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
2-4:把spring和hibernate集成,定义事务管理特性的时候,为何要将除了添加、删除、更新操作之外的方法,即主要执行 查询任务的方法定义为read-only?
应用这项属性时,底层的数据库可以对读取进行最优化,但要配合PROPAGATION_REQUIRED,PROPAGATION_REQUIRES_NEW或PROPAGATION_NESTED使用,即只能在事物中使用。简单的说就是增快查询速度。

Hibernate

3-1:请你谈谈你对OR映射的理解?
对象关系映射,把关系数据库的数据结构与你的对象关联起来,以操作对象操纵关系数据库。
3-2:很多人说Hibernate不适合大项目,性能有问题,你是如何理解的?
好不好是看你怎么用,不一定用了hibernate就不使用sql了,一些复杂的 比如说统计需要的数据一般都是直接用sql去执行的。使用hibernate最重要的一点是
看你如何去使用懒加载,在适当的时候使用懒加载会提高你的性能。
3-3:Hibernate为什么一定要定义一个数据库标识 ?
因为要对应数据库表的主键,唯一性原则。
3-4:为什么Hibernate建议你的实体类实现hashCode和equals方法?
多对多双向关系,如果hashCode和equals正常写之,将出现load不上的问题。
经常使用set集合来保存相关对象,而set集合是不允许重复的。而hibernate正是去"=="比较两个对象是否是同一个,所以它会去比较hashCode和用equals来比较。
3-5:谈谈你对Hibernate实体类中的数据库标识与数据库主键之间关系的认识?
是对象与关系数据库中的表识别的唯一标识。
3-6:谈谈你对Hibernate关联映射与数据库外键之间关系的认识?
关系映射中一个外键就相当于一个对象的实例,这样就形成了1-1 ,1-N,N-1,N-N这种关系。
3-7:调用session.save()方法,hibernate一定会发出insert语句吗?谈谈你的理解
save, 把一个瞬态的实例持久化标识符,及时的产生,它要返回标识符,在save之前hibernate会去根据主键查一次,看能否保存。
3-8:调用session.update()方法,hibernate一定会发出update语句吗?谈谈你的理解
update是把一个脱管状态的对象或自由态对象(一定要和一个记录对应)更新到数据库。在update之前hibernate会去根据主键查一次,看能否可以更新。
3-9:请你聊一下以下名词、概念或用法:lazy、lazy=”extra”、inverse、fetch、fetch=”join”、fetch=”subselect”、batch-size
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”一定会实现懒加载吗?
get()是不能实现懒加载的。必须使用load()。fetch要使用select
3-11:请你谈谈Hibernate中的“N+1”问题
一对多是查询一次会带出N次查询。就是一些主外键关系的对象。当进行一个表的查询时,当这个表与另外的表是多对一,或者是一对多关联时,就会出现N+1问题,当查询一条语句时,比如主键name=1,而与这个 name相关联的另一张表对应name的有N个记录,这时就出另外发出N条语句去查询,而我又不要那些记录,这时就是N+1问题

不要拍砖,转的!!  大家看看就行....
0 请登录后投票
   发表时间:2011-10-22  
magneu 写道
chrislee1982 写道
不知道楼主提出这些问题的意图是什么?!
楼主提的问题更加像是面试中会提及的问题,难道是楼主面试的时候被问及到了??!

其实楼主在2楼中说的一点都没错,的的确确就是这三个框架的重要职责。
但如果(在面试中)仅仅这样说,证明在答者在编程的思想上没有深刻体会
......



不是面试的。 在百度中看到的问题。  近期打算去面试, 根本没接触过ssh, 所以问一下。这些东西的内部实现。 呵呵。

建还是看看SSH, 我去面试第一个问题是问我写过什么项目吗,第二个就是框架,第三个是AWT,其它的都是想赶我的问题。
0 请登录后投票
   发表时间:2011-10-24  

ria?貌似经常在游戏中听到

0 请登录后投票
   发表时间:2011-10-24   最后修改:2011-10-24
Hibernate:
3-1:请你谈谈你对OR映射的理解?
     他的目的是为了解决“阻抗不匹配”(听不懂的自行百度谷歌)
     《你的灯是亮着的吗?》有一句很著名的话,鱼总是最后一个看到水的。这句话有很多引申,其中一句著名的“如果你有的是一把锤子,那么所有东西看起来就像是钉子”。
     直白点解释,我们主流且成熟的持久化技术多数为关系型数据模型,而编程语言多为对象性数据模型……我就在开发中就需要花费时间去做对象关系映射。or mapping本身无技术难度,但是却需要花费很多精力和时间去做。所以陆续涌现了很多实现了映射透明性的框架……

3-2:很多人说Hibernate不适合大项目,性能有问题,你是如何理解的?
     但是我知道hibernate支持过很多“大”项目,每个人对“大”的定义是不同的。
     但据我所知某电信,某银行的计费都是采用hibernate的。
     hibernate支持所有数据库的特性,你说hibernate不适合,难道是质疑现有的主流数据库技术吗?毕竟hibernate只是单纯抽象了一下。你用什么,用在哪里,是你的问题,不是hibernate的问题。所以,我更愿意说“你不适合做大项目”。

     又或者另一种善意的解释:
     Hibernate的缺点就是学习门槛不低,要精通门槛更高。
     而且怎么设计O/R映射,在性能和对象模型之间如何权衡取得平衡。
     以及怎样用好Hibernate方面需要你的经验和能力都很强才行。

3-3:Hibernate为什么一定要定义一个数据库标识?
     我就复制robbin很久以前的回复吧
     "像Hibernate这种ORM有一些最佳实践,其中一条就是使用代理主键,而不要使用业务主键。而使用代理主键最好的办法就是让Hibernate来生成主键,管理主键,而不是自己管理,这样可以达到最大灵活性,避免很多潜在的误用。 " 

3-4:为什么Hibernate建议你的实体类实现hashCode和equals方法?
     官方文档是这么说的吧,有建议过我吗?
     如果你有如下需求,你必须重载 equals() 和 hashCode()方法:
         想把持久类的实例放入Set中(当表示多值关联时,推荐这么做)
         想重用脱管实例
     你只需要实现个BaseEntity的父类,然后所有的实体类继承他,,实现一个对上面那问说的那个数据库标识的 equals和hashcode就好了,代码少功能还强大。(不深入解释了,懂得自然懂,不懂的我也说了个意思了,还不懂的解释起来挺费劲的,我回帖又不赚钱……)

3-5:谈谈你对Hibernate实体类中的数据库标识与数据库主键之间关系的认识?
3-6:谈谈你对Hibernate关联映射与数据库外键之间关系的认识?
3-7:调用session.save()方法,hibernate一定会发出insert语句吗?谈谈你的理解
3-8:调用session.update()方法,hibernate一定会发出update语句吗?谈谈你的理解
3-9:请你聊一下以下名词、概念或用法:lazy、lazy=”extra”、inverse、fetch、fetch=”join”、fetch=”subselect”、batch-size
3-10:配置了lazy=”true”一定会实现懒加载吗?
3-11:请你谈谈Hibernate中的“N+1”问题
3-12:请你谈谈Hibernate有哪些最佳实践?



突然要开会了……就随手先写这几个吧,有空在补充吧
0 请登录后投票
   发表时间:2011-10-25  
Angel_Night 写道
Hibernate:
3-1:请你谈谈你对OR映射的理解?
     他的目的是为了解决“阻抗不匹配”(听不懂的自行百度谷歌)
     《你的灯是亮着的吗?》有一句很著名的话,鱼总是最后一个看到水的。这句话有很多引申,其中一句著名的“如果你有的是一把锤子,那么所有东西看起来就像是钉子”。
     直白点解释,我们主流且成熟的持久化技术多数为关系型数据模型,而编程语言多为对象性数据模型……我就在开发中就需要花费时间去做对象关系映射。or mapping本身无技术难度,但是却需要花费很多精力和时间去做。所以陆续涌现了很多实现了映射透明性的框架……

3-2:很多人说Hibernate不适合大项目,性能有问题,你是如何理解的?
     但是我知道hibernate支持过很多“大”项目,每个人对“大”的定义是不同的。
     但据我所知某电信,某银行的计费都是采用hibernate的。
     hibernate支持所有数据库的特性,你说hibernate不适合,难道是质疑现有的主流数据库技术吗?毕竟hibernate只是单纯抽象了一下。你用什么,用在哪里,是你的问题,不是hibernate的问题。所以,我更愿意说“你不适合做大项目”。

     又或者另一种善意的解释:
     Hibernate的缺点就是学习门槛不低,要精通门槛更高。
     而且怎么设计O/R映射,在性能和对象模型之间如何权衡取得平衡。
     以及怎样用好Hibernate方面需要你的经验和能力都很强才行。

3-3:Hibernate为什么一定要定义一个数据库标识?
     我就复制robbin很久以前的回复吧
     "像Hibernate这种ORM有一些最佳实践,其中一条就是使用代理主键,而不要使用业务主键。而使用代理主键最好的办法就是让Hibernate来生成主键,管理主键,而不是自己管理,这样可以达到最大灵活性,避免很多潜在的误用。 " 

3-4:为什么Hibernate建议你的实体类实现hashCode和equals方法?
     官方文档是这么说的吧,有建议过我吗?
     如果你有如下需求,你必须重载 equals() 和 hashCode()方法:
         想把持久类的实例放入Set中(当表示多值关联时,推荐这么做)
         想重用脱管实例
     你只需要实现个BaseEntity的父类,然后所有的实体类继承他,,实现一个对上面那问说的那个数据库标识的 equals和hashcode就好了,代码少功能还强大。(不深入解释了,懂得自然懂,不懂的我也说了个意思了,还不懂的解释起来挺费劲的,我回帖又不赚钱……)

3-5:谈谈你对Hibernate实体类中的数据库标识与数据库主键之间关系的认识?
3-6:谈谈你对Hibernate关联映射与数据库外键之间关系的认识?
3-7:调用session.save()方法,hibernate一定会发出insert语句吗?谈谈你的理解
3-8:调用session.update()方法,hibernate一定会发出update语句吗?谈谈你的理解
3-9:请你聊一下以下名词、概念或用法:lazy、lazy=”extra”、inverse、fetch、fetch=”join”、fetch=”subselect”、batch-size
3-10:配置了lazy=”true”一定会实现懒加载吗?
3-11:请你谈谈Hibernate中的“N+1”问题
3-12:请你谈谈Hibernate有哪些最佳实践?



突然要开会了……就随手先写这几个吧,有空在补充吧

大哥回复的太精彩了, 虽然简短,但句句铿锵。 请继续补充。 谢谢!
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics