经典SSH面试题

Struts1.xstruts2.x的区别?

1.Action : 
• Struts1要求Action类继承一个抽象基类。Struts1的一个普遍问题是使用抽象类编程而不是接口。 
• Struts 2 Action类可以实现一个Action接口,也可实现其他接口,使可选和定制的服务成为可能。Struts2提供一个ActionSupport基类去实现 常用的接口。Action接口不是必须的,任何有execute标识的POJO对象都可以用作Struts2的Action对象。

2.线程模式:
• Struts1 Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。单例策略限制了Struts1 Action能作的事,并且要在开发时特别小心。Action资源必须是线程安全的或同步的。
• Struts2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。(实际上,servlet容器给每个请求产生许多可丢弃的对象,并且不会导致性能和垃圾回收问题)

3.Servlet 依赖: 
• Struts1 Action 依赖于Servlet API ,因为当一个Action被调用时HttpServletRequest 和 HttpServletResponse 被传递给execute方法。
• Struts 2 Action不依赖于容器,允许Action脱离容器单独被测试。如果需要,Struts2 Action仍然可以访问初始的request和response。但是,其他的元素减少或者消除了直接访问HttpServetRequest 和 HttpServletResponse的必要性。

4.可测性: 
• 测试Struts1 Action的一个主要问题是execute方法暴露了servlet API(这使得测试要依赖于容器)。一个第三方扩展--Struts TestCase--提供了一套Struts1的模拟对象(来进行测试)。
• Struts 2 Action可以通过初始化、设置属性、调用方法来测试,“依赖注入”支持也使测试更容易。

5.捕获输入: 
• Struts1 使用ActionForm对象捕获输入。所有的ActionForm必须继承一个基类。因为其他JavaBean不能用作ActionForm,开发者经常创建多余的类捕获输入。动态Bean(DynaBeans)可以作为创建传统ActionForm的选择,但是,开发者可能是在重新描述(创建)已经存在的JavaBean(仍然会导致有冗余的javabean)。
• Struts 2直接使用Action属性作为输入属性,消除了对第二个输入对象的需求。输入属性可能是有自己(子)属性的rich对象类型。Action属性能够通过web页面上的taglibs访问。Struts2也支持ActionForm模式。rich对象类型,包括业务对象,能够用作输入/输出对象。这种ModelDriven 特性简化了taglib对POJO输入对象的引用。

6.表达式语言: 
• Struts1 整合了JSTL,因此使用JSTL EL。这种EL有基本对象图遍历,但是对集合和索引属性的支持很弱。
• Struts2可以使用JSTL,但是也支持一个更强大和灵活的表达式语言--"Object Graph Notation Language" (OGNL).

7.绑定值到页面(view): 
• Struts 1使用标准JSP机制把对象绑定到页面中来访问。
• Struts 2 使用 "ValueStack"技术,使taglib能够访问值而不需要把你的页面(view)和对象绑定起来。ValueStack策略允许通过一系列名称相同但类型不同的属性重用页面(view)。

8.类型转换: 
• Struts 1 ActionForm 属性通常都是String类型。Struts1使用Commons-Beanutils进行类型转换。每个类一个转换器,对每一个实例来说是不可配置的。
• Struts2 使用OGNL进行类型转换。提供基本和常用对象的转换器。

9.校验: 
• Struts 1支持在ActionForm的validate方法中手动校验,或者通过Commons Validator的扩展来校验。同一个类可以有不同的校验内容,但不能校验子对象。
• Struts2支持通过validate方法和XWork校验框架来进行校验。XWork校验框架使用为属性类类型定义的校验和内容校验,来支持chain校验子属性

10.Action执行的控制: 
• Struts1支持每一个模块有单独的Request Processors(生命周期),但是模块中的所有Action必须共享相同的生命周期。
• Struts2支持通过拦截器堆栈(Interceptor Stacks)为每一个Action创建不同的生命周期。堆栈能够根据需要和不同的Action一起使用。

 

1.Hibernate工作原理及为什么要用?

原理:  

1.读取并解析配置文件  

2.读取并解析映射信息,创建SessionFactory  

3.打开Sesssion  

4.创建事务Transation  

5.持久化操作  

6.提交事务  

