Hibernate经典知识:html
1、Hibernate工做原理及为何要用?java
1.对JDBC访问数据库的代码作了封装,大大简化了数据访问层繁琐的重复性代码。 hibernate的性能很是好,由于它是个轻量级框架。web 1.它支持各类关系数据库,从一对一到多对多的各类复杂关系。面试
1).读取并解析配置文件算法
2).读取并解析映射信息,建立SessionFactory spring
3).打开Sesssion sql
4).建立事务Transation 数据库
5).持久化操做apache
6).提交事务编程
7).关闭Session
8).关闭SesstionFactory
|
2.什么是Hibernate延迟加载?
延迟加载机制是为了不一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正须要数据的时候,才真正执行数据加载操做。
答:对象关系映射(Object—Relational Mapping,简称 ORM)是一种为了解决 面向对象与面向关系数据库存在的互不匹配的现象的技术; |
3.数据库,好比 100 用户同时来访,要采起什么技术解决?
答:可采用链接池。 |
4.什么是 ORM?
答:对象关系映射(Object—Relational Mapping,简称 ORM)是一种为了解决 面向对象与面向关系数据库存在的互不匹配的现象的技术; |
5.Hibernate 有哪 5 个核心接口?
Configuration 接口:配置 Hibernate,根据其启动 hibernate,建立SessionFactory 对象 SessionFactory 接口:初始化 Hibernate,充当数据存储源的代理,建立session 对象sessionFactory 是线程安全的. Session 接口:负责保存、更新、删除、加载和查询对象,是线程不安全的,避免多个线程共享同一个 session,是轻量级、一级缓存; Transaction (tr?n'z?k??n) 接口:管理事务; Query 和 Criteria([krai'ti?ri?]) 接口:执行数据库的查询。 |
6.关于 hibernate: 【基础】
1)在 hibernate 中,在配置文件呈标题一对多,多对多的标签是什么;
2)Hibernate 的二级缓存是什么;
Hibernate 是如何处理事务的;
答: 1)一对多的标签为<one-to-many> ;多对多的标签为<many-to-many>;
2)sessionFactory 的缓存为 hibernate 的二级缓存;
3)Hibernate 的事务其实是底层的 JDBC Transaction 的封装或者是 JTA Transaction 的封装;默认状况下使用 JDBCTransaction。 |
7.Hibernate 的应用(Hibernate 的结构)?【基础】
答: //首先得到 SessionFactory 的对象 SessionFactory sessionFactory = new Configuration().configure(). buildSessionFactory();
//而后得到 session 的对象 Session session = sessionFactory.openSession();
//其次得到 Transaction 的对象 Transaction tx = session.beginTransaction();
//执行相关的数据库操做:增,删,改,查
session.save(user); //增长, user 是 User 类的对象
session.delete(user); //删除 session.update(user); //更新
Query query = session.createQuery(“from User”); //查询 List list = query.list();
//提交事务
tx.commit();
//若是有异常,咱们还要做事务的回滚,恢复到操做以前
tx.rollback();
//最后还要关闭 session,释放资源
session.close(); |
8.Hibernate的查询方式
本地SQL查询、Criteria、Hql |
9.说说在hibernate中使用Integer作映射和使用int作映射之间有什么差异
Integer?? code和int?? code;的区别:Integer是对象.???? code?? =?? null;?? 对象能够为空.? int?? 是普通类型,???? 不可能?? =?? null.????? 根据你的数据库code是能够空的,?? 故应该映射成Integer.? |
10.请说出Hibernate中持久化对象的生命周期以及各类状态直接的区别,并描述相互之间是如何转换的?
Hibernate中持久化对象的生命周期有临时态、持久态和游离态三种。
处于临时态的对象主键值为空,而且未与session关联,数据未保存到数据库中 处于持久态的对象与session关联起来,持久化后对象中的数据被保存到数据库中,而且主键值按照.hbm.xml文件中配置的生成方式生成相应的值 处于游离态的对象脱离了session的管理,是持久化后的一种状态,主键值按照.hbm.xml文件中配置的生成方式生成相应的值 当new一个新的对象时,该对象处于临时态 当该对象被看成session的参数使用的时候,该对象处于持久态 事务提交,session关闭后,该对象处于游离态 |
11.用Hibernate的session时要注意几点
1).在更新数据时,要用open()
2).使用完以后,要close(),这样链接池会回收该链接。 |
12.Spring和Hibernate的事务管理方式有什么不一样?
hibernate的事务管理方式仅仅就是托管给JDBC(若是用JTA那么就是JTA),而JDBC的一切行为包括事务是基于一个connection的. spring也是调用hibernate中事务管理的API。hibernate的事务管理,通常是编程性的。 |
13.Hibernate如何获取指定主键id的某对象,请举例,并进行可能的优劣
比较 三种方式:get(),load()和find() Get()和load()是先在缓存中查找对象,若是找不到再去数据库中查询; Find()是不管什么时候都在数据库中查询对象。 |
14.请描述Hibernate中的缓存机制
第一级是Session的缓存。因为Session对象的生命周期一般对应一个数据库事务或者一个应用事务,所以它的缓存是事务范围的缓存。
第二级缓存是一个可插拔的的缓存插件,它是由SessionFactory负责管理。因为SessionFactory对象的生命周期和应用程序的整个过程对应,所以第二级缓存是进程范围或者集群范围的缓存。 |
15.Hibernate的二级缓存策略的通常过程以下:
1) 条件查询的时候,老是发出一条select * from table_name where …. (选择全部字段)这样的SQL语句查询数据库,一次得到全部的数据对象。
2) 把得到的全部数据对象根据ID放入到第二级缓存中。
3) 当Hibernate根据ID访问数据对象的时候,首先从Session一级缓存中查;查不到,若是配置了二级缓存,那么从二级缓存中查;查不到,再查询数据库,把结果按照ID放入到缓存。 |
16.get与load区别
1:若是数据库中,没有userId的对象。若是经过get方法加载,则返回的是一个null;若是经过load加载,则返回一个代理对象,若是后面代码若是调用user对象的某个属性(好比user.getPassword())会抛出异常:org.hibernate.ObjectNotFoundException; 区别2:load支持延迟加载,get不支持延迟加载。 |
s1.什么是重量级?什么是轻量级?【基础】
答:轻量级是指它的建立和销毁不须要消耗太多的资源,意味着能够在程序中经 常建立和销毁 session 的对象;重量级意味不能随意的建立和销毁它的实例,会 占用不少的资源. |
s2.事务处理?【基础】
答:Connection 类中提供了 3 个事务处理方法: setAutoCommit(Boolean autoCommit):设置是否自动提交事务,默认为自动 提交事务,即为 true,经过设置 false 禁止自动提交事务; commit():提交事务; rollback():回滚事务。 |
s3.Java 中访问数据库的步骤?Statement 和 PreparedStatement 之间的区别?【基础】
答:Java 中访问数据库的步骤以下:
1)注册驱动;
2)创建链接;
3)建立 Statement;
4)执行 sql 语句;
5)处理结果集(若 sql 语句为查询语句);
6)关闭链接。
PreparedStatement 被建立时即指定了 SQL 语句,一般用于执行屡次结构相 同的 SQL 语句。 |
s4.JDBC,Hibernate 分页怎样实现?【中等难度】
答:方法分别为:
1) Hibernate 的分页:
Query query = session.createQuery("from Student");
query.setFirstResult(firstResult);
//设置每页开始的记录号
query.setMaxResults(resultNumber);
//设置每页显示的记录数
Collection students = query.list(); |
s5.如何优化Hibernate?
1.使用双向一对多关联,不使用单向一对多
2.不用一对一,用多对一取代
3.配置对象缓存,不使用集合缓 |
S2SH经典面试题:
Struts2面试题 struts2工做流程
Struts 2框架自己大体能够分为3个部分: 核心控制器FilterDispatcher、业务控制器Action和用户实现的企业业务逻辑组件。 核心控制器FilterDispatcher是Struts 2框架的基础, 包含了框架内部的控制流程和处理机制。 业务控制器Action和业务逻辑组件是须要用户来本身实现的。 用户在开发Action和业务逻辑组件的同时,还须要编写相关的配置文件, 供核心控制器FilterDispatcher来使用。 Struts 2的工做流程相对于Struts 1要简单,与WebWork框架基本相同, 因此说Struts 2是WebWork的升级版本。基本简要流程以下: 1 、客户端初始化一个指向Servlet容器的请求; 二、 这个请求通过一系列的过滤器(Filter) (这些过滤器中有一个叫作ActionContextCleanUp的可选过滤器, 这个过滤器对于Struts2和其余框架的集成颇有帮助,例如:SiteMesh Plugin) 3 、接着FilterDispatcher被调用, FilterDispatcher询问ActionMapper来决定这个请是否须要调用某个Action 四、若是ActionMapper决定须要调用某个Action, FilterDispatcher把请求的处理交给ActionProxy 五、ActionProxy经过Configuration Manager询问框架的配置文件, 找到须要调用的Action类 六、ActionProxy建立一个ActionInvocation的实例。 七、ActionInvocation实例使用命名模式来调用, 在调用Action的过程先后,涉及到相关拦截器(Intercepter)的调用。 八、一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果 。返回结果一般是(但不老是,也可 能是另外的一个Action链)一个须要被表示的JSP或者FreeMarker的模版。 在表示的过程当中能够使用Struts2 框架中继承的标签。 在这个过程当中须要涉及到ActionMapper 九、响应的返回是经过咱们在web.xml中配置的过滤器 Struts工做机制? 工做机制: 说下Struts的设计模式 MVC模式: web应用程序启动时就会加载并初始化ActionServler。用户提交表单时,一个配置好的ActionForm对象被建立,并被填入表单相应的数据,ActionServler根据Struts-config.xml文件配置好的设置决定是否须要表单验证,若是须要就调用ActionForm的Validate()验证后选择将请求发送到哪一个Action,若是Action不存在,ActionServlet会先建立这个对象,而后调用Action的execute()方法。Execute()从ActionForm对象中获取数据,完成业务逻辑,返回一个ActionForward对象,ActionServlet再把客户请求转发给ActionForward对象指定的jsp组件,ActionForward对象指定的jsp生 成动态的网页,返回给客户。 拦截器和过滤器的区别 一、拦截器是基于java反射机制的,而过滤器是基于函数回调的。 struts1于struts2的比较 一、Action 类: 为何要使用Struts2 Struts2 是一个至关强大的JavaWeb开源框架,是一个基于POJO的Action的MVC Web框架。它基于当年的Webwork和XWork框架,继承其优势,同时作了至关的改进。 struts2有哪些优势? 1)在软件设计上Struts2的应用能够不依赖于Servlet API和struts API。 Struts2的这种设计属于无侵入式设计; 2)拦截器,实现如参数拦截注入等功能; 3)类型转换器,能够把特殊的请求参数转换成须要的类型; 4)多种表现层技术,如:JSP、freeMarker、Velocity等; 5)Struts2的输入校验能够对指定某个方法进行校验; 6)提供了全局范围、包范围和Action范围的国际化资源文件管理实现 struts2是如何启动的? struts2框架是经过Filter启动的,即StrutsPrepareAndExecuteFilter,此过滤器为struts2的核心过滤器; StrutsPrepareAndExecuteFilter的init()方法中将会读取类路径下默认的配置文件struts.xml完成初始化操做。struts2读取到struts.xml的内容后,是将内容封装进javabean对象而后存放在内存中,之后用户的每次请求处理将使用内存中的数据,而不是每次请求都读取struts.xml文件。 struts2框架的核心控制器是什么?它有什么做用? 1)Struts2框架的核心控制器是StrutsPrepareAndExecuteFilter。 2)做用: 负责拦截由<url-pattern>/*</url-pattern>指定的全部用户请求,当用户请求到达时,该Filter会过滤用户的请求。默认状况下,若是用户请求的路径 不带后缀或者后缀以.action结尾,这时请求将被转入struts2框架处理,不然struts2框架将略过该请求的处理。 能够经过常量"struts.action.extension"修改action的后缀,如: <constant name="struts.action.extension" value="do"/> 若是用户须要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开。 <constant name="struts.action.extension" value="do,go"/> struts2配置文件的加载顺序? struts.xml ——> struts.properties 常量能够在struts.xml或struts.properties中配置,若是在多个文件中配置了同一个常量,则后一个文件中配置的常量值会覆盖前面文件中配置的常量值. struts.xml文件的做用:通知Struts2框架加载对应的Action资源 struts2常量的修改方式? 常量能够在struts.xml或struts.properties中配置,两种配置方式以下: 1)在struts.xml文件中配置常量 <constant name="struts.action.extension" value="do"/> 2)在struts.properties中配置常量(struts.properties文件放置在src下): struts.action.extension=do struts2如何访问HttpServletRequest、HttpSession、ServletContext三个域对象? 方案一: HttpServletRequestrequest =ServletActionContext.getRequest(); HttpServletResponse response =ServletActionContext.getResponse(); HttpSession session= request.getSession(); ServletContextservletContext=ServletActionContext.getServletContext(); 方案二: 类 implements ServletRequestAware,ServletResponseAware,SessionAware,ServletContextAware 注意:框架自动传入对应的域对象 struts2是如何管理action的?这种管理方式有什么好处? struts2框架中使用包来管理Action,包的做用和java中的类包是很是相似的。 主要用于管理一组业务功能相关的action。在实际应用中,咱们应该把一组业务功能相关的Action放在同一个包下。 struts2中的默认包struts-default有什么做用? 1)struts-default包是由struts内置的,它定义了struts2内部的众多拦截器和Result类型,而Struts2不少核心的功能都是经过这些内置的拦截器实现,如:从请求中 把请求参数封装到action、文件上传和数据验证等等都是经过拦截器实现的。当包继承了struts-default包才能使用struts2为咱们提供的这些功能。 2)struts-default包是在struts-default.xml中定义,struts-default.xml也是Struts2默认配置文件。 Struts2每次都会自动加载 struts-default.xml文件。 3)一般每一个包都应该继承struts-default包。 struts2如何对指定的方法进行验证? 1)validate()方法会校验action中全部与execute方法签名相同的方法; 2)要校验指定的方法经过重写validateXxx()方法实现, validateXxx()只会校验action中方法名为Xxx的方法。其中Xxx的第一个字母要大写; 3)当某个数据校验失败时,调用addFieldError()方法往系统的fieldErrors添加校验失败信息(为了使用addFieldError()方法,action能够继承ActionSupport), 若是系统 的fieldErrors包含失败信息,struts2会将请求转发到名为input的result; 4)在input视图中能够经过<s:fielderror/>显示失败信息。 5)先执行validateXxxx()->validate()->若是出错了,会转发<result name="input"/>所指定的页面,若是不出错,会直接进行Action::execute()方法 struts2默认能解决get和post提交方式的乱码问题吗? 不能。struts.i18n.encoding=UTF-8属性值只能解析POST提交下的乱码问题。 请你写出struts2中至少5个的默认拦截器? fileUpload 提供文件上传功能 i18n 记录用户选择的locale cookies 使用配置的name,value来是指cookies checkbox 添加了checkbox自动处理代码,将没有选中的checkbox的内容设定为false,而html默认状况下不提交没有选中的checkbox。 chain 让前一个Action的属性能够被后一个Action访问,如今和chain类型的result()结合使用。 alias 在不一样请求之间将请求参数在不一样名字件转换,请求内容不变 值栈ValueStack的原理与生命周期? 1)ValueStack贯穿整个 Action 的生命周期,保存在request域中,因此ValueStack和request的生命周期同样。当Struts2接受一个请求时,会迅速建立ActionContext, ValueStack,action。而后把action存放进ValueStack,因此action的实例变量能够被OGNL访问。 请求来的时候,action、ValueStack的生命开始,请求结束,action、 ValueStack的生命结束; 2)action是多例的,和Servlet不同,Servelt是单例的; 3)每一个action的都有一个对应的值栈,值栈存放的数据类型是该action的实例,以及该action中的实例变量,Action对象默认保存在栈顶; 4)ValueStack本质上就是一个ArrayList; 5)关于ContextMap,Struts 会把下面这些映射压入 ContextMap 中: parameters : 该 Map 中包含当前请求的请求参数 request : 该 Map 中包含当前 request 对象中的全部属性 session :该 Map 中包含当前 session 对象中的全部属性 application :该 Map 中包含当前 application 对象中的全部属性 attr:该 Map 按以下顺序来检索某个属性: request, session, application 6)使用OGNL访问值栈的内容时,不须要#号,而访问request、session、application、attr时,须要加#号; 7)注意: Struts2中,OGNL表达式须要配合Struts标签才能够使用。如:<s:property value="name"/> 8)在struts2配置文件中引用ognl表达式 ,引用值栈的值 ,此时使用的"$",而不是#或者%; ActionContext、ServletContext、pageContext的区别? 1)ActionContext是当前的Action的上下文环境,经过ActionContext能够获取到request、session、ServletContext等与Action有关的对象的引用; 2)ServletContext是域对象,一个web应用中只有一个ServletContext,生命周期伴随整个web应用; 3)pageContext是JSP中的最重要的一个内置对象,能够经过pageContext获取其余域对象的应用,同时它是一个域对象,做用范围只针对当前页面,当前页面结束时,pageContext销毁, 生命周期是JSP四个域对象中最小的。 result的type属性中有哪几种结果类型? 一共10种: dispatcher struts默认的结果类型,把控制权转发给应用程序里的某个资源不能把控制权转发给一个外部资源,若须要把控制权重定向到一个外部资源, 应该使用 redirect结果类型 redirect 把响应重定向到另外一个资源(包括一个外部资源) redirectAction 把响应重定向到另外一个 Action freemarker、velocity、chain、httpheader、xslt、plainText、stream 拦截器的生命周期与工做过程? 1)每一个拦截器都是实现了Interceptor接口的 Java 类; 2)init(): 该方法将在拦截器被建立后当即被调用, 它在拦截器的生命周期内只被调用一次. 能够在该方法中对相关资源进行必要的初始化; 3)intercept(ActionInvocation invocation): 每拦截一个动做请求, 该方法就会被调用一次; 4)destroy: 该方法将在拦截器被销毁以前被调用, 它在拦截器的生命周期内也只被调用一次; 5)struts2中有内置了18个拦截器。 为何要用struts2 JSP、Servlet、JavaBean技术的出现给咱们构建强大的企业应用系统提供了可能。但用这些技术构建的系统很是的繁乱,因此在此之上,咱们须要一个规则、一个把这些技术组织起来的规则,这就是框架,Struts便应运而生。 基于Struts开发的应用由3类组件构成:控制器组件、模型组件、视图组件 struts2的validate框架是如何运做的 在struts配置文件中配置具体的错误提示,再在FormBean中的validate()方法具体调用。 说下struts2的设计模式 MVC模式: web应用程序启动时就会加载并初始化ActionServler。用户提交表单时,一个配置好的ActionForm对象被建立,并被填入表单相应的数据,ActionServler根据Struts-config.xml文件配置好的设置决定是否须要表单验证,若是须要就调用ActionForm的 Validate()验证后选择将请求发送到哪一个Action,若是Action不存在,ActionServlet会先建立这个对象,而后调用 Action的execute()方法。Execute()从ActionForm对象中获取数据,完成业务逻辑,返回一个ActionForward对象,ActionServlet再把客户请求转发给ActionForward对象指定的jsp组件,ActionForward对象指定的jsp生成动态的网页,返回给客户。 struts2如何完成文件的上传? 一、JSP页面: 1)JSP页面的上传文件的组件:<s: file name=”upload” />,若是须要一次上传多个文件, 就必须使用多个 file 标签, 但它们的名字必须是相同的,即: name=“xxx”的值必须同样; 2)必须把表单的enctype属性设置为:multipart/form-data; 3)表单的方法必须为post,由于post提交的数据在消息体中,而无大小限制。 二、对应的action: 1)在 Action 中新添加 3 个和文件上传相关的属性; 2)若是是上传单个文件, uploadImage属性的类型就是 java.io.File, 它表明被上传的文件, 第二个和第三个属性的类型是 String, 它们分别表明上传文 件的文件名和文件类型,定义方式是分别是: jsp页面file组件的名称+ContentType, jsp页面file组件的名称+FileName 3)若是上上传多个文件, 能够使用数组或 List struts2学习总结 1:在action中定义的变量,在jsp页面中显示用:<s:property value="变量名" /> 2:在页面中实现自动增长的序号用iterator的statuts的index属性 eg: <s:iterator value="#request.inOutAccountList"id="data" status="listStat"> <s:property value="#listStat.index+1"/> </s:iterator> 3:在action类中取得request和session对象的方法 Map session = ActionContext.getContext().getSession(); 设置它们的值的方法 session.put("operation", "add"); 页面中取得它们的值: <s:property value="#session.operation"/> 4:页面中奇偶行样式不同的控制方法: <tr class="<s:if test='#listStat.odd == true'>tableStyle-tr1</s:if><s:else>tableStyle-tr2</s:else>"> 5:单选框和复选框的使用方法 1):能够设置默认选中值,注意list的值的设置,经过这种方式使key和value不同,这种方法比较经常使用(checkboxlist or radio) <s:radio name="uncarInsPolicy.policyStateCode" 2):这里的key和value的值是同样的(checkboxlist or radio) <s:checkboxlist 6:struts2 中的标签会生成相似由<tr><td></td></tr>构成的字串(具体什么标签生成什么,能够查看生成后的页面的源代码)若是不限制这些多余代码的生成,页面将变得没法控制,因此通常咱们是不但愿它生成多余的代码的,具体的设置方法若是,在struts.xml中统一配置 7:jsp页面中格式化日期的方法 <s:date name="unCarInsModificationInfo.createTime"format="yyyy-MM-dd" nice="false"/>这样就能够将日期格式化为yyyy-MM-dd的形式 8:默认状况下,当请求action发生时,Struts运行时(Runtime)根据struts.xml里的Action映射集(Mapping),实例化action对应的类,并调用其execute方法。固然,咱们能够经过如下两种方法改变这种默认调用 1)在classes/sturts.xml中新建Action,并指明其调用的方法 public String aliasAction() { 2)(比较经常使用) 访问Action时,在Action名后加上“!xxx”(xxx为方法名)。 9:Struts 2.0有两个配置文件,struts.xml和struts.properties都是放在WEB-INF/classes/下。 10:在action类中取得web下某一文件夹物理路径(绝对路径)的方法 11:要想返回的页面不是一个直接JSP页面而是要先经过返回action中的方法读取相应的数据再返回到jsp页面,有两种方法 1)在struts.xml中这么设置 <result name="list"type="redirect-action">sysmanage/UserBaseInfoAction!findUserBaseInfo.action</result> 2)在action中返回时直接调用这个方法便可 return findList(); 12:设置checkboxlist中默认值的方法 <s:checkboxlist name="skills1" 13:二级级连下拉框 <s:set name="foobar" 在Struts1.*中,要想访问request、response以及session等Servlet对象是很方便的,由于它们一直是做为形参在各个方法之间进行传递的,而在Struts2中咱们就很难看到它们的芳踪了,由于咱们得到表单中的值都是经过预先设置好了的get方法来获得的,那么若是有些参数咱们必须经过request.getParametre或者session.getAttribute来获得,那么应该怎么作呢?按照Max的教程上的说法,能够分为两种:IoC方式和非IoC方式,如何理解这两种方式的区别呢?IoC是Spring里面的特征之一,字面意思是反转控制,说白了就是依赖注入,比方说类A依赖类B,那么就主动的给A注入一个类B的对象,下面看一下这两种方法的具体实现。 1.非Ioc方式 这种方式主要是利用了com.opensymphony.xwork2.ActionContext类以及org.apache.struts2.ServletActionContext类,具体的方法以下所示。 得到request对象: A.HttpServletRequest request =ServletActionContext.getRequest (); B.ActionContext ct= ActionContext.getContext() HttpServletRequest request= (HttpServletRequest)ct.get(ServletActionContext.HTTP_REQUEST); 得到session对象: 在Struts2中底层的session都被封装成了Map类型,咱们称之为SessionMap,而日常咱们所说的session则是指HttpSession对象,具体的得到方法以下所示。 A.Mapsession=ActionContext.getSession(); B.Mapsession=(Map)ActionContext.getContext().get(ActionContext.SESSION); 获得这个SessionMap以后咱们就能够对session进行读写了,若是咱们想获得原始的HttpSession能够首先获得HttpServletRequest对象,而后经过request.getSession()来取得原始的HttpSession对象。通常状况下SessionMap已经能够完成全部的工做,咱们没必要再去碰底层的session了。 2.IoC方式 这种方式相对来讲变化就比较少了,具体流程以下所示。 得到request对象: 第一步:让action实现ServletRequestAware接口 第二步:在action中声明一个HttpServletRequest类型的实例变量 第三步:在action中实现ServletRequestAware接口的setServletRequest方法,实现方式很简单,以下所示。 privateHttpServletRequest request; publicvoid setServletRequest(HttpServletRequestrequest) { this.request= request; } 得到Session对象(注意,此时的session是SessionMap类型): 第一步:让action实现SessionAware接口 第二步:在action中声明一个HttpServletRequest类型的实例变量 第三步:在action中实现SessionAware接口的setSession方法,实现方式很简单,以下所示。
Spring 面试题 Spring框架有哪些模块? Spring框架由七个模块组成组成,这7个模块(或组件)都可以单独存在,也能够与其它一个或多个模块联合使用,以下所示: (1)Spring 核心容器——IoC容器 (2) Spring AOP (3) SpringORM (4) SpringDAO (5) SpringWEB (6) Spring上下文(Context) (7) SpringMVC 为何要使用Spring框架,它有什么优势? (1) 轻量级的框架 (2) 非侵入性的 (3) 能够整合其它的框架,好比Struts, Hibernate等 (4) 能够提供事务管理 Spring框架的工做机制是什么? (1) Spring MVC将全部的请求都提交给DispatcherServlet,它会委托应用系统的其它模块负责对请求进行真正的处理工做。 (2) DispatcherServlet查询一个或多个HandlerMapping,找处处理请求的Controller。 (3) DispatcherServlet请请求提交到目标Controller。 (4) Controller进行业务逻辑处理后,会返回一个ModelAndView。 (5) Dispathcher查询一个或多个ViewResolver(视图解析器),找到ModelAndView对象指定的视图对象。 (6) 视图对象负责将结果返回给客户端。 怎么使用Spring配置事务 ? Spring同时支持编程式事务策略和声明式事务策略,大部分时候都采用声明式事务策略。 声明式事务管理的配置方式,一般有如下4种: (1) 使用TransactionProxyFactoryBean为目标Bean生成事务代理的配置。此方式是最传统、配置文件最臃肿、最难以阅读的方式。 (2) 采用Bean继承的事务代理配置方式,比较简洁,但依然是增量式配置。 (3) 采用BeanNameAutoProxyCreator,根据Bean Name自动生成事务代理的方式。这是直接利用Spring的AOP框架配置事务代理的方式,须要对Spring的AOP框架有所理解。但这种方式避免了增量式配置,效果很是不错。 (4) 采用DefaultAdvisorAutoProxyCreator,直接利用Spring的AOP框架配置事务代理的方式,效果很是不错,只是这种配置方式的可读性不如第3种方式。 请你谈谈SSH整合 SSH整合: (1) Struts(表示层)+ Spring(业务层)+ Hibernate(持久层) (2) Struts: Struts是一个表示层框架,主要做用是界面展现、接收请求和分发请求。 在MVC框架中,Struts属于VC层次,负责界面表现,负责MVC关系的分发。 View:沿用 JSP,HTTP,Form,Tag,Resourse; Controller:ActionServlet,struts-config.xml,Action。 (3) Hibernate: Hibernate是一个持久层框架,它只负责与关系数据库的操做。 (4) Spring: Spring是一个业务层框架,是一个整合的框架,可以很好地黏合表示层与持久层。 在Spring框架中如何配置数据库驱动? 使用org.springframework.jdbc.datasource.DriverManagerDataSource数据源来配置数据库驱动。 示例: 在Spring框架中applicationContext.xml文件能不能改为其它文件名? ContextLoaderListener是一个ServletContextListener,在启动Tomcat应用服务器时,它会读取WEB-INF目录下的applicationContext.xml文件,初始化Spring配置。 若是你想改变applicationContext.xml文件的名字或改变它的存储位置,能够经过在web.xml文件中定义一个<context-param>元素来解决这个问题。 示例: <context-param> </listener-class> 如何在Web应用里配置Spring? 在/WEB-INF/web.xml文件中,加入以下内容: <servlet> <servlet-name>context</servlet-name> <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class><load-on-startup>1</load-on-startup> </servlet> 在启动Web应用服务器(Tomcat)时,将加载/WEB-INF/applicationContext.xml文件中的内容。 在应用程序中,能够经过以下方式获取ApplicationContext实例 WebApplicationContextUtils.getWebApplicationContext Spring里如何定义Hibernate Mapping? 添加hibernatemapping 文件到WEB-INF目录下的applicationContext.xml文件中。 示例: 解释一下Dependency Injection(DI,依赖注入)和IoC(Inversion of Control,控制反转)? 依赖注入DI是一种设计模式,一般也称做控制反转,尽管在技术上来说,依赖注入是一个IoC的特殊实现,依赖注入是指一个对象应用另一个对象来提供一种特殊的能力。例如,把一个数据库链接以参数的形式传到一个对象的构造函数里面而不是在那个对象内部自行建立一个链接。 控制反转和依赖注入的基本思想就是把类的依赖从类内部转化到外部以减小依赖。 应用控制反转,对象在被建立的时候,由一个调控系统内全部对象的外界实体,将其所依赖的对象的引用,传递给它。也能够说,依赖被注入到对象中。因此,控制反转是,关于一个对象如何获取它依赖的对象的引用,这个责任的反转。 Spring中的BeanFactory与ApplicationContext的做用有哪些? (1) BeanFactory负责读取Bean配置文档,管理Bean的加载和实例化,维护Bean之间的依赖关系,负责Bean的生命周期。 (2)ApplicationContext除了提供上述BeanFactory所能提供的功能以外,还提供了更完整的框架功能: a. 国际化支持 b. 资源访问:Resource rs = ctx. getResource(”classpath:config.properties”); c. 事件传递:经过实现ApplicationContextAware接口 (3) 经常使用的获取ApplicationContext的方法: FileSystemXmlApplicationContext:从文件系统或者URL指定的xml配置文件建立,参数为配置文件名或文件名数组 ClassPathXmlApplicationContext:从classpath的xml配置文件建立,能够从jar包中读取配置文件。 WebApplicationContextUtils:从web应用的根目录读取配置文件,须要先在web.xml中配置,能够配置监听器或者 servlet来实现 <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/myApplicationContext.xml</param-value> </context-param> 如何在Spring中实现国际化? 在applicationContext.xml文件中配置一个bean: Spring中的核心类有那些,各有什么做用? BeanFactory:产生一个新的实例,能够实现单例模式。 BeanWrapper:提供统一的get及set方法。 ApplicationContext:提供Spring框架的实现,包括BeanFactory的全部功能。 什么是AOP,AOP的做用是什么? 面向切面编程(AOP)提供另一种角度来思考程序结构,经过这种方式弥补了面向对象编程(OOP)的不足。 除了类(classes)之外,AOP提供了切面。切面对关注点进行模块化,例如横切多个类型和对象的事务管理。 Spring的一个关键的组件就是AOP框架,能够自由选择是否使用AOP,提供声明式企业服务,特别是为了替代EJB声明式服务。最重要的服务是声明性事务管理,这个服务创建在Spring的抽象事物管理之上。 容许用户实现自定义切面,用AOP来完善OOP的使用,能够把Spring AOP看做是对Spring的一种加强。 使用Spring有什么好处? (1) Spring能有效地组织你的中间层对象,不管你是否选择使用了EJB。若是你仅仅使用了Struts或其它的包含了J2EE特有APIs的 framework,你会发现Spring关注了遗留问题。 (2) Spring能消除在许多工程上对Singleton的过多使用。 (3) Spring能消除使用各类格式的属性定制文件的须要,在整个工程中,可经过一种一致的方法来进行配置。曾经感到迷惑,一个特定类要查找迷幻般的属性关键字或系统属性,为此不得不读Javadoc乃至源编码吗?有了Spring,你可很简单地看到类的JavaBean属性。 (4) Spring能经过接口而不是类促进好的编程习惯,减小编程代价到几乎为零。 (5) Spring被设计为让使用它建立的应用尽量少的依赖于它的APIs。在Spring应用中的大多数业务对象没有依赖于Spring。 (6) 使用Spring构建的应用程序易于单元测试。 (7) Spring能使EJB的使用成为一个实现选择,而不是应用架构的必然选择。你能选择用POJOs或local EJBs来实现业务接口,却不会影响调用代码。 (8) Spring帮助你解决许多问题而无需使用EJB。Spring能提供一种EJB的替换物,它们适于许多web应用。例如,Spring能使用AOP提供声明性事务而不经过使用EJB容器,若是你仅仅须要与单个的数据库打交道,甚至不须要JTA实现。 (9) Spring为数据存取提供了一致的框架,不管是使用JDBC或O/Rmapping产品(如Hibernate)。 什么是Spring,它有什么特色? Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。 (1) 轻量——从大小与开销两方面而言Spring都是轻量的。完整的Spring框架能够在一个大小只有1MB多的JAR文件里发布,而且Spring所需的处理开销也是微不足道的。此外,Spring是非侵入式的:典型地,Spring应用中的对象不依赖于Spring的特定类。 (2) 控制反转——Spring经过一种称做控制反转(IoC)的技术促进了松耦合。当应用了IoC,一个对象依赖的其它对象会经过被动的方式传递进来,而不是这个对象本身建立或者查找依赖对象。你能够认为IoC与JNDI相反——不是对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它。 (3) 面向切面——Spring提供了面向切面编程的丰富支持,容许经过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务管理)进行内聚性的开发。应用对象只实现它们应该作的——完成业务逻辑——仅此而已。它们并不负责其它的系统级关注点,例如日志或事务支持。 (4) 容器——Spring包含并管理应用对象的配置和生命周期,在这个意义上它是一种容器,你能够配置你的每一个bean如何被建立——基于一个可配置原型(prototype),你的bean能够建立一个单独的实例或者每次须要时都生成一个新的实例——以及它们是如何相互关联的。然而,Spring不该该被混同于传统的重量级的EJB容器,它们常常是庞大与笨重的,难以使用。 (5) 框架——Spring能够将简单的组件配置、组合成为复杂的应用。在Spring中,应用对象被声明式地组合,典型地是在一个XML文件里。 Spring也提供了不少基础功能(事务管理、持久化框架集成等等),将应用逻辑的开发留给了你。 AOP里面几个重要名词概念的解释 (1) 切面(Aspect) 一个关注点的模块化,这个关注点可能会横切多个对象。事务管理是J2EE应用中一个关于横切关注点的很好的例子。 在Spring AOP中,切面能够使用通用类(基于模式的风格)或者在普通类中以 @Aspect 注解来实现。 (2) 链接点(Joinpoint) 在程序执行过程当中某个特定的点,好比某方法调用的时候或者处理异常的时候。在Spring AOP中,一个链接点老是表明一个方法的执行。 经过声明一个org.aspectj.lang.JoinPoint类型的参数能够使通知(Advice)的主体部分得到链接点信息。 (3) 通知(Advice) 在切面的某个特定的链接点(Joinpoint)上执行的动做。通知有各类类型,其中包括“around”、“before”和“after”等通知。通知的类型将在后面部分进行讨论。许多AOP框架,包括Spring,都是以拦截器作通知模型,并维护一个以链接点为中心的拦截器链。 (4) 切入点(Pointcut) 匹配链接点(Joinpoint)的断言。通知和一个切入点表达式关联,并在知足这个切入点的链接点上运行(例如,当执行某个特定名称的方法时)。切入点表达式如何和链接点匹配是AOP的核心:Spring缺省使用AspectJ切入点语法。 (5) 引入(Introduction) 也被称为内部类型声明(inter-typedeclaration))。声明额外的方法或者某个类型的字段。 Spring容许引入新的接口(以及一个对应的实现)到任何被代理的对象。例如,你能够使用一个引入来使bean实现 IsModified 接口,以便简化缓存机制。 (6) 目标对象(TargetObject) 被一个或者多个切面(aspect)所通知(advise)的对象。也有人把它叫作被通知(advised) 对象。 既然Spring AOP是经过运行时代理实现的,这个对象永远是一个被代理(proxied)对象。 (7) AOP代理(AOP Proxy) AOP框架建立的对象,用来实现切面契约(aspect contract)(包括通知方法执行等功能)。 在Spring中,AOP代理能够是JDK动态代理或者CGLIB代理。 注意:Spring 2.0最新引入的基于模式(schema-based)风格和@AspectJ注解风格的切面声明,对于使用这些风格的用户来讲,代理的建立是透明的。 (8) 织入(Weaving) 把切面(aspect)链接到其它的应用程序类型或者对象上,并建立一个被通知(advised)的对象。 这些能够在编译时(例如使用AspectJ编译器),类加载时和运行时完成。 Spring和其它纯Java AOP框架同样,在运行时完成织入。 spring工做机制及为何要用? 1.spring mvc请全部的请求都提交给DispatcherServlet,它会委托应用系统的其余模块负责负责对请求进行真正的处理工做。 为何用Spring: {AOP 让开发人员能够建立非行为性的关注点,称为横切关注点,并将它们插入到应用程序代码中。使用 AOP 后,公共服务 (比 如日志、持久性、事务等)就能够分解成方面并应用到域对象上,同时不会增长域对象的对象模型的复杂性。
Hibernate 面试题
比较Hibernate的三种检索策略优缺点 1当即检索; 如何在控制台看到hibernate生成并执行的sql 在定义数据库和数据库属性的文件applicationConfig.xml里面,把hibernate.show_sql 设置为true hibernate都支持哪些缓存策略 Read-only: 这种策略适用于那些频繁读取却不会更新的数据,这是目前为止最简单和最有效的缓存策略 hibernate里面的sorted collection 和ordered collection有什么区别 sorted collection是在内存中经过java比较器进行排序的 Hibernate工做原理及为何要用? 原理: 为何要用: 2. Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工做 3. hibernate使用Java反射机制,而不是字节码加强程序来实现透明性。 4. hibernate的性能很是好,由于它是个轻量级框架。映射的灵活性很出色。它支持各类关系数据库,从一对一到多对多的各类复杂关系。 Hibernate是如何延迟加载? 1. Hibernate2延迟加载实现:a)实体对象 b)集合(Collection) 2. Hibernate3 提供了属性的延迟加载功能 当Hibernate在查询数据的时候,数据并无存在与内存中,当程序真正对数据的操做时,对象才存在与内存中,就实现了延迟加载,他节省了服务器的内存开销,从而提升了服务器的性能。 Hibernate中怎样实现类之间的关系?(如:一对多、多对多的关系) 类与类之间的关系主要体如今表与表之间的关系进行操做,它们都是对对象进行操做,咱们程序中把全部的表与类都映射在一块儿,它们经过配置文件中的many-to-one、one-to-many、many-to-many、 说下Hibernate的缓存机制 1. 内部缓存存在Hibernate中又叫一级缓存,属于应用事物级缓存 2. 二级缓存: Hibernate的查询方式 Sql、Criteria,objectcomposition 如何优化Hibernate? 1.使用双向一对多关联,不使用单向一对多 Hibernate有哪几种查询数据的方式 3种:hql、条件查询QBC(QueryBy Criteria)、原生sql (经过createSQLQuery创建) 谈谈Hibernate中inverse的做用 inverse属性默认是false,就是说关系的两端都来维护关系。 说说Hibernate中的update()和saveOrUpdate()的区别,session的load()和get()的区别。 saveOrUpdate()方法能够实现update()的功能,但会多些步骤,具体以下: hibernate中对象的三种状态 瞬时态(Transient)、持久态(Persistent)、脱管态(Detached)。处于持久态的对象也称为PO(Persistence Object),瞬时对象和脱管对象也称为VO(Value Object)。 瞬时态 由new命令开辟内存空间的java对象, eg. Person person =new Person(”amigo”, “女”); 若是没有变量对该对象进行引用,它将被java虚拟机回收。 瞬时对象在内存孤立存在,它是携带信息的载体,不和数据库的数据有任何关联关系,在Hibernate中,可经过session的save()或 saveOrUpdate()方法将瞬时对象与数据库相关联,并将数据对应的插入数据库中,此时该瞬时对象转变成持久化对象。 持久态 处于该状态的对象在数据库中具备对应的记录,并拥有一个持久化标识。若是是用hibernate的delete()方法,对应的持久对象就变成瞬时对象,因数据库中的对应数据已被删除,该对象再也不与数据库的记录关联。 当一个session执行close()或clear()、evict()以后,持久对象变成脱管对象,此时持久对象会变成脱管对象,此时该对象虽然具备数据库识别值,但它已不在HIbernate持久层的管理之下。 持久对象具备以下特色: 1. 和session实例关联;n 2. 在数据库中有与之关联的记录。 脱管态 当与某持久对象关联的session被关闭后,该持久对象转变为脱管对象。当脱管对象被从新关联到session上时,并再次转变成持久对象。 脱管对象拥有数据库的识别值,可经过update()、saveOrUpdate()等方法,转变成持久对象。 脱管对象具备以下特色: 1. 本质上与瞬时对象相同,在没有任何变量引用它时,JVM会在适当的时候将它回收; 2. 比瞬时对象多了一个数据库记录标识值。4RESA3ES B Detached Object(游离对象)有什么好处 Detached Object(游离对象)能够传递到任何层直到表现层而不是用任何DTO(DataTransfer Objects). 而后你还能够从新把游离对象赋给另一个Session. JDBC hibernate 和 ibatis 的区别 jdbc:手动 hibernate如何实现数据表映射的继承关系 一、两个表,子类重复父类的属性。 hibernate中Query对象的使用 1 个或多个属性查询: hibernate中Criteria和DetachedCriteria的做用是什么? Criteriac=session.createCriteria(Customer.class); DetachedCriteria产生时不须要session hibernate中数据表映射关系主要有什么类型? one-to-many hibernate的核心是什么,他们的相互关系是什么,重要的方法是什么 Configuration MyEclipse加入hibernate的全过程是什么 1.Db-browers加入配置链接 面试中常出现的两个hibernate面试题及答案 1.在数据库中条件查询速度很慢的时候,如何优化? 2.在hibernate中进行多表查询,每一个表中各取几个字段,也就是说查询出来的结果集并无一个实体类与之对应,如何解决这个问题? 若是未能发现符合条件的记录,get方法返回null,而load方法会抛出一个ObjectNotFoundException。 首先,Hibernate中维持了两级缓存。第一级缓存由Session实例维护,其中保持了Session当前全部关联实体的数据,也称为内部缓存。而第二级缓存则存在于SessionFactory层次,由当前全部由本 SessionFactory构造的Session实例共享。出于性能考虑,避免无谓的数据库访问,Session在调用数据库查询功能以前,会先在缓存中进行查询。首先在第一级缓存中,经过实体类型和id进行查找,若是第一级缓存查找命中,且数据状态合法,则直接返回。 Hibernate的主键生成机制 1) assigned hibernate面试题:怎么获得一个Collection的大小而不用初始化它 Integer size = (Integer) s.createFilter( collection, "select count(*)" ).uniqueResult(); hibernate面试题:怎么获得查询结果的记录数而不用返回查询结果 Integer count = (Integer) session.createQuery("select count(*) from ....").uniqueResult(); 什么是SessionFactory,她是线程安全么? SessionFactory isHibernates concept of a single datastore and is threadsafe so that many threadscan access it concurrently and request for sessions and immutable cache ofcompiled mappings for a single database. A SessionFactory is usually only builtonce at startup. SessionFactory should be wrapped in some kind of singleton sothat it can be easily accessed in an application code. SessionFactorysessionFactory = new Configuration().configure().buildSessionfactory(); SessionFactory 是Hibrenate单例数据存储和线程安全的,以致于能够多线程同时访问。一个SessionFactory 在启动的时候只能创建一次。SessionFactory应该包装各类单例以致于它能很简单的在一个应用代码中储存. 如何配置Hibernate? The configurationfiles hibernate.cfg.xml (or hibernate.properties) and mapping files *.hbm.xmlare used by the Configuration class to create (i.e. configure and bootstraphibernate) the SessionFactory, which in turn creates the Session instances.Session instances are the primary interface for the persistence service. ”hibernate.cfg.xml (alternatively can use hibernate.properties): These two filesare used to configure the hibernate sevice (connection driver class, connectionURL, connection username, connection password, dialect etc). If both files arepresent in the classpath then hibernate.cfg.xml file overrides the settingsfound in the hibernate.properties file. ” Mapping files(*.hbm.xml): These files are used to map persistent objects to a relationaldatabase. It is the best practice to store each object in an individual mappingfile (i.e mapping file per class) because storing large number of persistentclasses into one mapping file can be difficult to manage and maintain. Thenaming convention is to use the same name as the persistent (POJO) class name.For example Account.class will have a mapping file named Account.hbm.xml.Alternatively hibernate annotations can be used as part of your persistentclass code instead of the *.hbm.xml files. 优化hibernate性能的几点建议 一、针对oracle数据库而言,Fetch Size 是设定JDBC的Statement读取数据的时候每次从数据库中取出的记录条数,通常设置为30、50、100。Oracle数据库的JDBC驱动默认的FetchSize=15,设置Fetch Size设置为:30、50,性能会有明显提高,若是继续增大,超出100,性能提高不明显,反而会消耗内存。 即在hibernate配制文件中进行配制: 1 <property name=”hibernateProperties”> 三、不要把全部的责任推在hibernate上,对代码进行重构,减小对数据库的操做,尽可能避免在数据库查询时使用in操做,以及避免递归查询操做,代码质量、系统设计的合理性决定系统性能的高低。 四、 对大数据量查询时,慎用list()或者iterator()返回查询结果, (1). 使用List()返回结果时,Hibernate会全部查询结果初始化为持久化对象,结果集较大时,会占用不少的处理时间。 (2). 而使用iterator()返回结果时,在每次调用iterator.next()返回对象并使用对象时,Hibernate才调用查询将对应的对象初始化,对于大数据量时,每调用一次查询都会花费较多的时间。当结果集较大,可是含有较大量相同的数据,或者结果集不是所有都会使用时,使用iterator()才有优点。 五、在一对多、多对一的关系中,使用延迟加载机制,会使很多的对象在使用时方会初始化,这样可以使得节省内存空间以及减小数据库的负荷,并且若PO中的集合没有被使用时,就可减小互数据库的交互从而减小处理时间。 六、对含有关联的PO(持久化对象)时,若default-cascade=”all”或者 “save-update”,新增PO时,请注意对PO中的集合的赋值操做,由于有可能使得多执行一次update操做。 七、 对于大数据量新增、修改、删除操做或者是对大数据量的查询,与数据库的交互次数是决定处理时间的最重要因素,减小交互的次数是提高效率的最好途径,因此在开发过程当中,请将show_sql设置为true,深刻了解Hibernate的处理过程,尝试不一样的方式,能够使得效率提高。尽量对每一个页面的显示,对数据库的操做减小到100—-150条之内。越少越好。 如何进行hibernate性能调优 大致上,对于HIBERNATE性能调优的主要考虑点以下: JDBC ,hibernate分页显示怎么实现? 答:方法分别为: Hibernate的应用(hibernate的结构) 答://首先得到SessionFactory 的对象 关于hibernate的几个面试题 1)在hibernate 中,在配置文件呈标题一对多,多对多的标签是什么; Hibernate的五个核心接口 Configuration 接口:配置Hibernate,根据其启动hibernate,建立 如何优化hibernate 1. 使用双向一对多关联,不使用单向一对多 说下hibernate的缓存机制 1. 内部缓存存在Hibernate中又叫一级缓存,属于应用事物级缓存 hibernate怎么实现类之间的关系 类与类之间的关系主要体如今表与表之间的关系进行操做,它们都是对对象进行操做,咱们程序中把全部的表与类都映射在一块儿,它们经过配置文件中的many-to-one、one-to-many、many-to-many、 hibernate如何实现延迟加载 1. Hibernate2延迟加载实现:a)实体对象 b)集合(Collection) Hibernate数据查询的几种方式 1.使用主键id加载对象(load(),get()); 2.经过对象导航,好比经过stu.getTeam()获得team的实例; 3 使用hql; 4使用qbc(query by criteria) 5直接使用sql语句取得记录集; 通常都使用后面三种方式. 注意.hql是面向对象的查询.语法和sql是基本同样的.不区分大小写的,可是注意的是对与对象.必须遵循对象的大小写.由于hql是对像查询..同时咱们必须清楚.hql只能取得对象,而不支持uid(update,insert.delete) Hibernate中:不看数据库,不看XML文件,不看查询语句,怎么能知道表的结构 看表结构对应的类文件,好比UserInfo表对应的UserInfo.java文件
S2SH部分 请你谈谈SSH整合 SSH:
综合面试题 一、 简述你对IoC(Inversion of Control)的理解,描述一下Spring中实现DI(Dependency Injection)的几种方式。 spring的IOC有三种注入方式 第一是根据属性注入 也叫set方法注入;第二种是根据构造方法进行注入;第三种是根据注解进行注入,这种方式我认为比较好,方便,要是bean多的话,使用前两种方式会使得配置文件过于臃肿。 二、 Spring的Bean有多种做用域,包括: 三、 简单描述Spring Framework与Struts的不一样之处,整合Spring与Struts有哪些方法,哪一种最好,为何? 答、 Spring是完整的一站式框架,而Struts仅是MVC框架,且着重于MVC中的C。Spring有三种方式整合Struts:使用 Spring 的 ActionSupport 类整合 Struts;使用 Spring 的DelegatingRequestProcessor 覆盖 Struts 的 RequestProcessor;将 Struts Action 管理委托给 Spring 框架,动做委托最好。(详见使用Spring 更好地处理Struts 动做) Spring 2.0新增一种方式:AutowiringRequestProcessor。(详见http://www.javaeye.com/topic/24239) 四、 Hibernate中的update()和saveOrUpdate()的区别 答、saveOrUpdate()方法能够实现update()的功能,但会多些步骤,具体以下: 若是对象在该session中已经被持久化,不进行操做; 对象的标识符属性(identifierproperty)在数据库中不存在或者是个暂时的值,调用save()方法保存它; 若是session中的另外一个对象有相同的标识符抛出一个异常; 以上皆不符合则调用update()更新之。 五、 Spring对多种ORM框架提供了很好的支持,简单描述在Spring中使用Hibernate的方法,并结合事务管理。 答、 在context中定义DataSource,建立SessionFactoy,设置参数;DAO类继承HibernateDaoSupport,实现具体接口,从中得到HibernateTemplate进行具体操做。 在使用中若是遇到OpenSessionInView的问题,能够添加OpenSessionInViewFilter或OpenSessionInViewInterceptor。(详见Spring framework 2.0 Reference的12.2节Hibernate) 声明式事务需声明事务管理器,在context中设置指定属性,用肯定和。 |