1.什么是hibernate及hibernate工作原理、流程和为什么要用Hibernate?

答:

   定义:Hibernate是一个开放源代码的对象关系映射(ORM)框架,它对JDBC进行了非常轻量级的对象封装,

         使得Java程序员可以随心所欲的使用面向对象的编程思维来操纵数据库。Hibernate可以应用在任何使用JDBC的场合

   原理:通过对jdbc的封装,对 java类和关系数据库进行mapping(映射)。改变了传统的jdbc + sql操作数据的方式。

   流程:1.读取并解析配置文件和映射信息,创建SessionFactory

                    2.打开Sesssion

                    3.创建事务Transation

                    4.持久化操作

                    5.提交事务

                    6.关闭Session和SesstionFactory

        为什么要用:1.对JDBC访问数据库的代码做了封装,简化了对数据访问层繁琐的重复性代码。

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

               3.轻量级框架,性能好。映射灵活,支持各种关系数据库,从一对一到多对多的各种复杂关系.

2.什么是Hibernate 的抓取策略?       

答:抓取策略是指当应用程序需要利用关联关系进行对象获取的时候采取的策略。

3.hibernatesession.load()session.get()的区别

答:1.get()方法直接返回实体类,load()方法可以返回实体的代理类实例。

2.load是采用延迟机制(当lazy属性为true时) 而get不采用延迟机制

3.找不到符合条件的数据 get方法将返回null,load会报出ObjectNotFoundExcepion异常

    4.get支持多态查询,load只有在lazy=false的情况下才支持多态查询

    多态查询:就是可以明确区分加载的是什么类型的对象。

    延迟加载:Hibernate尽量延迟向数据库发送sql,它自己有一个缓冲区,先把sql放在里面,最后一起发送,减少网络和数据库开销。

4.HibernatesavepersistsaveOrUpdate这三个方法有何异同?

答:这三个方法都是用于将对象保存到数据库的方法。

    细微区别:1.save()只能添加数据,saveOrUpdate()可以进行数据的添加和更新。

                   2.save()的返回值是一个Serializable对象,而persist()方法返回值为void。

5.Hibernate中的命名SQL查询指的是什么?

答:命名SQL查询指的是用<sql-query>标签在映射文件中定义的SQL查询。

使用Session.getNamedQuery()方法对它进行调用,能用指定的名字拿到某个特定的查询。

Hibernate中的命名查询可以使用注解和xml映射来定义。@NameQuery用来定义单个命名查询@NameQueries用来定义多个命名查询。

6.hibernate中的SessionFactory有什么作用? SessionFactory是线程安全的吗?

答:是线程安全的。SessionFactory就是用来创建Session对象的工厂。

    SessionFactory通常是在应用程序启动时创建好的,代码用它来获得Session对象。

7.Hibernate中的Session指的是什么? 可将单个Session在多个线程间进行共享吗?   

答:session负责维护同数据库的连接,线程不安全。Hibernage中的Session不能在多个线程间进行共享。

8.hibernatesorted collectionordered collection有什么不同?

答:sorted collection是通过使用Comparator在内存中进行排序的,

    ordered collection中的排序用的是数据库order by子句。

        对于比较大的数据集,为了避免在内存中进行排序而出现 OutOfMemoryError异常,最好使用ordered collection。

9.HibernateSessionlock()方法有什么作用?

答:Session的lock()方法重建了关联关系却并没有跟数据库进行同步和更新。

10.Hibernate中二级缓存指的是什么?    

答:二级缓存是在SessionFactory这个级别维护的缓存,通过减少跟数据库交互而提高性能。

    二级缓存是针对整个应用程序而不是某个特定session的。

11.Hibernate中的查询缓存是什么?

答:查询缓存实际上保存的是sql查询的结果,这样再进行相同sql查询时就可以直接从缓存中拿到结果。

为了提高性能,查询缓存可以和二级缓存一起使用。

12.为什么说在Hibernate的实体类中要提供一个无参数的构造器(构造方法)?