7.关闭Session  

8.关闭SesstionFactory  

 

为什么要用:  

1. JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。  

2. Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作  

3. hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。  

4. hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。  

2Hibernate是如何延迟加载?  

1. Hibernate2延迟加载实现:a)实体对象 b)集合(Collection)  

2. Hibernate3 提供了属性的延迟加载功能  

Hibernate在查询数据的时候,数据并没有存在与内存中,当程序真正对数据的操作时,对象才存在与内存中,就实现了延迟加载,他节省了服务器的内存开销,从而提高了服务器的性能。  

3Hibernate中怎样实现类之间的关系?(如:一对多、多对多的关系)  

类与类之间的关系主要体现在表与表之间的关系进行操作,它们都是对对象进行操作,我们程序中把所有的表与类都映射在一起,它们通过配置文件中的many-to-oneone-to-manymany-to-many、 来实现他们的关联关系。

4. 说下Hibernate的缓存机制  

1. 内部缓存存在Hibernate中又叫一级缓存,属于应用事物级缓存  

2. 二级缓存:  

a) 应用级缓存  

b) 分布式缓存  

条件:数据不会被第三方修改、数据大小在可接受范围、数据更新频率低、同一数据被系统频繁使用、非关键数据  

c) 第三方缓存的实现  

5Hibernate的查询方式  

Hql, Criteria,object, comptosition  

Hql:  

1、 属性查询  

2、 参数查询、命名参数查询  

3、 关联查询  

4、 分页查询  

5、 统计函数  

6. 如何优化Hibernate?  

1.使用双向一对多关联,不使用单向一对多  

2.灵活使用单向一对多关联  

3.不用一对一,用多对一取代  

4.配置对象缓存,不使用集合缓存  

5.一对多集合使用Bag,多对多集合使用Set  

6. 继承类使用显式多态  

7. 表字段要少,表关联不要怕多,有二级缓存撑腰  

7Struts工作机制?为什么要使用Struts?  

工作机制:  

Struts的工作流程:  

web应用启动时就会加载初始化ActionServlet,ActionServlet从  

struts-config.xml文件中读取配置信息,把它们存放到各种配置对象  

ActionServlet接收到一个客户请求时,将执行如下流程.  

  -(1)检索和用户请求匹配的ActionMapping实例,如果不存在,就返回请求路径无效信息;  

  -(2)如果ActionForm实例不存在,就创建一个ActionForm对象,把客户提交的表单数据保存到ActionForm对象中;  

  -(3)根据配置信息决定是否需要表单验证.如果需要验证,就调用ActionFormvalidate()方法;  

  -(4)如果ActionFormvalidate()方法返回null或返回一个不包含ActionMessageActuibErrors对象, 就表示表单验证成功;  

  -(5)ActionServlet根据ActionMapping所包含的映射信息决定将请求转发给哪个Action,如果相应的 Action实例不存在,就先创建这个实例,然后调用Actionexecute()方法;  

  -(6)Actionexecute()方法返回一个ActionForward对象,ActionServlet在把客户请求转发给 ActionForward对象指向的JSP组件;  

  -(7)ActionForward对象指向JSP组件生成动态网页,返回给客户;  

为什么要用:  

JSPServletJavaBean技术的出现给我们构建强大的企业应用系统提供了可能。但用这些技术构建的系统非常的繁乱,所以在此之上,我们需要一个规则、一个把这些技术组织起来的规则,这就是框架,Struts便应运而生。  

基于Struts开发的应用由3类组件构成:控制器组件、模型组件、视图组件  

8Strutsvalidate框架是如何验证的?  

struts配置文件中配置具体的错误提示,再在FormBean中的validate()方法具体调用。  

9. 说下Struts的设计模式  

MVC模式: web应用程序启动时就会加载并初始化ActionServler。用户提交表单时,一个配置好的ActionForm对象被创建,并被填入表单相应的数据,ActionServler根据Struts-config.xml文件配置好的设置决定是否需要表单验证,如果需要就调用ActionFormValidate()验证后选择将请求发送到哪个Action,如果Action不存在,ActionServlet会先创建这个对象,然后调用Actionexecute()方法。Execute()从ActionForm对象中获取数据,完成业务逻辑,返回一个ActionForward对象,ActionServlet再把客户请求转发给ActionForward对象指定的jsp组件,ActionForward对象指定的jsp生成动态的网页,返回给客户。  

