《2018年SSH框架面试题.docx》由会员分享,可在线阅读,更多相关《2018年SSH框架面试题.docx(81页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、非常有用的SSH框架面试题Hibernate工作原理及为什么要用?原理:1 .读取并解析配置文件2 .读取并解析映射信息,创建SessionFactory3 .打开 Sesssion4 .创建事务Transation5 .持久化操作6 .提交事务7 .关闭 Session8 .关闭 SesstionFactory为什么要用:1. 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性 代码。2. Hibernate是个基于JDBC的主流持久化框架,是个优秀的0RM实现。他 很大程度的简化DA0层的编码工作3. hibernate使用Java反射机制,而不是字节码增强程序来实现透明
2、性。4. hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。 它支持各种关系数据库,从对一到多对多的各种复杂关系。2. Hibernate是如何延迟加载?1. Hibernate2延迟加载实现:a)实体对象b)集合(Collection)2. Hibernate3提供了属性的延迟加载功能当Hibernate在査询数据的时候,数据并没有存在与内存中,当程序真正对数 据的操作时,对象存在与内存中,就实现了延迟加载,他节省了服务器的内 存开销,从而提高了服务器的性能。3. Hibernate中怎样实现类之间的关系?(如:对多、多对多的关系)类与类之间的关系主要体现在表与表之间
3、的关系进行操作,它们都市对对象进 行操作,我们程序中把所有的表与类都映射在起,它们通过配置文件中的 many-to-one one-to-many、 many-to-many4. 说下Hibernate的缓存机制1 .内部缓存存在Hibernate中又叫一级缓存,属于应用事物级缓存2 .二级缓存:a)应用及缓存b)分布式缓存条件:数据不会被第三方修改、数据大小在可接受范围、数据更新频率低、同 数据被系统频繁使用、非关键数据c)第三方缓存的实现5 . Hibernate的査询方式Sql、Criteria, object comptositionHql:1、属性查询2、参数查询、命名参数査询3、关
4、联査询4、分页査询5、统计函数6 .如何优化Hibernate?1 .使用双向对多关联,不使用单向对多2 .灵活使用单向一对多关联3 .不用对,用多对取代4 .配置对象缓存,不使用集合缓存5 . 对多集合使用Bag.多对多集合使用Set6 .继承类使用显式多态7 .表字段要少,表关联不要怕多,有二级缓存撑腰7. Struts工作机制?为什么要使用Struts?工作机制:Struts的工作流程:在web应用启动时就会加载初始化ActionServlet, ActionServlet从 struts-config. xml文件中读取配置信息,把它们存放到各种配置对象 当ActionServlet接
5、收到个客户请求时,将执行如下流程.- (1)检索和用户请求匹配的ActionMapping实例,如果不存在,就返回请求路径 无效信息;- (2)如果ActionForm实例不存在,就创建一个ActionForm对象,把客户提交的 表单数据保存到ActionForm对象中;- (3)根据配置信息决定是否需要表单验证.如果需要验证,就调用ActionForm的 validate。方法;- (4)如果ActionForm的validate。方法返回nul!或返回一个不包含 ActionMessage的ActuibErrors对象,就表示表单验证成功;- (5) ActionServlet根据Acti
6、onMapping所包含的映射信息决定将请求转发给哪 个Action,如果相应的Action实例不存在,就先创建这个实例,然后调用Action 的 execute ()方法;- (6)Action 的 execute。方法返回t* ActionForward 对象,ActionServlet 在 把客户请求转发给ActionForward对象指向的JSP组件;-(7)ActionForward对象指向JSP组件生成动态网页,返回给客户:为什么要用:JSP、Servlet. JavaBean技术的出现给我们构建强大的企业应用系统提供了可 能。但用这些技术构建的系统非常的繁乱,所以在此之上,我们需
7、要一个规则、 个把这些技术组织起来的规则,这就是框架,Struts便应运而生。基于Struts开发的应用由3类组件构成:控制器组件、模型组件、视图组件8. Struts的validate框架是如何验证的?在struts配置文件中配置具体的错误提示,再在FormBean中的validate。方 法具体调用。9. 说下Struts的设计模式MVC模式:web应用程序启动时就会加载并初始化ActionServler。用户提交表 单时,个配置好的ActionForm对象被创建,并被填入表单相应的数据, ActionServler根据Struts-config. xm!文件配置好的设置决定是否需要表单验
8、 证,如果需要就调用ActionForm的Validate 验证后选择将请求发送到哪个 Action,如果Action不存在,ActionServlet会先创建这个对象,然后调用 Action的execute ()方法。Execute ()从ActionForm对象中获取数据,完 成业务逻辑,返回1bAetionForward对象,ActionServlet再把客户请求转发 给ActionForward对象指定的jsp组件,ActionForward对象指定的jsp生成动 态的网页,返回给客户。10. spring工作机制及为什么要用?1. spring mvc请所有的请求都提交给Dispat
9、cherServlet,它会委托应用系统的 其他模块负责负责对请求进行真正的处理工作。2. DispatcherServlet査询个或多个HandlerMapping找到处理请求的 Controller.3. DispatcherServlet 请请求提交到目标 Controller4. Controller进行业务逻辑处理后,会返回个ModelAndView5. Dispathcher査询个或多个ViewResolver视图解析器,找到ModelAndView 对象指定的视图对象6. 视图对象负责渲染返回给客户端。为什么用:AOP让开发人员可以创建非行为性的关注点,称为横切关注点,并将它们插
10、入 到应用程序代码中。使用A0P后,公共服务(比如日志、持久性、事务等) 就可以分解成方面并应用到域对象上,同时不会增加域对象的对象模型的复杂 性。I0C允许创建一个可以构造对象的应用环境,然后向这些对象传递它们的协作 对象。正如单词倒置所表明的,I0C就像反过来的JNDIo没有使用堆抽 象工厂、服务定位器、单元素(singleton)和直接构造(straight construction), 每个对象都是用其协作对象构造的。因此是由容器管理协作对象(collaborator) Spring即使个AOP框架,也是 I0C容器。Spring最好的地方是它有助于 您替换对象。有了 Spring,只
11、要用JavaBean属性和配置文件加入依赖性(协 作对象)。然后可以很容易地在需要时替换具有类似接口的协作对象。其它知识点:不会涉及到2级缓存以及hql1 . Configuration读取hibernate, cfg. xml,并把.hbm. xml文件交给HbmBinder做第一次处理, HbmBinder 根据.hbm. xm! 解析出 PersistentClass, Collection,然后在创建 SessionFactory的时候,会对Collection做第2次处理塞入关联2 PersistentClass根据.hbm. xm!产生的描述要持久化的类的信息的类.主要的实例变量包
12、括List propertiesProperty对象里的有个Value属性value,通过value来描述该property和 数据库里的哪些列对应以及获得该property对应的type3 Value主要分为SimpleValue, Collection, Component, ToOneSimpleValue主要包括Table和Columns属性,用于描述简单属性或单主键Collection主要属性包括collectionTable 表示 Collection 里面 element 对象所对应的 Tablekey表示CollectionTable里的哪几列和Collection owner
13、所对应的表的主键 做关联element,描述了主表(referencingTable),从表的EnityName,以及从表对应的 PersistentClassComponent可以用来描述多主键,通过属性properties来表示ToOne包括被引用的属性名,被引用的实体名,columns,(被引用的属性名不能 和 columns 同时设置),用于 OneToOne, ManyToOne4 SessionFactory在创建 SessionFactory 的时候,会根据 Configuration 里 Classes 和Collections,创建 EntityPersister 和 Col
14、lectionPersister.SessionFactory 会缓存这些 persisters.EnityPersistenter 的 key 是 EntityName,CollectionPersister 的 key 是 entityName+propertyName5 Ent i tyPers i s ter分为SingleTableEntityPersister (个实体个表/个类继承结构个表) 通过一个字段做标识JoinedSubclassEntityPersister (每个子类个表)UnionSubclassEntityPersister (每个具体类个表)6 Collecti
15、onPersister封装对个Collection的crud操作.不过做 insert, update, delete, recreate 的时候,会判 Inverse 是否为 false. 如果为false会执行相应的操作,表示是由Collection维护关系.如果!nverse=true,表示关联关系是由多端来维护(即直接通过操作 Collection里的element来维护,而不是通过操作Collection来维护) 则该CollectionPersister不会做任何操作7 Type主要包括对 SqlTypes 的封装,以及 CollectionType, EntityType (Ma
16、nyToOneType, OneToOneType),主要接 口 有 nullSafeGet( 从 ResultSet 拼装出对象),nullSafeSet (给 PreparedStatement setParameter).可以通过 Value. getType ()获得 Type对于 EntityType, CollectionType,就是通过 resolve 方法从ResultSet中拼装出对象EntityType的nullSafeSet,就是获取One端对象的主键所对应的 Type 进行 nullSafeSetCollectionType没有实现nullSafeSet,通过保存时的
17、Cascade 或者 CollectionPersister,将 Collection 的Element 一个个的 set也可以自定义Type,实现UserType接口具体见http:/docs. huihoo. com/framework/hibernate/reference_v3_zh-cn/inheri tance. html封装对个entity的crud操作,在创建EntityPersister实例过程中,会产 生crud的sql,可以在以后的操作提高效率。不过如果是Dynamic Insert, DynamicUpdate,则会根据对象修改的属性动态的生成sqlDAS不支持类继承的
18、映射,因此只会用到SingleTableEntityPersister8 StatefulPersistenceContextStatefulPersistenceContext 和 Sessionlmpl 是对应的,会缓存通过Sessionlmp!操作过的对象,包括entity和collection,主要属性有 EntitiesByKey key=EntityKey, value=entity.(EntityKey=id+EntityPersister+EntityMode entityMode)entityEntries key=entity, value=EntityEntry.Enti
19、tyEntry用于描述个对象的持久化状态,如DELETED, MANAGED等等CollectionsByKeykey=CollectionKey, value=PersistentCollectionCollectionKey=CollectionPersister+key+EntityMode,这个Key 是通过 Collection, value. getType. nullSafeGet ()得到的 PersistentCollection 是 hibernate 对于 Collection 的封装, 主要用于实现延迟加载collectionEntries key=Persistent
20、Collection, value=CollectionEntry StatefulPersistenceContext的主要用途可以实现对象之间的关联关系 的设置,动态的更新,以及对缓存的数据无需显示调用save, update, delete的 方法就可以实现这些操作,是因为在Transaction, commit ()的时候会调用 session, flush。,会保证内存对象状态和数据库的一致性9 Cascade, CascadeStyle, CascadingAction在Cascade执行级联操作的时候,会通过CascadeStyle. doCascade ( CascadingA
21、ction)来判断是否可以执行cascade,并且当要保存的对象有外键 约束的关联对象时候会通过ForeignKeyDirection来判断是应该在保存该对象 之前要保存关联对象还是在保存该对象之后再保存关联对象10 Loader, CriteriaQueryTranslator, Criteria, QueryParameters,CriteriaJoinWalker用于Criteria api对实体的查询Criteria是个査询entity的api。可以设置类似where条件的表达式,Select字段,order等等当使用 Criteria 査询时,首先会创建 CriteriaLoader
22、, CriteriaLoader 会通过 CriteriaQueryTranslator 从 Criteria 中得到査询参数QueryParameters,通过 CriteriaJoinWalker 把 Criteria 变成 sql,然后 执行査询11 ActionQueue当调用session对实体进行insert, update, delete的时候,只是会创建相应 的action放入ActionQueue,然后在session, flush。的时候会真正操作 数据库ActionQueue的执行顺序:executeActions( insertions );executeActions
23、( updates );executeAction s( collectionRemovals );executeActions( collectionUpdates );executeA ctions( collectionCreations ):executeActions( deletions );12 Tuplizer用于根据entityname实例化出对象,以及set/get propertyhibernate 内置的有 PojoEntityTuplizer, Dom4jEntityTuplizerDAS是在hibernate基础之上实现了 DataObject的持久化,支持Data
24、Object对 象之间的关联,延迟加载,级联,控制反转,不支持DataObject的继承1.新实现了一个 SDOEntityTuplizer支持创建 DataObject,以及 set/get DataObject 的属性SDOEntityTuplizer实现抽象类中规定的如下方法SDOEnt i tyTupl i zer 类的 bui Idinstantiator 方法用来根据 mapping 信息来为相 应的实体建立不同的构造器,我们用SDOEntitylnstantiator来实现SDO的构 造器:2其中SDOComponentlnstantiator是用来当实体有复合主键用于实例化表示
25、主 键的类3PropertyAccessor是Hibernate中定义的个接口,用来表达在访问mapping 的实体对象的属性的时候使用的“属性访问器”。它有两个相关的接口: Getter 接口和Setter接口。DASPropertyAccessor的内部结构如下图所示:其中getGetter方法和getSetter方法是PropertyAccessor接口定的规格。DASGetter 实现 Getter 接 口,DASSetter 类实现 Setter 接 口。4自定义type支持blob, clob的存储BlobFileType:从个文件路径读取文件存入数据库blob字段.从数据库读取
26、blob字段,生成文件放在临时目录,返回路径BlobByteArrayType:把个byte口数组存入blob字段.从数据库读取blob 字段放入byteClobFileType:从个文件路径读取文件存入数据库clob字段.从数据库读取 clob字段,生成文件放在临时目录,返回路径ClobStringType:把个String存入blob字段.从数据库读取blob字段放入String5对査询实体的支持增加一个査询实体定义文件.dbquery.因为査询实体没有唯一标识,所以默认 的id的是$queryEntityId$”.用户也可以自己指定一个列做唯一标识.在Loader. prepareQue
27、ryStatement ()里增加转换带査询实体的Sql.SelectFragment. addColumn ()做了判断,如果列名是$queryEntityId$”,査询 的 column 就替换成queryEntityld,常量.在 Loader. getRowO 增加判断如果 key. getldentifier ()是 queryEntityld的话,则不做检査,看内存是否存在.AbstractEntityPersister. getDatabaseSnapshot ()里修改生成的査询 语句,如果有QueryEntity,则用定义的sql替换QueryEntityJava一一SSH(
28、MVC)1. 谈谈你mvc的理解MVC是ModelViewControler的简称。即模型一视图控制器。MVC是种设计模式,它强制性的 把应用程序的输入、处理和输出分开。MVC中的模型、视图、控制器它们分别担负着不同的任务。视图:视图是用户看到并与之交互的界面。视图向用户显示相关的数据,并接受用户的输入。视图不 进行任何业务逻辑处理。模型:模型表示业务数据和业务处理。相当于JavaBean。个模型能为多个视图提供数据。这提高了 应用程序的重用性控制器:当用户单击Web页面中的提交按钮时,控制器接受请求并调用相应的模型去处理请求。然后根据处理的结果调用相应的视图来显示处理的结果。MVC的处理过程
29、:首先控制器接受用户的请求,调用相应的模型来进行业务处理,并返回数据给控制 器。控制器调用相应的视图来显示处理的结果。并通过视图呈现给用户。Struts1. strutsl. 2和struts2.0的区别?如何控制两种框架中的单例模式?strutsl. 2 和 struts2. 0 的对比a、Action 类:strutsl. 2 要求 Action 类继承一个基类。struts2. 0 Action 要求继承 ActionSupport 基类b、线程模式strutsl. 2 Action是单例模式的并且必须是线程安全的,因为仅有一个Action的实例来处理所有的 请求。单例策略限制了 Str
30、utsl. 2 Action能做的事情,并且开发时特别小心。Action资源必须是线程安全 的或同步的。struts2. 0 Action为每个请求产生一个实例,因此没有线程安全问题。c、Servlet 依赖strutsl. 2 Action 依赖于 Servlet API,因为当个 Action 被调用时 HttpServletRequest 和 HttpServletResponse 被传递给 execut 方法。struts2. 0 Action不依赖于容器,允许Action脱离容器单独测试。如果需要,Struts2 Action仍然 可以访问初始的Request和Response。但是
31、,其他的元素减少或者消除了直接访问HttpServletRequest和HttpServletResponse的必要性。d、可测性测试strutsl. 2 Action的个主要问题是execute方法暴露了 Servlet API (这使得测试要依赖于 容器)。一个第三方扩展:struts TestCase提供了一套strutsl. 2的模拟对象来进行测试。Struts2.0 Action可以通过初始化、设置属性、调用方法来测试,“依赖注入”也使得测试更容易。2. 项目中为什么使用SSH1 .使用Struts是因为struts是基于MVC模式的,很好的将应用程序进行了分层,使开发者更关注于 业
32、务逻辑的实现;第二,struts有着丰富的taglib,如能灵活运用,则能大大提高开发效率。2 .使用Hibernate:因为hibernate为Java应用提供了一个易用的、高效率的对象关系映射框架。 hibernate是个轻量级的持久性框架,功能丰富。3 .使用Spring:因为spring基于IoC(Inversion of Control,反向控制)和AOP构架多层j2ee系统 的框架,但它不强迫你必须在每层中必须使用Spring,因为它模块化的很好,允许你根据自己的需要选 择使用它的某个模块:采用IoC使得可以很容易的实现bean的装配,提供了简洁的A0P并据此实现事务管理(Tran
33、scationManagment)等等3. struts与spring是如何继承的不懂题目之意:是否是说的struts的action都继承自org. apache, struts, action. Action而Spring中的维承就不清楚了。4. struts如何实现国际化以下以两国语言(中文,英文)为例:1,在工程中加入Struts支持2 .编辑ApplicationResource. properties文件,在其中加入要使用国际化的信息,例如: lable. welcome, china=Weicome!3 .创建英文资源文件ApplicationResource en. proper
34、ites4 .创建临时中文资源文件 ApplicationResource_temp. properites 例如:lable. welcom. china=中国 欢迎您!5 .对临时中文资源文件进行编码转换。可以使用myeclipse的插件,也可以在dos下执行:native2asci i-encodinggb2312 ApplicationResource_temp. propertiesApplicationResource_zh_CN. properties6 . 在 jsp 中加入 struts 的 bean 标记库 tagl ib uri=*/WEB-INF/struts_bean
35、. tld* prefix=bean%显不信息: 可以在struts-config. xm!文件中定义多个资源包,而每个资源包可使用key属性指定包的名称。5. struts2. 0的常用标签1 . 往 action 里传值:2 .显示标签 property 用于输出指定值:3 .用于从页面往 action 中(user)的对象内传值:s: text name二user. userName id二username/)4,判断s:if 用于在页面中判断指定数据 . s:else.5 .迭代s: iterator)用于将List、Map、ArrayList等集合进行循环遍历/s:iterator6
36、 . URL地址标签,s:url用于生成一个URL地址,可以通过URL标签指定的s:param子元素向URL 地址发送请求参数7 .超链接 般和s:url标签起使用,用于带多个参数。a href=超链接/a8 . set标签,用于将某个值放入指定的范围内。例如application, session等。6. struts 中怎么配置 form-bean、action、tiles此处配置的是strutsl.2的form-bean 配置:(在配置文件 struts-config. xml 中):/form-beansname:指定form的名字;type指定form的类型:包名+类名;action
37、 配置:(在配置文件 struts-config. xm! 中)path:请求 Action 的名字; attribute: form 的名字,与 form-bean 中的 name 对应: input:输入 页的路径;name:如果配置了 attribute, name 不起作用,与 attribute样; parameter:使用分发 Action 时, 指定调用分发Action中的方法名;scope: Action的范围; type: Action的类型:包名+类名:tites配置:1 .新建一个tiles-defs. xml文件,并在其中做如下配置:put name二 top valu
38、e二/mTop. d/put name二left value二/mLeft. d/2 .在 web. xm! 和 struts-config. xm! 和 web. xml 中做相应配置:在struts-config, xml中配置如下:plug-in className二 org. apache, struts, tiles. TilesPlugin set-property property=definitions_parser_va1idate value=true*/在web. xml中配置如下:definitions-config/WEB-INF/tiles-defs. xml3 .
39、调用Tiles组件Tiles组件是通过Struts Action来调用的,在struts-config. xml中做如下action配置:7. logic标签有哪几个?此标签库可以分为三种类型:条件、循环、转发/重定向。1 .条件类型(没标注的都比较简单) logic:empty, logic:notEmpty;Iogic:equal, logic:notEqual, logic:lessThan, logic:greaterThan, logic:lessEqual, logic:greaterEqual;logic:present, logic:notPresent;logic:match
40、, logic:notMatch:比较两字符串是否相等,可以比较字符串的开始的、结尾的或其 中的某个部分。location属性:指定从某个位置开始进行比较。2 .循环类型 logic:iterate3 .转发/重定向类型logic:forward 和 logic:redirectlogic:forward标签和jsp:forward标签相似,但它可以使用global forward中的个 ActionForward例如:logic:forward name=*login /与上面相关的global forward中的代码:global-forwards)logic:redirect标签和上面的
41、标签类似,但它默认调用的方法是response. sendRedirect (),取代了上面的requestDispatcher. forward() 最大的不同是它支持所有html: I ink标签的属性, 所以你能够指定request参数: logic: redirect name =login param I d= employee Id paramName=employee property= id/ 在MVC框架下,不推荐使用这两个标签,你应该是从controller中选择下个view,而不是从view 中选择.在Jsp页面中不要过多的使用!ogic标签。8. action是单实例还
42、是多实例,为什么?action是单实例的。当多个用户访问个请求的时候,服务器内存中只有一个与之对应的action类 对象。因为当服务器第一次加载struts的配置文件的时候,创建了一个Action后,每发送个请求,服务器都 会先去检索相应的范围内(request, session)是否存在这样个action实例,如果存在,则使用这个实例,如果不存在,则创建一个action实例。9. dispatchAction是用什么技术实现的?DispatchAction是Aci ton的个子类,主要解决了一个请求处理多个功能的问题普通的Action你只能写execute方法来处理业务,而想用这个Action处理多个任务,你必须要请求 参数进行解析,用讦语句块来处理举个小例子:有如下个 url: h11p: /1 oca 1 host: 8080/myApp/addllserAc t i on. do如果你处理这个url的是个普通的Action,那么就只能在execute里面执行插入的相关操作,如果换 成一下url:http:/loca1host:8080/myApp/UserAction. do?method=ad