答:因为Hibernate框架要使用Reflection API,通过调用Class.newInstance()来创建这些实体类的实例。如果在实体类中找不到无参数的构造器,这个方法就会抛出一个InstantiationException异常[ɪnstænʃɪ'eɪʃən]。

13.可不可以将Hibernate的实体类定义为final?

答:可以将Hibernate的实体类定义为final类,但这种做法不好。

    因为Hibernate会使用代理模式在延迟关联的情况下提高性能,如果把实体类定义成final类,Java不允许对final类进行扩展,

    所以Hibernate就无法再使用代理,如此一来就限制了提升性能的手段。       

14.什么是Hibernate延迟加载?

答:延迟加载机制是为了避免一些无谓的性能开销而提出来的,延迟加载就是当在真正需要数据的时候,才执行数据加载操作。

    Hibernate尽量延迟向数据库发送sql,它自己有一个缓冲区,先把sql放在里面,最后一起发送,减少网络和数据库开销。

在Hibernate中提供了对实体对象及集合的延迟加载,在Hibernate3中还提供了对属性的延迟加载。

15.什么是Hibernate的缓存机制(策略)

答:Hibernate 中提供了两级Cache [kæʃ](高速缓冲存储器)。

一级缓存Session级别属于事务范围的缓存。由hibernate管理一般情况下无需进行干预;

当应用程序调用Session的save()、update()、saveOrUpdate()、get()或load(),以及调用查询接口的 list()、iterator()或filter()方法时,如果在Session缓存中还不存在相应的对象,Hibernate就会把该对象放到一级缓存中。当清理缓存时,Hibernate会根据缓存中对象的状态变化来同步更新数据库。

Session为应用程序提供了两个管理缓存的方法:

evict(Object obj):清除缓存中指定参数的持久化对象。 clear():清空缓存中所有持久化对象。

二级缓存SessionFactory级别属于进程或群集范围的缓存。可以进行配置和更改,也可以动态加载和卸载。

Hibernate的二级缓存策略是针对ID查询的缓存策略,对于条件查询没有作用。因此,Hibernate提供了针对条件查询的Query Cache。Hibernate还为查询结果提供了一个查询缓存,它依赖于二级缓存。

16.Hibernate的查询(检索)方式有几种? 

答:本地SQL查询、Criteria[kraɪ'tɪərɪə]、Hql  

17.什么样的数据适合存放到Hibernate的二级缓存中?什么样的数据不适合?

答:1 很少被修改的数据

2 不是很重要,允许出现偶尔并发的数据

3 不会被并发访问的数据

    4 参考数据,指的是供应用参考的常量数据,它的实例数目有限,会被许多其他类的实例引用,实例极少或者从来不会被修改。

不适合: 1.经常被修改的数据

         2.财务数据,绝对不允许出现并发

         3.与其他应用共享的数据。

 

18.配置hibernate二级缓存的主要步骤是什么?

      1.选择需要使用二级缓存的持久化类,设置它的命名缓存的并发访问策略。

        2.选择合适的缓存插件,编辑该插件的配置文件。

19.Hibernate的优化策略有哪些?

答:1.用最新版本的hibernate

    2.采用合理的session管理机制

         3.制定合理的缓存策略

         4.尽量使用延迟加载

         5.对于很多大文本、大文件设定合理的批处理参数(batch-size)

         6.如果可以,选用uuid作为主键生成器

         7.如果可以,选用基于version的乐观锁替代悲观锁

         8.开发过程中,打开hibernate的SQl日志输出(hibernate.show_sql=true),

通过观察hibernate生成的sql语句了解其实现原理,进一步优化。

20. Struts+Hibernate+Spring开发模式中Hibernate扮演的角色是什么?

答:Hibernate扮演的是数据持久层,作用是实现持久化对象和数据库表之间的映射,形成持久化对象和数据库表中数据的转换平台 

21. 简述Hibernate的优点 

答:1.开源和免费,我们可以在需要的时候研究、改写源代码,进行功能的定制。

    2.轻量级封装,简化了过多复杂问题,调试容易,减轻开发人员的负担。   

    3.具有扩展性,开放API,当本身功能不够用时,我们可以自己编码进行扩展。

 

 

22.什么是struts,它的工作机制及为什么要用?

答:Struts是最早的java开源框架之一,是MVC设计模式的一个优秀实现。定义了通用的Controller(控制器),通过配置文件(Struts -config.xml)隔离Model(模型)和View(视图),以Action的概念对用户请求进行封装,使代码更加清晰易读。还提供了自动将请求的数据填充到对象中以及页面标签等简化编码的工具。可以开发大型Java Web项目。

(View:沿用JSP,HTTP,Form,Tag,Resourse ;Controller:ActionServlet  ,struts-config.xml,Action)

流程:在web应用启动时就会加载初始化ActionServlet,ActionServlet从 struts-config.xml文件中读取配置信息,把它们存放到各种配置对象中, 当ActionServlet接收到一个客户请求时,将执行以下流程. 

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

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

(3)根据配置信息看是否需要表单验证.如果需要验证,就调用ActionForm的validate()方法; |ˈvælɪdeɪt|

(4)如果ActionForm的validate()方法返回null或返回一个不包含ActionMessage的ActionErrors对象, 就表示表单验证成功; 

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

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

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

为什么要用:JSP+Servlet+JavaBean构建的系统非常的繁乱。基于Struts开发的应用不用再考虑公共问题,开发人员可以专注在业务实现上。结构清晰统一,易于维护。

23. struts1.2struts2.0的区别?如何控制两种框架中的单例模式?

答:  a、Action类: Struts 1要求Action类继承一个抽象基类;它的一个具体问题是使用抽象类编程而不是接口。

                  Struts 2的Action类可以实现一个Action接口,也可以实现其他接口,使可选和定制的服务成为可能。

Struts 2提供一个ActionSupport基类去实现常用的接口。Action接口不是必须要实现的,只要有一个包含execute方法的POJO类都可以用作Struts 2的Action。(POJO是一个简单的、正规Java对象,它包含业务逻辑处理或持久化逻辑等,但不是JavaBean、EntityBean等,不具有任何特殊角色和不继承或不实现任何其它Java框架的类或接口。)    

          b、线程模式 :struts1 的Action是单例模式并且必须是线程安全,因为仅有一个Action的实例来处理所有的请求。

                  限制了Struts1的 Action能做的事情,开发时要特别小心。Action资源必须是线程安全或同步的。 

                     struts2的 Action为每一个请求产生一个实例,所以没有线程安全问题。    

     c、Servlet依赖: 

Struts 1的Action依赖于Servlet API,因为Struts 1 Action的execute方法中有HttpServletRequest和HttpServletResponse方法。

Struts 2的Action不依赖于Servlet API,允许Action脱离Web容器运行,降低了测试Action的难度。如果Action需要直接访问HttpServletRequest和HttpServletResponse参数,Struts 2 的Action仍然可以访问。但是,大部分时候,Action都无需直接访问。给开发者提供了更多灵活的选择。

     

     d、可测性 :Struts1的 Action测试的一个主要问题是execute方法暴露了Servlet API(这使得测试要依赖于容器)。  

              Struts2 的Action可以通过初始化、设置属性、调用方法来测试,使测试更容易。

 

24.谈谈你对MVC的理解     

答:MVC是Model—View—Controller的简称。即模型—视图—控制器。

MVC是一种设计模式,强制性的把应用程序的输入、处理和输出分开。MVC中的模型、视图、控制器分别担负着不同的任务。     

视图: 视图是用户看到并与之交互的界面。视图向用户展示相关的数据,并接受用户的输入,不进行任何业务逻辑处理。     

模型: 模型表示业务数据和业务处理。相当于JavaBean。一个模型能为多个视图提供数据。提高了应用程序的复用性     

控制器: 当用户单击Web页面中的提交按钮时,控制器接受请求并调用相应的模型去处理请求,然后根据处理的结果调用相应的视图来展示处理的结果。     

MVC的处理过程:首先控制器接受用户的请求,调用相应的模型来进行业务处理,并返回数据给控制器。控制器调用相应的视图来显示处理的结果。并通过视图呈现给用户。

25.项目中为什么使用SSH 

1. 使用Struts是因为struts是基于MVC模式,很好的将应用程序进行了分层,结构清晰。使开发人员更关注于业务逻辑的实现;

  struts有着丰富的taglib,如果能灵活运用,则能大大提高开发效率。 

2. 使用Hibernate:是因为Hibernate为Java应用提供了一个好用且高效率的对象关系映射框架。

 它是一个轻量级的持久层框架,功能丰富。 

    3. 使用Spring:因为Spring基于IoC(Inversion of Control)和AOP构架多层J2EE系统的框架,

    不强迫你必须在每一层中必须使用Spring,它模块化比较好,允许你根据自己的需求来使用某一模块; 

      采用IoC使得可以很容易的实现bean的装配,提供了简洁的AOP并据此实现事务管理(Transcation Managment)等等。

26.struts中的action是单实例还是多实例,为什么? 

答:action是单实例的。当多个用户访问一个请求的时候,服务器内存中只有一个与之对应的action类对象。 

因为当服务器第一次加载struts的配置文件,创建了一个Action后,每发送一个请求,服务器都会先去检索相应的范围内(request,session)是否存在这么一个action实例,如果存在,则使用这个实例,如果不存在,则创建一个action实例。

27. dispatchAction是用什么技术实现的? [dɪˈspætʃ]

答:DispatchAction 是Aciton的一个子类,主要解决了一个请求处理多个功能的问题,dispatchAction是用的Action这么一个技术。

28.什么是Hibernate的并发机制?怎么处理?   

答:Hibernate的Session对象是非线程安全的,对于单个请求、会话、工作单元(即单个事务,单个线程),通常只使用一次就丢弃。

如果一个Session 实例允许共享的话,那些支持并发运行的例如Http request,session beans将会导致争抢资源。

如果在Http Session中有hibernate的Session的话,就可能会出现同步访问Http Session。只要用户足够快的点击“刷新”, 就会导致两个并发运行的线程使用同一个Session。多个事务并发访问同一块资源,可能会引发丢失更新,脏读,幻读,不可重复读一系列的问题。     

解决方案:设置事务隔离级别。        

29. Hibernatespring的联系     

 答:Hibernate中的一些对象可以给Spring来管理,让Spring容器来创建hibernate中一些对象的实例。例如:SessionFactory,HibernateTemplate等。Hibernate本来是对数据库的一些操作,放在DAO层,而Spring给业务层的方法定义了事务,业务层调用DAO层的方法,很好的将Hibernate的操作加入到事务中来。

 30. Hibernate自带的分页机制是什么?如果不使用Hibernate自带的分页,则采用什么方式分页? 

 答:a.hibernate自带的分页机制:获得Session对象后,从Session中获得Query对象。用Query.setFirstResult():设置要显示的第一行   数据, Query.setMaxResults():设置要显示的最后一行数据。   b.不使用hibernate自带的分页,可采用sql语句分页.

 如:5表示每页显示的记录数,2表示当前页: select * top 5 from table where tabId not in (select tabId top (2-1)*5 from table); 

31.hibernate的三种状态之间如何转换 

 答:当对象由瞬时状态(Transient)save()时,就变成了持久化状态。 

      当我们在Session里存储对象的时候,实际上是在Session的Map里存了一份,也就是它的缓存里放了一份,然后,又到数据库里存了一份,在缓存里这一份叫持久对象(Persistent)。当Session  Close()时,缓存也都关闭了,整个Session失效,此时对象变成游离状态(Detached),但数据库中还是存在的。 当游离状态(Detached) update()时,又变为了持久状态(Persistent)。 

 当持久状态(Persistent) delete()时,又变为了瞬时状态(Transient),此时,数据库中没有与之对应的记录。

32. hibernate拒绝连接、服务器崩溃的原因?最少写5 

1. 数据库没有打开 ,配置有问题  。

2. 网络连接出现问题   

3. 连接配置出错

4. 驱动的driver,url不对。

5. LIB下没有加入相应驱动

6. 当前连接太多,服务器有访问人数限制     7. 服务器的相应端口没打开,即它不提供相应的服务。

33.什么是Spring

Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架. spring的设计思想是,单例模式和工厂模式

34.Spring7大优点是什么?

轻量级:Spring在大小和透明性方面属于轻量级,基础版本的Spring框架大约只有2MB。

控制反转(IOC):Spring使用控制反转技术实现了松耦合。依赖被注入到对象,而不是创建或寻找依赖对象。

面向切面编程(AOP): Spring支持面向切面编程,同时把应用的业务逻辑与系统的服务分离开来。

容器:Spring包含并管理对象的配置及生命周期。

MVC框架:Spring的web框架是一个设计优良的web MVC框架,很好的取代了一些web框架。

事务管理:Spring对本地业务和全局业务(JAT)提供了统一的事务管理接口。

异常处理:Spring提供了一个方便的API将特定技术的异常(由JDBC, Hibernate, 或JDO抛出的异常)转化为统一的Unchecked异常。

35.Spring框架有哪些模块?

(1)spring  AOP  --面象切面编程  

(2)spring  DAO  --数据访问对象  

(3)spring  ORM   --对象关系映射  

(4)spring  Context  -- 上下文配置,向Spring框架提供上下文信息  

(5)spring  WEB  - -WEB上下文模块  

(6)spring  WEB-MVC  --实现了MVC  

(7)spring  CORE –核心容器.提供Spring框架基本功能 

36.解释核心容器(应用上下文)模块

答:核心容器模块是Spring的基本模块,提供了Spring框架的基本功能。BeanFactory 是所有Spring应用的核心。

Spring框架是建立在这个模块之上的,使得Spring成为一个容器。

37.BeanFactory – BeanFactory 实例

BeanFactory是工厂模式的一种实现,它使用控制反转将应用的 配置和依赖 与  实际的应用代码 分离开来。

最常用的BeanFactory实现是XmlBeanFactory类。

38.XmlBeanFactory

最常用的就是org.springframework.beans.factory.xml.XmlBeanFactory,它根据XML文件中定义的内容加载beans。该容器从XML文件中读取配置元数据来创建一个完备的系统或应用。

39.解释AOP模块

AOP模块用来开发Spring应用程序中具有切面性质的部分。该模块的大部分服务由AOP Alliance提供,保证了Spring框架和其他AOP框架之间的互操作性。另外,该模块将元数据编程引入到了Spring。əˈlaɪəns

40.解释抽象JDBCDAO模块

通过使用抽象JDBC和DAO模块保证了与数据库连接代码的整洁与简单,避免了由于未能关闭数据库资源引起的问题。它在多种数据库服务器的错误信息基础上提供了一个很重要的异常层。还利用Spring的AOP模块为Spring应用程序中的对象提供事务管理服务。

41.解释对象/关系映射集成模块

Spring通过提供ORM模块在JDBC的基础上支持对象关系映射工具。使Spring可以集成主流的ORM框架,包括Hibernate,、JDO、ibatis、ojb、jpa、toplink 。Spring的事务管理可以同时支持以上某种框架和JDBC。

42..解释web模块

Spring的web模块建立在应用上下文(application context)模块之上,提供了一个适合基于web应用程序的上下文环境。该模块还支持了几个面向web的任务,如透明的处理多文件上传请求及将请求参数同业务对象绑定起来。

43.解释Spring MVC模块

Spring提供MVC框架构建web应用程序。Spring可以很轻松的同其他MVC框架结合,但Spring的MVC是个更好的选择,因为它通过控制反转将控制逻辑和业务对象完全分离开来。

44.Spring的配置文件

Spring的配置文件是一个XML文件,文件包含了类信息并描述了这些类是如何配置和互相调用的。

45.Spring IoC容器是什么?

Spring IOC容器负责创建、管理(通过依赖注入)、整合、配置对象以及管理这些对象的生命周期。

46.IOC有什么优点?

1.IOC或依赖注入减少了应用程序的代码量。

2.使得应用程序的测试很简单,因为在单元测试中不再需要单例或JNDI查找机制。

3.简单的实现以及较少的干扰机制使得松耦合得以实现。

4.IOC容器支持勤性单例及延迟加载服务。

(在类定义的时候,不是在调用get_instance时,创建了@@instance实例对象,因此称为勤性单例,

而在引入singleton的单例模式称为惰性单例)

47.spring常用的三种应用上下文是什么?

FileSystemXmlApplicationContext 从文件系统中获取xml文件来加载一个上下文。

ClassPathXmlApplicationContext从classpath处获取xml文件来加载一个上下文。

WebXmlApplicationContext:从web应用获取xml文件来加载一个上下文。

48.Bean FactoryApplicationContext有什么区别?

ApplicationContext提供了一种解决文档信息的方法,一种加载文件资源的方式,他们可以向监听他们的beans发送消息。另外,容器或者容器中beans的操作,这些必须以bean工厂的编程方式处理的操作可以在应用上下文中以声明的方式处理。应用上下文实现了MessageSource接口,该接口用于获取本地消息,实际的实现是可选的。

BeanFactory是工厂模式的一种实现,它使用控制反转将应用的 配置和依赖 与  实际的应用代码 分离开来。

49.什么是Spring Beans

Spring Beans是构成Spring应用核心的Java对象。这些对象由Spring IOC容器实例化、组装、管理。通过容器中配置的元数据创建。

50.Spring Bean中定义了什么内容?

Spring Bean中定义了所有的配置元数据,这些配置信息告诉容器如何创建它,它的生命周期以及依赖关系。

51.怎么向Spring 容器提供配置的元数据?

有三种方式向Spring 容器提供元数据:   基于XML配置文件  基于注解配置  基于Java的配置

52.如何定义bean的作用域?

答:通过“scope”属性定义。例如,当Spring需要每次产生一个新的bean实例时,应该声明bean的scope属性为prototype。proʊtətaɪp

如果希望Spring每次返回一个实例,应该声明bean的scope属性为singleton。sɪŋɡəltən

 

53.说一下Spring中支持的bean作用域

Spring框架支持如下五种不同的作用域:    bean默认的scope属性是’singleton‘。

singleton:在Spring IOC容器中仅存在一个Bean实例,Bean以单实例的方式存在。

prototype:一个bean可以定义多个实例。

request:每次HTTP请求都会创建一个新的Bean。      该作用域仅适用于Web 的ApplicationContext环境。

session:一个HTTP Session定义一个Bean。            该作用域仅适用于Web的ApplicationContext环境.

globalSession:同一个全局HTTP Session定义一个Bean。该作用域同样仅适用于Web的ApplicationContext环境.

54.Spring框架中单例beans是线程安全的吗?

答:不是,Spring框架中的单例beans不是线程安全的。

55.解释Spring框架中bean的生命周期

a.Spring容器 从XML 文件中读取bean的定义,并实例化bean。 Spring根据bean的定义填充所有的属性。

如果bean实现了BeanNameAware 接口,Spring 传递bean 的ID 到 setBeanName方法。

如果Bean 实现了 BeanFactoryAware 接口, Spring传递beanfactory 给setBeanFactory 方法。

如果有任何与bean相关联的BeanPostProcessors,Spring会在postProcesserBeforeInitialization()方法内调用它们。

如果bean实现IntializingBean了,调用它的afterPropertySet方法,如果bean声明了初始化方法,调用此初始化方法。

如果有BeanPostProcessors 和bean 关联,这些bean的postProcessAfterInitialization() 方法将被调用。

如果bean实现了 DisposableBean,它将调用destroy()方法。

b. (1)实例化(必须的)构造函数构造对象

  (2)装配(可选的)为属性赋值

  (3)回调(可选的)(容器-控制类和组件-回调类)

  (4)初始化(init-method=" ")

 (5)就绪

  (6)销毁(destroy-method=" ")

56.哪些是最重要的bean生命周期方法?能重写它们吗?

答:第一个是setup方法,该方法在容器加载bean的时候被调用。

    第二个是teardown方法,该方法在bean从容器中移除的时候调用。

bean标签有两个重要的属性(init-method 和 destroy-method),通过这两个属性定义自己的初始化方法和析构方法。

Spring也有相应的注解:@PostConstruct 和 @PreDestroy。

57.什么是Spring的内部bean

当一个bean被用作另一个bean的属性时,这个bean可以被声明为内部bean。内部bean总是匿名的并且它们的scope总是prototype。

58.如何在Spring中注入Java集合类?

Spring提供如下几种类型的集合配置元素:

list元素用来注入一系列的值,允许有相同的值。

set元素用来注入一些列的值,不允许有相同的值。

map用来注入一组”键-值”对,键、值可以是任何类型的。

props也可以用来注入一组”键-值”对,这里的键、值都是字符串类型。

59.什么是bean wiring

Wiring,或者说bean Wiring是指beans在Spring容器中结合在一起的情况。当装配bean的时候,Spring容器需要知道需要哪些beans以及怎样使用依赖注入将它们结合起来。

60.什么是bean自动装配?

答:Spring 能自动装配bean 与 bean之间的依赖关系,即无须使用 ref显式指定依赖bean,由 BeanFactory 检查 XML 配置文件内容,根据某种规则,为主调 bean 注入依赖关系。

61.解释自动装配的各种模式?

自动装配提供五种不同的模式供Spring容器自动装配beans之间的依赖注入:

no:默认方式不进行自动装配,通过手工设置ref 属性来进行装配bean。

byName:通过参数名自动装配,Spring容器查找beans的属性,这些beans在XML配置文件中被设置为byName。之后容器试图匹配、装配和该bean的属性具有相同名字的bean。

byType:通过参数的数据类型自动装配,Spring容器查找beans的属性,这些beans在XML配置文件中被设置为byType。之后容器试图匹配和装配和该bean的属性类型一样的bean。如果有多个bean符合条件,则抛出错误。

constructor:通过参数的数据类型自动装配(应用于构造函数的参数)。如果在BeanFactory中不是恰好有一个bean与构造函数参数类型相同,则抛出一个严重的错误。

autodetect:如果有默认的构造方法,通过 constructor的方式自动装配,否则使用 byType的方式自动装配。

62.自动装配有哪些局限性?   自动装配有如下局限性:

重写:你仍然需要使用 < property>设置指明依赖,这意味着总要重写自动装配。

原生数据类型:不能自动装配简单的属性,比如原生类型、字符串和类。

模糊特性:自动装配没有自定义装配精确。

63.可以在Spring中注入null或空字符串吗?

完全可以。

Spring注解

64.什么是Spring基于Java的配置?给出一些注解的例子

答:基于Java的配置是允许使用Java的注解进行Spring的大部分配置而非通过传统的XML文件配置。

以注解@Configuration为例,它用来标记类,说明作为beans的定义,可以被Spring IOC容器使用。另一个例子是@Bean注解,它表示该方法定义的Bean要被注册进Spring应用上下文中。

65.什么是基于注解的容器配置?

答:另外一种替代XML配置的方式为基于注解的配置,这种方式通过字节元数据装配组件而非使用尖括号声明。开发人员将直接在类中进行配置,通过注解标记相关的类、方法或字段声明,而不再使用XML描述bean之间的关系。

66.如何开启注解装配?

答:默认在Spring容器中不开启。如果想要开启只需在Spring配置文件中配置元素即可。

67.@Required 注解

@Required注解 属性检查 但他只检查属性是否已经设置不检查是否非空,属性可以在bean的定义中明确指定也可通过自动装配设置。如果bean的属性未设置,则抛出BeanInitializationException异常。

68.@Autowired 注解

@Autowired注解 提供更加精细的控制,包括自动装配在何处完成以及如何完成。它可以像@Required一样自动装配setter方法、构造器、属性或者具有任意名称或多个参数的方法。

69. @Qualifier 注解  ˈkwɒlɪfaɪə(r)

当有多个相同类型的bean而只有其中的一个需要自动装配时,将@Qualifier 注解和@Autowire 注解结合使用消除这种混淆,指明需要装配的bean。

Spring数据访问

70.Spring框架中如何更有效的使用JDBC

使用Spring JDBC框架,资源管理以及错误处理的代价都会减轻。开发人员只需通过statements和queries语句从数据库中存取数据。Spring框架中通过使用模板类(比如JdbcTemplate)能更有效的使用JDBC。

71.JdbcTemplate

JdbcTemplate类提供了许多方法,为我们与数据库的交互提供了便利。例如,它可以将数据库的数据转化为原生类型或对象,执行写好的或可调用的数据库操作语句,提供自定义的 数据库错误 处理功能。

72.SpringDAO的支持

Spring对数据访问对象(DAO)的支持旨在使它可以与数据访问技术(如 JDBC, Hibernate 及JDO)方便的结合起来工作。这使得我们可以很容易在的不同的持久层技术间切换,编码时也无需担心会抛出特定技术的异常。

73.使用Spring可以通过什么方式访问Hibernate

答:两种   1.使用Hibernate Template的反转控制以及回调方法  2.继承HibernateDAOSupport,并申请一个AOP拦截器节点

74.Spring支持的ORM

答:Spring支持的ORM:Hibernate,iBatis,JPA (Java -Persistence API),TopLink,JDO (Java Data Objects),OJB

75.如何通过HibernateDaoSupportSpringHibernate结合起来?

答:使用Spring的SessionFactory 调用LocalSessionFactory。结合的过程分为以下三步:

    1.配置Hibernate SessionFactory   2.继承HibernateDaoSupport实现一个DAO    3.使用AOP装载事务支持

76.Spring支持的事务管理类型

答:a.编程式事务管理:意味着可以通过编程的方式管理事务,灵活性强,难维护。

    b.声明式事务管理:意味着可以将事务管理和业务代码分离。通过注解或XML配置事务管理。

77.Spring框架的事务管理有哪些优点?

答:1.为不同的事务API(如JTA, JDBC, Hibernate, JPA, 和JDO)提供了统一的编程模型。

    2.为编程式事务管理提供了一个简单的API而非一系列复杂的事务API(如JTA).

    3.支持声明式事务管理。

    4.可以和Spring 的多种数据访问技术很好的融合。

78.你更推荐那种类型的事务管理?

答:选择声明式事务管理,因为这种方式与应用程序的关联较少,更加符合轻量级容器的概念。

    声明式事务管理要优于编程式事务管理,尽管灵活性方面弱于编程式事务管理(这种方式允许你通过代码控制业务)。

Spring面向切面编程(AOP)

79.解释AOP

面向切面编程,允许开发人员模块化横向业务逻辑,或定义核心部分的功能,例如日志和事务管理。

80.切面(Aspect)   ['æspekt]

AOP的核心就是切面,它将多个类的通用行为封装为可重用的模块,该模块含有一组API提供 cross-cutting功能。例如,日志模块称为日志的AOP切面。根据需求的不同,一个应用程序可以有若干切面。在Spring AOP中,切面通过带有@Aspect注解的类实现。

81.Spring AOPconcern cross-cutting concern的区别是什么?

Concern(核心逻辑):表示在应用程序中一个模块的行为。Concern可以定义为我们想要实现的功能。

Cross-cutting concern(横向的通用逻辑):指的是整个应用程序都会用到的功能,它影响整个应用程序。例如,日志管理(Logging)、安全管理(Security)sɪˈkjʊərəti以及数据交互是应用程序的每个模块都要涉及到的,因此这些都属于Cross-cutting concern。

82.连接点(Join point)

连接点代表应用程序中插入AOP切面的地点。它实际上是Spring AOP框架在应用程序中执行动作的地点。

83.通知(Advice)

通知表示在方法执行前后需要执行的动作。实际上它是Spring AOP框架在程序执行过程中触发的一些代码。

Spring切面可以执行以下五种类型的通知:

before(前置通知):在一个方法之前执行的通知。

after(最终通知):当某连接点退出时执行的通知(不论是正常返回还是异常退出)。

after-returning(后置通知):在某连接点正常完成后执行的通知。

after-throwing(异常通知):在方法抛出异常退出时执行的通知。

around(环绕通知):在方法调用前后触发的通知。

84.切入点(Pointcut)

切入点是一个或一组连接点,通知将在这些位置执行。可以通过表达式或匹配的方式指明切入点。

85.什么是引入?

引入允许我们在已有的类里添加新的方法或属性。

86.什么是目标对象?

被一个或者多个切面所通知的对象。它通常是一个代理对象。也被称做被通知(advised)对象。

87.什么是代理?

代理是将通知 应用到目标对象后 创建的对象。从客户端的角度看,代理对象和目标对象是一样的。

88.有几种不同类型的自动代理?

BeanNameAutoProxyCreator:bean名称自动代理创建器

DefaultAdvisorAutoProxyCreator:默认通知者自动代理创建器

Metadata autoproxying:元数据自动代理

89.什么是织入?什么是织入应用的不同点

答:织入是将切面和其他应用类型或对象连接起来创建一个通知对象的过程。织入可以在编译、加载或运行时完成。

90.解释基于XML Schema方式的切面实现

答:在这种情况下,切面由使用XML文件配置的类实现。

91.解释基于注解方式(基于@AspectJ)的切面实现

答:在这种情况下(基于@AspectJ的实现),指的是切面的对应的类使用Java 5注解的声明方式。

92.DispatcherServlet

答:Spring的MVC框架围绕DispatcherServlet来设计的,它用来处理所有的HTTP请求和响应。

93.WebApplicationContext

WebApplicationContext继承了ApplicationContext,并添加了一些web应用程序需要的功能。和普通的ApplicationContext 不同,WebApplicationContext可以用来处理主题样式,它也知道如何找到相应的servlet。

94.什么是Spring MVC框架的控制器?

控制器提供对应用程序行为的访问,通常通过服务接口实现。控制器解析用户的输入,并将其转换为一个由视图呈现给用户的模型。Spring 通过一种极其抽象的方式实现控制器,它允许用户创建多种类型的控制器。

95.@Controller   annotation  @Controller注解表示该类扮演控制器的角色。Spring不需要继承任何控制器基类或应用Servlet API。

96.@RequestMapping  annotation(注解)

@RequestMapping注解用于将URL映射到任何一个类或者一个特定的处理方法上。

96.你一般用spring做什么?    控制反转IOC  AOP

97.项目中如何体现Spring中的切面编程,举例说明。 

答:项目中用到的Spring中的切面编程最多的地方:声明式事务管理。    

   1.定义一个事务管理器 

    2.配置事务特性(相当于声明 通知。一般在业务类的方法上定义事务)    

   3.配置哪些类的哪些方法需要配置事务(相当于切入点。一般也是在业务类的方法上)     

98. spring中可以用注入获得属性值,还有其他的方式吗?    答:读取配置文件   

99. spring在项目中如何充当粘合剂   

答:1、在项目中利用spring的IOC(控制反转或依赖注入),明确地定义组件接口(比如UserDAO),开发者可以独立开发各个组件, 然后根据组件间的依赖关系组装(UserAction依赖于UserBiz:业务逻辑层,UserBiz依赖于UserDAO)运行,很好的把Struts(Action)和hibernate(DAO的实现)结合起来了。 

     2、spring的事务管理把hibernate对数据库的操作进行了事务配置。  

100.什么是Ajax?      eɪˈsɪŋkrənəs

AJAX“Asynchronous Javascript And XML”(异步JavaScript和XML)是一种用于创建更好更快及交互性更强的Web应用程序技术。

通过在后台与服务器进行少量的数据交换,在不重新加载整个页面的情况下,实现对局部页面的异步更新。

101. Ajax的工作原理? 简单来说通过XmlHttpRequest对象向服务器发送异步请求、获得数据然后用javascript操作DOM更新页面.

102.什么是struts2?工作原理是什么?

答:Struts 2 是融合了Struts 和 WebWork用来建立企业级Java Web 应用程序的框架。不仅注重程序的开发过程,还注重部署和后期维护。使用了责任链(Chain of Responsibility)设计模式和命令(Command)设计模式。

工作原理分为4步:

1.客户端向Action发送一个请求,容器通过web.xml 映射请求,得到控制器名字 然后调用控制器(StrutsPrepareAndExecuteFilter或FilterDispatcher)。在Struts2.1以前调用FilterDispatcher,Struts2.1以后调用StrutsPrepareAndExecuteFilter

2.控制器(Controller)通过ActionMapper获得Action的信息并调用代理对象ActionProxy  ['prɒksɪ]。

3.代理对象(ActionProxy)通过读取struts.xml文件获取action和拦截器栈的信息。把request请求传递给action的调用者(ActionInvocation)[ˌɪnvəˈkeɪʃn]

4.ActionInvocation依次调用action和interceptor(拦截器)。根据action的配置信息产生结果result。Result信息返回给ActionInvocation产生一个HttpServletResponse响应,把响应行为发送给客户端。

103.什么是struts,它的工作机制及为什么要用?

答:Struts是最早的java开源框架之一,是MVC设计模式的一个优秀实现。定义了通用的Controller(控制器),通过配置文件(Struts -config.xml)隔离Model(模型层)和View(视图层),以Action的概念对用户请求进行封装,使代码更加清晰易读。还提供了自动将请求的数据填充到对象中及页面标签等简化编码的工具。可以开发大型Java Web项目。

(View:沿用JSP,HTTP,Form,Tag,Resourse ;Controller:ActionServlet  ,struts-config.xml,Action)

流程:在web应用启动

1.什么是hibernate及hibernate工作原理、流程和为什么要用Hibernate?

答:

   定义:Hibernate是一个开放源代码的对象关系映射(ORM)框架,它对JDBC进行了非常轻量级的对象封装,

         使得Java程序员可以随心所欲的使用面向对象的编程思维来操纵数据库。Hibernate可以应用在任何使用JDBC的场合

   原理:通过对jdbc的封装,对 java类和关系数据库进行mapping(映射)。改变了传统的jdbc + sql操作数据的方式。

   流程:1.读取并解析配置文件和映射信息,创建SessionFactory

                    2.打开Sesssion

                    3.创建事务Transation

                    4.持久化操作

                    5.提交事务

                    6.关闭Session和SesstionFactory

        为什么要用:1.对JDBC访问数据库的代码做了封装,简化了对数据访问层繁琐的重复性代码。

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

               3.轻量级框架,性能好。映射灵活,支持各种关系数据库,从一对一到多对多的各种复杂关系.

2.什么是Hibernate 的抓取策略?       

答:抓取策略是指当应用程序需要利用关联关系进行对象获取的时候采取的策略。

3.hibernatesession.load()session.get()的区别

答:1.get()方法直接返回实体类,load()方法可以返回实体的代理类实例。

2.load是采用延迟机制(当lazy属性为true时) 而get不采用延迟机制

3.找不到符合条件的数据 get方法将返回null,load会报出ObjectNotFoundExcepion异常

    4.get支持多态查询,load只有在lazy=false的情况下才支持多态查询

    多态查询:就是可以明确区分加载的是什么类型的对象。

    延迟加载:Hibernate尽量延迟向数据库发送sql,它自己有一个缓冲区,先把sql放在里面,最后一起发送,减少网络和数据库开销。

4.HibernatesavepersistsaveOrUpdate这三个方法有何异同?

答:这三个方法都是用于将对象保存到数据库的方法。

    细微区别:1.save()只能添加数据,saveOrUpdate()可以进行数据的添加和更新。

                   2.save()的返回值是一个Serializable对象,而persist()方法返回值为void。

5.Hibernate中的命名SQL查询指的是什么?

答:命名SQL查询指的是用<sql-query>标签在映射文件中定义的SQL查询。

使用Session.getNamedQuery()方法对它进行调用,能用指定的名字拿到某个特定的查询。

Hibernate中的命名查询可以使用注解和xml映射来定义。@NameQuery用来定义单个命名查询@NameQueries用来定义多个命名查询。

6.hibernate中的SessionFactory有什么作用? SessionFactory是线程安全的吗?

答:是线程安全的。SessionFactory就是用来创建Session对象的工厂。

    SessionFactory通常是在应用程序启动时创建好的,代码用它来获得Session对象。

7.Hibernate中的Session指的是什么? 可将单个Session在多个线程间进行共享吗?   

答:session负责维护同数据库的连接,线程不安全。Hibernage中的Session不能在多个线程间进行共享。

8.hibernatesorted collectionordered collection有什么不同?

答:sorted collection是通过使用Comparator在内存中进行排序的,

    ordered collection中的排序用的是数据库order by子句。

        对于比较大的数据集,为了避免在内存中进行排序而出现 OutOfMemoryError异常,最好使用ordered collection。

9.HibernateSessionlock()方法有什么作用?

答:Session的lock()方法重建了关联关系却并没有跟数据库进行同步和更新。

10.Hibernate中二级缓存指的是什么?    

答:二级缓存是在SessionFactory这个级别维护的缓存,通过减少跟数据库交互而提高性能。

    二级缓存是针对整个应用程序而不是某个特定session的。

11.Hibernate中的查询缓存是什么?

答:查询缓存实际上保存的是sql查询的结果,这样再进行相同sql查询时就可以直接从缓存中拿到结果。

为了提高性能,查询缓存可以和二级缓存一起使用。

12.为什么说在Hibernate的实体类中要提供一个无参数的构造器(构造方法)?

答:因为Hibernate框架要使用Reflection API,通过调用Class.newInstance()来创建这些实体类的实例。如果在实体类中找不到无参数的构造器,这个方法就会抛出一个InstantiationException异常[ɪnstænʃɪ'eɪʃən]。

13.可不可以将Hibernate的实体类定义为final?

答:可以将Hibernate的实体类定义为final类,但这种做法不好。

    因为Hibernate会使用代理模式在延迟关联的情况下提高性能,如果把实体类定义成final类,Java不允许对final类进行扩展,

    所以Hibernate就无法再使用代理,如此一来就限制了提升性能的手段。       

14.什么是Hibernate延迟加载?

答:延迟加载机制是为了避免一些无谓的性能开销而提出来的,延迟加载就是当在真正需要数据的时候,才执行数据加载操作。

    Hibernate尽量延迟向数据库发送sql,它自己有一个缓冲区,先把sql放在里面,最后一起发送,减少网络和数据库开销。

在Hibernate中提供了对实体对象及集合的延迟加载,在Hibernate3中还提供了对属性的延迟加载。

15.什么是Hibernate的缓存机制(策略)

答:Hibernate 中提供了两级Cache [kæʃ](高速缓冲存储器)。

一级缓存Session级别属于事务范围的缓存。由hibernate管理一般情况下无需进行干预;

当应用程序调用Session的save()、update()、saveOrUpdate()、get()或load(),以及调用查询接口的 list()、iterator()或filter()方法时,如果在Session缓存中还不存在相应的对象,Hibernate就会把该对象放到一级缓存中。当清理缓存时,Hibernate会根据缓存中对象的状态变化来同步更新数据库。

Session为应用程序提供了两个管理缓存的方法:

evict(Object obj):清除缓存中指定参数的持久化对象。 clear():清空缓存中所有持久化对象。

二级缓存SessionFactory级别属于进程或群集范围的缓存。可以进行配置和更改,也可以动态加载和卸载。

Hibernate的二级缓存策略是针对ID查询的缓存策略,对于条件查询没有作用。因此,Hibernate提供了针对条件查询的Query Cache。Hibernate还为查询结果提供了一个查询缓存,它依赖于二级缓存。

16.Hibernate的查询(检索)方式有几种? 

答:本地SQL查询、Criteria[kraɪ'tɪərɪə]、Hql  

17.什么样的数据适合存放到Hibernate的二级缓存中?什么样的数据不适合?

答:1 很少被修改的数据

2 不是很重要,允许出现偶尔并发的数据

3 不会被并发访问的数据

    4 参考数据,指的是供应用参考的常量数据,它的实例数目有限,会被许多其他类的实例引用,实例极少或者从来不会被修改。

不适合: 1.经常被修改的数据

         2.财务数据,绝对不允许出现并发

         3.与其他应用共享的数据。

 

18.配置hibernate二级缓存的主要步骤是什么?

      1.选择需要使用二级缓存的持久化类,设置它的命名缓存的并发访问策略。

        2.选择合适的缓存插件,编辑该插件的配置文件。

19.Hibernate的优化策略有哪些?

答:1.用最新版本的hibernate

    2.采用合理的session管理机制

         3.制定合理的缓存策略

         4.尽量使用延迟加载

         5.对于很多大文本、大文件设定合理的批处理参数(batch-size)

         6.如果可以,选用uuid作为主键生成器

         7.如果可以,选用基于version的乐观锁替代悲观锁

         8.开发过程中,打开hibernate的SQl日志输出(hibernate.show_sql=true),

通过观察hibernate生成的sql语句了解其实现原理,进一步优化。

20. Struts+Hibernate+Spring开发模式中Hibernate扮演的角色是什么?

答:Hibernate扮演的是数据持久层,作用是实现持久化对象和数据库表之间的映射,形成持久化对象和数据库表中数据的转换平台 

21. 简述Hibernate的优点 

答:1.开源和免费,我们可以在需要的时候研究、改写源代码,进行功能的定制。

    2.轻量级封装,简化了过多复杂问题,调试容易,减轻开发人员的负担。   

    3.具有扩展性,开放API,当本身功能不够用时,我们可以自己编码进行扩展。

 

 

22.什么是struts,它的工作机制及为什么要用?

答:Struts是最早的java开源框架之一,是MVC设计模式的一个优秀实现。定义了通用的Controller(控制器),通过配置文件(Struts -config.xml)隔离Model(模型)和View(视图),以Action的概念对用户请求进行封装,使代码更加清晰易读。还提供了自动将请求的数据填充到对象中以及页面标签等简化编码的工具。可以开发大型Java Web项目。

(View:沿用JSP,HTTP,Form,Tag,Resourse ;Controller:ActionServlet  ,struts-config.xml,Action)

流程:在web应用启动时就会加载初始化ActionServlet,ActionServlet从 struts-config.xml文件中读取配置信息,把它们存放到各种配置对象中, 当ActionServlet接收到一个客户请求时,将执行以下流程. 

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

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

(3)根据配置信息看是否需要表单验证.如果需要验证,就调用ActionForm的validate()方法; |ˈvælɪdeɪt|

(4)如果ActionForm的validate()方法返回null或返回一个不包含ActionMessage的ActionErrors对象, 就表示表单验证成功; 

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

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

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

为什么要用:JSP+Servlet+JavaBean构建的系统非常的繁乱。基于Struts开发的应用不用再考虑公共问题,开发人员可以专注在业务实现上。结构清晰统一,易于维护。

23. struts1.2struts2.0的区别?如何控制两种框架中的单例模式?

答:  a、Action类: Struts 1要求Action类继承一个抽象基类;它的一个具体问题是使用抽象类编程而不是接口。

                  Struts 2的Action类可以实现一个Action接口,也可以实现其他接口,使可选和定制的服务成为可能。

Struts 2提供一个ActionSupport基类去实现常用的接口。Action接口不是必须要实现的,只要有一个包含execute方法的POJO类都可以用作Struts 2的Action。(POJO是一个简单的、正规Java对象,它包含业务逻辑处理或持久化逻辑等,但不是JavaBean、EntityBean等,不具有任何特殊角色和不继承或不实现任何其它Java框架的类或接口。)    

          b、线程模式 :struts1 的Action是单例模式并且必须是线程安全,因为仅有一个Action的实例来处理所有的请求。

                  限制了Struts1的 Action能做的事情,开发时要特别小心。Action资源必须是线程安全或同步的。 

                     struts2的 Action为每一个请求产生一个实例,所以没有线程安全问题。    

     c、Servlet依赖: 

Struts 1的Action依赖于Servlet API,因为Struts 1 Action的execute方法中有HttpServletRequest和HttpServletResponse方法。

Struts 2的Action不依赖于Servlet API,允许Action脱离Web容器运行,降低了测试Action的难度。如果Action需要直接访问HttpServletRequest和HttpServletResponse参数,Struts 2 的Action仍然可以访问。但是,大部分时候,Action都无需直接访问。给开发者提供了更多灵活的选择。

     

     d、可测性 :Struts1的 Action测试的一个主要问题是execute方法暴露了Servlet API(这使得测试要依赖于容器)。  

              Struts2 的Action可以通过初始化、设置属性、调用方法来测试,使测试更容易。

 

24.谈谈你对MVC的理解     

答:MVC是Model—View—Controller的简称。即模型—视图—控制器。

MVC是一种设计模式,强制性的把应用程序的输入、处理和输出分开。MVC中的模型、视图、控制器分别担负着不同的任务。     

视图: 视图是用户看到并与之交互的界面。视图向用户展示相关的数据,并接受用户的输入,不进行任何业务逻辑处理。     

模型: 模型表示业务数据和业务处理。相当于JavaBean。一个模型能为多个视图提供数据。提高了应用程序的复用性     

控制器: 当用户单击Web页面中的提交按钮时,控制器接受请求并调用相应的模型去处理请求,然后根据处理的结果调用相应的视图来展示处理的结果。     

MVC的处理过程:首先控制器接受用户的请求,调用相应的模型来进行业务处理,并返回数据给控制器。控制器调用相应的视图来显示处理的结果。并通过视图呈现给用户。

25.项目中为什么使用SSH 

1. 使用Struts是因为struts是基于MVC模式,很好的将应用程序进行了分层,结构清晰。使开发人员更关注于业务逻辑的实现;

  struts有着丰富的taglib,如果能灵活运用,则能大大提高开发效率。 

2. 使用Hibernate:是因为Hibernate为Java应用提供了一个好用且高效率的对象关系映射框架。

 它是一个轻量级的持久层框架,功能丰富。 

    3. 使用Spring:因为Spring基于IoC(Inversion of Control)和AOP构架多层J2EE系统的框架,

    不强迫你必须在每一层中必须使用Spring,它模块化比较好,允许你根据自己的需求来使用某一模块; 

      采用IoC使得可以很容易的实现bean的装配,提供了简洁的AOP并据此实现事务管理(Transcation Managment)等等。

26.struts中的action是单实例还是多实例,为什么? 

答:action是单实例的。当多个用户访问一个请求的时候,服务器内存中只有一个与之对应的action类对象。 

因为当服务器第一次加载struts的配置文件,创建了一个Action后,每发送一个请求,服务器都会先去检索相应的范围内(request,session)是否存在这么一个action实例,如果存在,则使用这个实例,如果不存在,则创建一个action实例。

27. dispatchAction是用什么技术实现的? [dɪˈspætʃ]

答:DispatchAction 是Aciton的一个子类,主要解决了一个请求处理多个功能的问题,dispatchAction是用的Action这么一个技术。

28.什么是Hibernate的并发机制?怎么处理?   

答:Hibernate的Session对象是非线程安全的,对于单个请求、会话、工作单元(即单个事务,单个线程),通常只使用一次就丢弃。

如果一个Session 实例允许共享的话,那些支持并发运行的例如Http request,session beans将会导致争抢资源。

如果在Http Session中有hibernate的Session的话,就可能会出现同步访问Http Session。只要用户足够快的点击“刷新”, 就会导致两个并发运行的线程使用同一个Session。多个事务并发访问同一块资源,可能会引发丢失更新,脏读,幻读,不可重复读一系列的问题。     

解决方案:设置事务隔离级别。        

29. Hibernatespring的联系     

 答:Hibernate中的一些对象可以给Spring来管理,让Spring容器来创建hibernate中一些对象的实例。例如:SessionFactory,HibernateTemplate等。Hibernate本来是对数据库的一些操作,放在DAO层,而Spring给业务层的方法定义了事务,业务层调用DAO层的方法,很好的将Hibernate的操作加入到事务中来。

 30. Hibernate自带的分页机制是什么?如果不使用Hibernate自带的分页,则采用什么方式分页? 

 答:a.hibernate自带的分页机制:获得Session对象后,从Session中获得Query对象。用Query.setFirstResult():设置要显示的第一行   数据, Query.setMaxResults():设置要显示的最后一行数据。   b.不使用hibernate自带的分页,可采用sql语句分页.

 如:5表示每页显示的记录数,2表示当前页: select * top 5 from table where tabId not in (select tabId top (2-1)*5 from table); 

31.hibernate的三种状态之间如何转换 

 答:当对象由瞬时状态(Transient)save()时,就变成了持久化状态。 

      当我们在Session里存储对象的时候,实际上是在Session的Map里存了一份,也就是它的缓存里放了一份,然后,又到数据库里存了一份,在缓存里这一份叫持久对象(Persistent)。当Session  Close()时,缓存也都关闭了,整个Session失效,此时对象变成游离状态(Detached),但数据库中还是存在的。 当游离状态(Detached) update()时,又变为了持久状态(Persistent)。 

 当持久状态(Persistent) delete()时,又变为了瞬时状态(Transient),此时,数据库中没有与之对应的记录。

32. hibernate拒绝连接、服务器崩溃的原因?最少写5 

1. 数据库没有打开 ,配置有问题  。

2. 网络连接出现问题   

3. 连接配置出错

4. 驱动的driver,url不对。

5. LIB下没有加入相应驱动

6. 当前连接太多,服务器有访问人数限制     7. 服务器的相应端口没打开,即它不提供相应的服务。

33.什么是Spring

Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架. spring的设计思想是,单例模式和工厂模式

34.Spring7大优点是什么?

轻量级:Spring在大小和透明性方面属于轻量级,基础版本的Spring框架大约只有2MB。

控制反转(IOC):Spring使用控制反转技术实现了松耦合。依赖被注入到对象,而不是创建或寻找依赖对象。

面向切面编程(AOP): Spring支持面向切面编程,同时把应用的业务逻辑与系统的服务分离开来。

容器:Spring包含并管理对象的配置及生命周期。

MVC框架:Spring的web框架是一个设计优良的web MVC框架,很好的取代了一些web框架。

事务管理:Spring对本地业务和全局业务(JAT)提供了统一的事务管理接口。

异常处理:Spring提供了一个方便的API将特定技术的异常(由JDBC, Hibernate, 或JDO抛出的异常)转化为统一的Unchecked异常。

35.Spring框架有哪些模块?

(1)spring  AOP  --面象切面编程  

(2)spring  DAO  --数据访问对象  

(3)spring  ORM   --对象关系映射  

(4)spring  Context  -- 上下文配置,向Spring框架提供上下文信息  

(5)spring  WEB  - -WEB上下文模块  

(6)spring  WEB-MVC  --实现了MVC  

(7)spring  CORE –核心容器.提供Spring框架基本功能 

36.解释核心容器(应用上下文)模块

答:核心容器模块是Spring的基本模块,提供了Spring框架的基本功能。BeanFactory 是所有Spring应用的核心。

Spring框架是建立在这个模块之上的,使得Spring成为一个容器。

37.BeanFactory – BeanFactory 实例

BeanFactory是工厂模式的一种实现,它使用控制反转将应用的 配置和依赖 与  实际的应用代码 分离开来。

最常用的BeanFactory实现是XmlBeanFactory类。

38.XmlBeanFactory

最常用的就是org.springframework.beans.factory.xml.XmlBeanFactory,它根据XML文件中定义的内容加载beans。该容器从XML文件中读取配置元数据来创建一个完备的系统或应用。

39.解释AOP模块

AOP模块用来开发Spring应用程序中具有切面性质的部分。该模块的大部分服务由AOP Alliance提供,保证了Spring框架和其他AOP框架之间的互操作性。另外,该模块将元数据编程引入到了Spring。əˈlaɪəns

40.解释抽象JDBCDAO模块

通过使用抽象JDBC和DAO模块保证了与数据库连接代码的整洁与简单,避免了由于未能关闭数据库资源引起的问题。它在多种数据库服务器的错误信息基础上提供了一个很重要的异常层。还利用Spring的AOP模块为Spring应用程序中的对象提供事务管理服务。

41.解释对象/关系映射集成模块

Spring通过提供ORM模块在JDBC的基础上支持对象关系映射工具。使Spring可以集成主流的ORM框架,包括Hibernate,、JDO、ibatis、ojb、jpa、toplink 。Spring的事务管理可以同时支持以上某种框架和JDBC。

42..解释web模块

Spring的web模块建立在应用上下文(application context)模块之上,提供了一个适合基于web应用程序的上下文环境。该模块还支持了几个面向web的任务,如透明的处理多文件上传请求及将请求参数同业务对象绑定起来。

43.解释Spring MVC模块

Spring提供MVC框架构建web应用程序。Spring可以很轻松的同其他MVC框架结合,但Spring的MVC是个更好的选择,因为它通过控制反转将控制逻辑和业务对象完全分离开来。

44.Spring的配置文件

Spring的配置文件是一个XML文件,文件包含了类信息并描述了这些类是如何配置和互相调用的。

45.Spring IoC容器是什么?

Spring IOC容器负责创建、管理(通过依赖注入)、整合、配置对象以及管理这些对象的生命周期。

46.IOC有什么优点?

1.IOC或依赖注入减少了应用程序的代码量。

2.使得应用程序的测试很简单,因为在单元测试中不再需要单例或JNDI查找机制。

3.简单的实现以及较少的干扰机制使得松耦合得以实现。

4.IOC容器支持勤性单例及延迟加载服务。

(在类定义的时候,不是在调用get_instance时,创建了@@instance实例对象,因此称为勤性单例,

而在引入singleton的单例模式称为惰性单例)

47.spring常用的三种应用上下文是什么?

FileSystemXmlApplicationContext 从文件系统中获取xml文件来加载一个上下文。

ClassPathXmlApplicationContext从classpath处获取xml文件来加载一个上下文。

WebXmlApplicationContext:从web应用获取xml文件来加载一个上下文。

48.Bean FactoryApplicationContext有什么区别?

ApplicationContext提供了一种解决文档信息的方法,一种加载文件资源的方式,他们可以向监听他们的beans发送消息。另外,容器或者容器中beans的操作,这些必须以bean工厂的编程方式处理的操作可以在应用上下文中以声明的方式处理。应用上下文实现了MessageSource接口,该接口用于获取本地消息,实际的实现是可选的。

BeanFactory是工厂模式的一种实现,它使用控制反转将应用的 配置和依赖 与  实际的应用代码 分离开来。

49.什么是Spring Beans

Spring Beans是构成Spring应用核心的Java对象。这些对象由Spring IOC容器实例化、组装、管理。通过容器中配置的元数据创建。

50.Spring Bean中定义了什么内容?

Spring Bean中定义了所有的配置元数据,这些配置信息告诉容器如何创建它,它的生命周期以及依赖关系。

51.怎么向Spring 容器提供配置的元数据?

有三种方式向Spring 容器提供元数据:   基于XML配置文件  基于注解配置  基于Java的配置

52.如何定义bean的作用域?

答:通过“scope”属性定义。例如,当Spring需要每次产生一个新的bean实例时,应该声明bean的scope属性为prototype。proʊtətaɪp

如果希望Spring每次返回一个实例,应该声明bean的scope属性为singleton。sɪŋɡəltən

 

53.说一下Spring中支持的bean作用域

Spring框架支持如下五种不同的作用域:    bean默认的scope属性是’singleton‘。

singleton:在Spring IOC容器中仅存在一个Bean实例,Bean以单实例的方式存在。

prototype:一个bean可以定义多个实例。

request:每次HTTP请求都会创建一个新的Bean。      该作用域仅适用于Web 的ApplicationContext环境。

session:一个HTTP Session定义一个Bean。            该作用域仅适用于Web的ApplicationContext环境.

globalSession:同一个全局HTTP Session定义一个Bean。该作用域同样仅适用于Web的ApplicationContext环境.

54.Spring框架中单例beans是线程安全的吗?

答:不是,Spring框架中的单例beans不是线程安全的。

55.解释Spring框架中bean的生命周期

a.Spring容器 从XML 文件中读取bean的定义,并实例化bean。 Spring根据bean的定义填充所有的属性。

如果bean实现了BeanNameAware 接口,Spring 传递bean 的ID 到 setBeanName方法。

如果Bean 实现了 BeanFactoryAware 接口, Spring传递beanfactory 给setBeanFactory 方法。

如果有任何与bean相关联的BeanPostProcessors,Spring会在postProcesserBeforeInitialization()方法内调用它们。

如果bean实现IntializingBean了,调用它的afterPropertySet方法,如果bean声明了初始化方法,调用此初始化方法。

如果有BeanPostProcessors 和bean 关联,这些bean的postProcessAfterInitialization() 方法将被调用。

如果bean实现了 DisposableBean,它将调用destroy()方法。

b. (1)实例化(必须的)构造函数构造对象

  (2)装配(可选的)为属性赋值

  (3)回调(可选的)(容器-控制类和组件-回调类)

  (4)初始化(init-method=" ")

 (5)就绪

  (6)销毁(destroy-method=" ")

56.哪些是最重要的bean生命周期方法?能重写它们吗?

答:第一个是setup方法,该方法在容器加载bean的时候被调用。

    第二个是teardown方法,该方法在bean从容器中移除的时候调用。

bean标签有两个重要的属性(init-method 和 destroy-method),通过这两个属性定义自己的初始化方法和析构方法。

Spring也有相应的注解:@PostConstruct 和 @PreDestroy。

57.什么是Spring的内部bean

当一个bean被用作另一个bean的属性时,这个bean可以被声明为内部bean。内部bean总是匿名的并且它们的scope总是prototype。

58.如何在Spring中注入Java集合类?

Spring提供如下几种类型的集合配置元素:

list元素用来注入一系列的值,允许有相同的值。

set元素用来注入一些列的值,不允许有相同的值。

map用来注入一组”键-值”对,键、值可以是任何类型的。

props也可以用来注入一组”键-值”对,这里的键、值都是字符串类型。

59.什么是bean wiring

Wiring,或者说bean Wiring是指beans在Spring容器中结合在一起的情况。当装配bean的时候,Spring容器需要知道需要哪些beans以及怎样使用依赖注入将它们结合起来。

60.什么是bean自动装配?

答:Spring 能自动装配bean 与 bean之间的依赖关系,即无须使用 ref显式指定依赖bean,由 BeanFactory 检查 XML 配置文件内容,根据某种规则,为主调 bean 注入依赖关系。

61.解释自动装配的各种模式?

自动装配提供五种不同的模式供Spring容器自动装配beans之间的依赖注入:

no:默认方式不进行自动装配,通过手工设置ref 属性来进行装配bean。

byName:通过参数名自动装配,Spring容器查找beans的属性,这些beans在XML配置文件中被设置为byName。之后容器试图匹配、装配和该bean的属性具有相同名字的bean。

byType:通过参数的数据类型自动装配,Spring容器查找beans的属性,这些beans在XML配置文件中被设置为byType。之后容器试图匹配和装配和该bean的属性类型一样的bean。如果有多个bean符合条件,则抛出错误。

constructor:通过参数的数据类型自动装配(应用于构造函数的参数)。如果在BeanFactory中不是恰好有一个bean与构造函数参数类型相同,则抛出一个严重的错误。

autodetect:如果有默认的构造方法,通过 constructor的方式自动装配,否则使用 byType的方式自动装配。

62.自动装配有哪些局限性?   自动装配有如下局限性:

重写:你仍然需要使用 < property>设置指明依赖,这意味着总要重写自动装配。

原生数据类型:不能自动装配简单的属性,比如原生类型、字符串和类。

模糊特性:自动装配没有自定义装配精确。

63.可以在Spring中注入null或空字符串吗?

完全可以。

Spring注解

64.什么是Spring基于Java的配置?给出一些注解的例子

答:基于Java的配置是允许使用Java的注解进行Spring的大部分配置而非通过传统的XML文件配置。

以注解@Configuration为例,它用来标记类,说明作为beans的定义,可以被Spring IOC容器使用。另一个例子是@Bean注解,它表示该方法定义的Bean要被注册进Spring应用上下文中。

65.什么是基于注解的容器配置?

答:另外一种替代XML配置的方式为基于注解的配置,这种方式通过字节元数据装配组件而非使用尖括号声明。开发人员将直接在类中进行配置,通过注解标记相关的类、方法或字段声明,而不再使用XML描述bean之间的关系。

66.如何开启注解装配?

答:默认在Spring容器中不开启。如果想要开启只需在Spring配置文件中配置元素即可。

67.@Required 注解

@Required注解 属性检查 但他只检查属性是否已经设置不检查是否非空,属性可以在bean的定义中明确指定也可通过自动装配设置。如果bean的属性未设置,则抛出BeanInitializationException异常。

68.@Autowired 注解

@Autowired注解 提供更加精细的控制,包括自动装配在何处完成以及如何完成。它可以像@Required一样自动装配setter方法、构造器、属性或者具有任意名称或多个参数的方法。

69. @Qualifier 注解  ˈkwɒlɪfaɪə(r)

当有多个相同类型的bean而只有其中的一个需要自动装配时,将@Qualifier 注解和@Autowire 注解结合使用消除这种混淆,指明需要装配的bean。

Spring数据访问

70.Spring框架中如何更有效的使用JDBC

使用Spring JDBC框架,资源管理以及错误处理的代价都会减轻。开发人员只需通过statements和queries语句从数据库中存取数据。Spring框架中通过使用模板类(比如JdbcTemplate)能更有效的使用JDBC。

71.JdbcTemplate

JdbcTemplate类提供了许多方法,为我们与数据库的交互提供了便利。例如,它可以将数据库的数据转化为原生类型或对象,执行写好的或可调用的数据库操作语句,提供自定义的 数据库错误 处理功能。

72.SpringDAO的支持

Spring对数据访问对象(DAO)的支持旨在使它可以与数据访问技术(如 JDBC, Hibernate 及JDO)方便的结合起来工作。这使得我们可以很容易在的不同的持久层技术间切换,编码时也无需担心会抛出特定技术的异常。

73.使用Spring可以通过什么方式访问Hibernate

答:两种   1.使用Hibernate Template的反转控制以及回调方法  2.继承HibernateDAOSupport,并申请一个AOP拦截器节点

74.Spring支持的ORM

答:Spring支持的ORM:Hibernate,iBatis,JPA (Java -Persistence API),TopLink,JDO (Java Data Objects),OJB

75.如何通过HibernateDaoSupportSpringHibernate结合起来?

答:使用Spring的SessionFactory 调用LocalSessionFactory。结合的过程分为以下三步:

    1.配置Hibernate SessionFactory   2.继承HibernateDaoSupport实现一个DAO    3.使用AOP装载事务支持

76.Spring支持的事务管理类型

答:a.编程式事务管理:意味着可以通过编程的方式管理事务,灵活性强,难维护。

    b.声明式事务管理:意味着可以将事务管理和业务代码分离。通过注解或XML配置事务管理。

77.Spring框架的事务管理有哪些优点?

答:1.为不同的事务API(如JTA, JDBC, Hibernate, JPA, 和JDO)提供了统一的编程模型。

    2.为编程式事务管理提供了一个简单的API而非一系列复杂的事务API(如JTA).

    3.支持声明式事务管理。

    4.可以和Spring 的多种数据访问技术很好的融合。

78.你更推荐那种类型的事务管理?

答:选择声明式事务管理,因为这种方式与应用程序的关联较少,更加符合轻量级容器的概念。

    声明式事务管理要优于编程式事务管理,尽管灵活性方面弱于编程式事务管理(这种方式允许你通过代码控制业务)。

Spring面向切面编程(AOP)

79.解释AOP

面向切面编程,允许开发人员模块化横向业务逻辑,或定义核心部分的功能,例如日志和事务管理。

80.切面(Aspect)   ['æspekt]

AOP的核心就是切面,它将多个类的通用行为封装为可重用的模块,该模块含有一组API提供 cross-cutting功能。例如,日志模块称为日志的AOP切面。根据需求的不同,一个应用程序可以有若干切面。在Spring AOP中,切面通过带有@Aspect注解的类实现。

81.Spring AOPconcern cross-cutting concern的区别是什么?

Concern(核心逻辑):表示在应用程序中一个模块的行为。Concern可以定义为我们想要实现的功能。

Cross-cutting concern(横向的通用逻辑):指的是整个应用程序都会用到的功能,它影响整个应用程序。例如,日志管理(Logging)、安全管理(Security)sɪˈkjʊərəti以及数据交互是应用程序的每个模块都要涉及到的,因此这些都属于Cross-cutting concern。

82.连接点(Join point)

连接点代表应用程序中插入AOP切面的地点。它实际上是Spring AOP框架在应用程序中执行动作的地点。

83.通知(Advice)

通知表示在方法执行前后需要执行的动作。实际上它是Spring AOP框架在程序执行过程中触发的一些代码。

Spring切面可以执行以下五种类型的通知:

before(前置通知):在一个方法之前执行的通知。

after(最终通知):当某连接点退出时执行的通知(不论是正常返回还是异常退出)。

after-returning(后置通知):在某连接点正常完成后执行的通知。

after-throwing(异常通知):在方法抛出异常退出时执行的通知。

around(环绕通知):在方法调用前后触发的通知。

84.切入点(Pointcut)

切入点是一个或一组连接点,通知将在这些位置执行。可以通过表达式或匹配的方式指明切入点。

85.什么是引入?

引入允许我们在已有的类里添加新的方法或属性。

86.什么是目标对象?

被一个或者多个切面所通知的对象。它通常是一个代理对象。也被称做被通知(advised)对象。

87.什么是代理?

代理是将通知 应用到目标对象后 创建的对象。从客户端的角度看,代理对象和目标对象是一样的。

88.有几种不同类型的自动代理?

BeanNameAutoProxyCreator:bean名称自动代理创建器

DefaultAdvisorAutoProxyCreator:默认通知者自动代理创建器

Metadata autoproxying:元数据自动代理

89.什么是织入?什么是织入应用的不同点

答:织入是将切面和其他应用类型或对象连接起来创建一个通知对象的过程。织入可以在编译、加载或运行时完成。

90.解释基于XML Schema方式的切面实现

答:在这种情况下,切面由使用XML文件配置的类实现。

91.解释基于注解方式(基于@AspectJ)的切面实现

答:在这种情况下(基于@AspectJ的实现),指的是切面的对应的类使用Java 5注解的声明方式。

92.DispatcherServlet

答:Spring的MVC框架围绕DispatcherServlet来设计的,它用来处理所有的HTTP请求和响应。

93.WebApplicationContext

WebApplicationContext继承了ApplicationContext,并添加了一些web应用程序需要的功能。和普通的ApplicationContext 不同,WebApplicationContext可以用来处理主题样式,它也知道如何找到相应的servlet。

94.什么是Spring MVC框架的控制器?

控制器提供对应用程序行为的访问,通常通过服务接口实现。控制器解析用户的输入,并将其转换为一个由视图呈现给用户的模型。Spring 通过一种极其抽象的方式实现控制器,它允许用户创建多种类型的控制器。

95.@Controller   annotation  @Controller注解表示该类扮演控制器的角色。Spring不需要继承任何控制器基类或应用Servlet API。

96.@RequestMapping  annotation(注解)

@RequestMapping注解用于将URL映射到任何一个类或者一个特定的处理方法上。

96.你一般用spring做什么?    控制反转IOC  AOP

97.项目中如何体现Spring中的切面编程,举例说明。 

答:项目中用到的Spring中的切面编程最多的地方:声明式事务管理。    

   1.定义一个事务管理器 

    2.配置事务特性(相当于声明 通知。一般在业务类的方法上定义事务)    

   3.配置哪些类的哪些方法需要配置事务(相当于切入点。一般也是在业务类的方法上)     

98. spring中可以用注入获得属性值,还有其他的方式吗?    答:读取配置文件   

99. spring在项目中如何充当粘合剂   

答:1、在项目中利用spring的IOC(控制反转或依赖注入),明确地定义组件接口(比如UserDAO),开发者可以独立开发各个组件, 然后根据组件间的依赖关系组装(UserAction依赖于UserBiz:业务逻辑层,UserBiz依赖于UserDAO)运行,很好的把Struts(Action)和hibernate(DAO的实现)结合起来了。 

     2、spring的事务管理把hibernate对数据库的操作进行了事务配置。  

100.什么是Ajax?      eɪˈsɪŋkrənəs

AJAX“Asynchronous Javascript And XML”(异步JavaScript和XML)是一种用于创建更好更快及交互性更强的Web应用程序技术。

通过在后台与服务器进行少量的数据交换,在不重新加载整个页面的情况下,实现对局部页面的异步更新。

101. Ajax的工作原理? 简单来说通过XmlHttpRequest对象向服务器发送异步请求、获得数据然后用javascript操作DOM更新页面.

102.什么是struts2?工作原理是什么?

答:Struts 2 是融合了Struts 和 WebWork用来建立企业级Java Web 应用程序的框架。不仅注重程序的开发过程,还注重部署和后期维护。使用了责任链(Chain of Responsibility)设计模式和命令(Command)设计模式。

工作原理分为4步:

1.客户端向Action发送一个请求,容器通过web.xml 映射请求,得到控制器名字 然后调用控制器(StrutsPrepareAndExecuteFilter或FilterDispatcher)。在Struts2.1以前调用FilterDispatcher,Struts2.1以后调用StrutsPrepareAndExecuteFilter

2.控制器(Controller)通过ActionMapper获得Action的信息并调用代理对象ActionProxy  ['prɒksɪ]。

3.代理对象(ActionProxy)通过读取struts.xml文件获取action和拦截器栈的信息。把request请求传递给action的调用者(ActionInvocation)[ˌɪnvəˈkeɪʃn]

4.ActionInvocation依次调用action和interceptor(拦截器)。根据action的配置信息产生结果result。Result信息返回给ActionInvocation产生一个HttpServletResponse响应,把响应行为发送给客户端。

103.什么是struts,它的工作机制及为什么要用?

答:Struts是最早的java开源框架之一,是MVC设计模式的一个优秀实现。定义了通用的Controller(控制器),通过配置文件(Struts -config.xml)隔离Model(模型层)和View(视图层),以Action的概念对用户请求进行封装,使代码更加清晰易读。还提供了自动将请求的数据填充到对象中及页面标签等简化编码的工具。可以开发大型Java Web项目。

(View:沿用JSP,HTTP,Form,Tag,Resourse ;Controller:ActionServlet  ,struts-config.xml,Action)

流程:在web应用启动时就会加载初始化ActionServlet,ActionServlet从 struts-config.xml文件中读取配置信息,把它们存放到各种配置对象中, 当ActionServlet接收到一个客户请求时,将执行以下流程. 

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

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

(3)根据配置信息看是否需要表单验证.如果需要验证,就调用ActionForm的validate()方法; |ˈvælɪdeɪt|

(4)如果ActionForm的validate()方法返回null或返回一个不包含ActionMessage的ActionErrors对象, 就表示表单验证成功; 

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

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

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

为什么要用:JSP+Servlet+JavaBean构建的系统非常的繁乱。基于Struts开发的应用不用再考虑公共问题,开发人员可以专注于业务实现上。结构清晰统一,易于维护。

 

时就会加载初始化ActionServlet,ActionServlet从 struts-config.xml文件中读取配置信息,把它们存放到各种配置对象中, 当ActionServlet接收到一个客户请求时,将执行以下流程. 

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

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

(3)根据配置信息看是否需要表单验证.如果需要验证,就调用ActionForm的validate()方法; |ˈvælɪdeɪt|

(4)如果ActionForm的validate()方法返回null或返回一个不包含ActionMessage的ActionErrors对象, 就表示表单验证成功; 

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

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

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

为什么要用:JSP+Servlet+JavaBean构建的系统非常的繁乱。基于Struts开发的应用不用再考虑公共问题,开发人员可以专注于业务实现上。结构清晰统一,易于维护。

 

你可能感兴趣的文章