10spring工作机制及为什么要用?  

1.spring mvc请所有的请求都提交给DispatcherServlet,它会委托应用系统的其他模块负责负责对请求进行真正的处理工作。  

2.DispatcherServlet查询一个或多个HandlerMapping,找到处理请求的Controller.  

3.DispatcherServlet请请求提交到目标Controller  

4.Controller进行业务逻辑处理后,会返回一个ModelAndView  

5.Dispathcher查询一个或多个ViewResolver视图解析器,找到ModelAndView对象指定的视图对象  

6.视图对象负责渲染返回给客户端。  

为什么用:  

{AOP 让开发人员可以创建非行为性的关注点,称为横切关注点,并将它们插入到应用程序代码中。使用 AOP 后,公共服务 (比 如日志、持久性、事务等)就可以分解成方面并应用到域对象上,同时不会增加域对象的对象模型的复杂性。  

  IOC 允许创建一个可以构造对象的应用环境,然后向这些对象传递它们的协作对象。正如单词 倒置 所表明的,IOC 就像反 过来的 JNDI。没有使用一堆抽象工厂、服务定位器、单元素(singleton)和直接构造(straight construction),每一个对象都是用其协作对象构造的。因此是由容器管理协作对象(collaborator)。  

Spring即使一个AOP框架,也是一IOC容器。 Spring 最好的地方是它有助于您替换对象。有了 Spring,只要用 JavaBean 属性和配置文件加入依赖性(协作对象)。然后可以很容易地在需要时替换具有类似接口的协作对象。}

11. Action是不是线程安全的?如果不是 有什么方式可以保证Action的线程安全?如果是,说明原因

答案一:

struts1不是,struts2是;

声明局部变量,或者扩展RequestProcessor,让每次都创建一个Action,或者在spring中用scope="prototype"来管理

答案二:

1.Struts1 Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。单例策略限制了Struts1 Action能作的事,并且要在开发时特别小心。Action资源必须是线程安全的或同步的。

Struts2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。(实际上,servlet容器给每个请求产生许多可丢弃的对象,并且不会导致性能和垃圾回收问题)

 

12.MVC,分析一下struts是如何实现MVC

MJavaBean 或结合 EJB 组件或者pojo构成

CAction 来实现

V:一组 JSP 文件及其标签构成。

13.struts中的几个关键对象的作用(说说几个关键对象的作用)

Action:控制器类,ActionForm:表单对象,DynaValidatorForm:动态formActonMapping:配置文件中action节点的信息......

 

14.load()get()的区别

答案一: load时候之查询一级缓存,没有就创建代理,用的时候就去数据库找,没找到抛异常;get()先在一级缓存找,没有就去二级缓存找,没有就去数据库找,没有就返回null;

答案二:hibernate对于load方法认为该数据在数据库中一定存在,可以放心的使用代理来延迟加载,load默认支持延迟加载,在用到对象中的其他属性数据时才查询数据库,但是万一数据库中不存在该记录,只能抛异常ObjectNotFoundEcception;所说的load方法抛异常是指在使用该对象的数据时,数据库中不存在该数据时抛异常,而不是在创建这个对象时。由于session中的缓存对于hibernate来说是个相当廉价的资源,所以在load时会先查一下session缓存看看该id对应的对象是否存在,不存在则创建代理(load时候之查询一级缓存,不存在则创建代理)。get()现在一级缓存找,没有就去二级缓存找,没有就去数据库找,没有就返回null ;而对于get方法,hibernate一定要获取到真实的数据,否则返回null

答案三:

load加载方法:

Users user = (Users)session.load(Users.class, userId);     

get加载方法:

Users user = (Users)session.get(Users.class, userId);   

两加载方法区别:

区别1:如果数据库中,没有userId的对象。如果通过get方法加载,则返回的是一个null;如果通过load加载,则返回一个代理对象,如果后面代码如果调用user对象的某个属性(比如user.getPassword())会抛出异常:org.hibernate.ObjectNotFoundException

区别2load支持延迟加载,get不支持延迟加载。

也就是说:

Java代码

Users user = (Users)session.load(Users.class, userId);   

这句代码不会去执行数据库查询,只有用到user时才会去执行数据库查询。

而:

Java代码

Users user = (Users)session.get(Users.class, userId);

则立即去执行数据库查询。 所以Users user = (Users)session.load(Users.class, userId);不会执行任何sql

注意:

Java代码

Users user = (Users)session.load(Users.class, userId);    

System.out.println(user.getId());   

上面这2句代码,不会去执行数据库操作。因为load后会在hibernate的一级缓存里存放一个map对象,该mapkey就是userId的值,但是当你getId()时,它会去一级缓存里拿mapkey值,而不去执行数据库查询。所以不会报任何错。不会执行任何数据库操作。

 

15.谈谈hibernate的延迟加载和openSessionInView

延迟加载要在session范围内,用到的时候再加载;opensessioninview是在web层写了一个filter来打开和关闭session,这样就表示在一次request过程中session一直开着,保证了延迟加载在session中的这个前提。

16.spring的事务有几种方式?谈谈spring事务的隔离级别和传播行为。

声明事务和编程事务

隔离级别:

- DEFAULT使用数据库默认的隔离级别

- READ_UNCOMMITTED会出现脏读,不可重复读和幻影读问题

- READ_COMMITTED会出现重复读和幻影读

- REPEATABLE_READ会出现幻影读

- SERIALIZABLE最安全,但是代价最大,性能影响极其严重

和传播行:

- REQUIRED存在事务就融入该事务,不存在就创建事务

- SUPPORTS存在事务就融入事务,不存在则不创建事务

- MANDATORY存在事务则融入该事务,不存在,抛异常

- REQUIRES_NEW总是创建新事务

- NOT_SUPPORTED存在事务则挂起,一直执行非事务操作

- NEVER总是执行非事务,如果当前存在事务则抛异常

- NESTED嵌入式事务

17.Hibernate中的update()saveOrUpdate()的区别.

saveOrUpdate()做下面的事:  

如果对象已经在本session中持久化了,不做任何事  

如果另一个与本session关联的对象拥有相同的持久化标识(identifier),抛出一个异常  

如果对象没有持久化标识(identifier)属性,对其调用save()  

如果对象的持久标识(identifier)表明其是一个新实例化的对象,对其调用save()  

如果对象是附带版本信息的(通过<version><timestamp>) 并且版本属性的值表明其是一个新实例化的对象,save()它。  

否则update() 这个对象  

18.Spring对多种ORM框架提供了很好的支持,简单描述在Spring中使用Hibernate的方法,并结合事务管理。

getHiberanteTemplate里面提供了saveupdatedeletefind等方法。

简单说一个:如果配置了声明式事务,当执行getHibernateTemplate的各种方法的时候,事务会自动被加载

如果没有配置事务,那么以上操作不会真正的被同步到数据库,除非配置了hibernateautocommit=true

 

19.谈谈ThreadLocalspring框架中的作用  

 

20.以前项目中有没有用到springAOP?具体用来做什么?  

 

21.Hibernate的主键生成机制increment,native,identity,assigned,sequence  

 

22Strutsvalidate框架是如何验证的?

    struts配置文件中配置具体的错误提示,再在FormBean中的validate()方法具体调用。

 

23spring整合struts三种方式:

1、使用Spring的ActionSupport类整合Struts。

2、使用Spring的DelegatingRequestProcessor覆盖Struts的RequestProcessor。

3、将Struts Action管理委托给Spring框架。

24、MVC设计模式

Web层,就是MVC模式里面的“C”(controller),负责控制业务逻辑层与表现层的交互,         调用业务逻辑层,并将业务数据返回给表现层作组织表现,该系统的MVC框架采用Struts。

Service层(就是业务逻辑层),负责实现业务逻辑。业务逻辑层以DAO层为基础,通过对DAO组件的正面模式包装,完成系统所要求的业务逻辑。

DAO层,负责与持久化对象交互。该层封装了数据的增、删、查、改的操作。

PO,持久化对象。通过实体关系映射工具将关系型数据库的数据映射成对象,很方便地实现以面向对象方式操作数据库,该系统采用Hibernate作为ORM框架。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值