《JAVA面试问题与复习资料.docx》由会员分享,可在线阅读,更多相关《JAVA面试问题与复习资料.docx(26页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、1、什么是ORM ?答:对象关系映射(Object-Relational Mapping ,简称ORM )是一种为了解决程序的面 对对象模型与数据库的关系模型互不匹配问题的技术;简洁的说,ORM是通过运用描述对 象和数据库之间映射的元数据(在Java中可以用XML或者是注解),将程序中的对象自 动许久化到关系数据库中或者将关系数据库表中的行转换成Java对象,其本质上就是将数 据从一种形式转换到另外一种形式。2、许久层设计要考虑的问题有哪些?你用过的许久层框架有哪些?答:所谓“许久就是将数据保存到可掉电式存储设备中以便今后运用,简洁的说,就是将内 存中的数据保存到关系型数据库、文件系统、消息队
2、列等供应许久化支持的设备中。许久层 就是系统中专注于实现数据许久化的相对独立的层面。许久层设计的目标包括:- 数据存储逻辑的分别,供应抽象化的数据访问接口。- 数据访问底层实现的分别,可以在不修改代码的状况下切换底层实现。- 资源管理和调度的分别,在数据访问层实现统一的资源调度(如缓存机制)。-数据抽象,供应更面对对象的数据操作。许久层框架有:-Hibernate-MyBatis-TopLink-Guzz -jOOQ17、MyBatis中运用#和$书写占位符有什么区分?答:#将传入的数据都当成一个字符串,会对传入的数据自动加上引号;$将传入的数据干 脆显示生成在SQL中。留意:运用,占位符可能
3、会导致SQL注射攻击,能用#的地方就不要 运用于,写order by子句的时候应当用于而不是#。18、说明一下MyBatis中命名空间(namespace )的作用。答:在大型项目中,可能存在大量的SQL语句,这时候为每个SQL语句起一个唯一的标识 (ID )就变得并不简洁了。为了解决这个问题,在MyBatis中,可以为每个映射文件起一 个唯一的命名空间,这样定义在这个映射文件中的每个SQL语句就成了定义在这个命名空 间中的一个ID。只要我们能够保证每个命名空间中这个ID是唯一的,即使在不同映射文件 中的语句ID相同,也不会再产生冲突了。19、MyBatis中的动态SQL是什么意思?答:对于一
4、些困难的查询,我们可能会指定多个查询条件,但是这些条件可能存在也可能不 存在,例如在58同城上面找房子,我们可能会指定面积、楼层和所在位置来查找房源,也 可能会指定面积、价格、户型和所在位置来查找房源,此时就须要依据用户指定的条件动态 生成SQL语句。假如不运用许久层框架我们可能须要自己拼装SQL语句,还好MyBatis 供应了动态SQL的功能来解决这个问题。MyBatis中用于实现动态SQL的元素主要有: -if-choose / when / otherwise-trim -where-set -foreach20、说明一下什么叫AOP (面对切面编程)?答:AOP ( Aspect-Or
5、iented Programming )指一种程序设计范型,该范型以一种称为切面(aspect)的语言构造为基础,切面是一种新的模块化机制,用来描述分散在对象、类 或方法中的横切关注点(crosscutting concern ) o21、Spring中自动装配的方式有哪些?答:- no :不进行自动装配,手动设置Bean的依靠关系。- byName :依据Bean的名字进行自动装配。- byType :依据Bean的类型进行自动装配。- constructor:类似于byType ,不过是应用于构造器的参数,假如正好有一Bean与构 造器的参数类型相同则可以自动装配,否则会导致错误。- au
6、todetect :假如有默认的构造器,则通过constructor的方式进行自动装配,否则运用 byType的方式进行自动装配。说明:自动装配没有自定义装配方式那么精确,而且不能自动装配简洁属性(基本类型、字符串等),在运用时应留意。然后可以用Component、Controllers Servicex Repository 注解来标注须要由 Spring IoC 容器进行对象托管的类。这几个注解没有本质区分,只不过Controller 通常用于限制器,Service通常用于业务逻辑类,Repository通常用于 仓储类(例如我们的DAO实现类),一般的类用Component来标注。22、
7、Spring支持的事务管理类型有哪些?你在项目中运用哪种方式?答:Spring支持编程式事务管理和声明式事务管理。许多Spring框架的用户选择声明式事 务管理,因为这种方式和应用程序的关联较少,因此更加符合轻量级容器的概念。声明式事 务管理要优于编程式事务管理,尽管在灵敏性方面它弱于编程式事务管理,因为编程式事务 允许你通过代码限制业务。事务分为全局事务和局部事务。全局事务由应用服务器管理,须要底层服务器JTA支持(如 WebLogic、WildFly等)。局部事务和底层接受的许久化方案有关,例如运用JDBC进行 许久化时,须要运用Connetion对象来操作事务;而接受Hibernate进
8、行许久化时,须要 运用Session对象来操作事务。23、Spring MVC的工作原理是怎样的?客户端的全部请求都交给前端限制器DispatcherServlet来处理,它会负责调用系统的 其他模块来真正处理用户的请求。DispatcherServlet收至U请求后,将依据请求的信息(包括URL、协议方法、请求头、请求参数、Cookie等)以及HandlerMapping的配置找到处理该请求的Handler (任 何一个对象都可以作为请求的Handler) 0在这个地方Spring会通过HandlerAdapter对该处理器进行封装。(?) HandlerAdapter是一个适配器,它用统一
9、的接口对各种Handler中的方法进行调用。Handler完成对用户请求的处理后,会返回一个ModelAndView对象给 DispatcherServlet ,ModelAndView顾名思义,包含了数据模型以及相应的视图的信息。ModelAndView的视图是逻辑视图,DispatcherServlet还要借助ViewResolver完成从逻辑视图到真实视图对象的解析工作。当得到真正的视图对象后,DispatcherServlet会利用视图对象对模型数据进行渲染。客户端得到响应,可能是一个一般的HTML页面,也可以是XML或JSON字符串,还 可以是一张图片或者一个PDF文件。24、 Sp
10、ring IoC容器酉己置Bean的方式?答:- 基于XML文件进行配置。- 基于注解进行配置。- 基于Java程序进行配置(Spring 3+ )25、阐述Spring框架中Bean的生命周期?答:Spring IoC容器找到关于Bean的定义并实例化该BeanoSpring IoC容器对Bean进行依靠注入。 假如Bean实现了 BeanNameAware接口,则将该Bean的id传给setBeanName方 法。 假如Bean实现了 BeanFactoryAware接口,贝J将BeanFactory对象传给 setBeanFactory 方法。 假如Bean实现了 BeanPostPro
11、cessor接口,则调用其 postProcessBeforelnitialization 方法。 假如 Bean 实现了 InitializingBean 接口,则调用其 afterPropertySet 方法。 假如有和Bean关联的BeanPostProcessors对象,则这些对象的postProcessAfterlnitialization 方法被调用。当销毁Bean实例时,假如Bean实现了 DisposableBean接口,则调用其destroy方法。26.依靠注入时如何注入集合属性?答:可以在定义Bean属性时,通过/ / m叩/props分别为其注入列 表、集合、映射和键值都
12、是字符串的映射属性。27、Spring中的自动装配有哪些限制?-假如运用了构造器注入或者setter注入,那么将覆盖自动装配的依靠关系。-基本数据类型的值、字符串字面量、类字面量无法运用自动装配来注入。-优先考虑运用显式的装配来进行更精确的依靠注入而不是运用自动装配。28、服务器收到用户提交的表单数据,原委是调用Servlet的doGet()还是doPost()方 法?答:HTML的元素有一个method属性,用来指定提交表单的方式,其值可以是 get或posto我们自定义的Servlet 一般状况下会重写doGet()或d。Post。两个方法之一 或全部,假如是GET请求就调用doGet()
13、方法,假如是POST请求就调用doPost()方法, 那为什么为什么这样呢?我们自定义的Servlet通常继承自Servlet, Servlet继承自GenericServlet并重写了其中的service。方法,这个方法是Servlet接口中定义的。 Servlet重写的service。方法会先获得用户请求的方法,然后依据请求方法调用doGet()、 doPost()s doPut()x doDelete。等方法,假如在自定义Servlet中重写了这些方法,那么 明显会调用重写过的(自定义的)方法,这明显是对模板方法模式的应用(假如不理解,请 参考阎宏博士的Java与模式一书的第37章)。当
14、然,自定义Servlet中也可以干脆重写service。方法,那么不管是哪种方式的请求,都可以通过自己的代码进行处理,这对于 不区分请求方法的场景比较合适。29、讲解JSP中的四种作用域。答:JSP中的四种作用域包括page、request, session和application ,详细来说:-page代表与一个页面相关的对象和属性。-request代表与Web客户机发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个Web组件;须要在页面显示的临时数据可以置于此作用域。-session代表与某个用户与服务器建立的一次会话相关的对象和属性。跟某个用户相关的数据应当放在用户自己的
15、session中。-application代表与整个Web应用程序相关的对象和属性,它实质上是跨越整个Web应用程序,包括多个页面、请求和会话的一个全局作用域。30、JSP和Servlet是什么关系?答:其实这个问题在上面已经阐述过了,Servlet是一个特殊的Java程序,它运行于服务器 的JVM中,能够依靠服务器的支持向阅读器供应显示内容。JSP本质上是Servlet的一种 简易形式,JSP会被服务器处理成一个类似于Servlet的Java程序,可以简化页面内容的 生成。Servlet和JSP最主要的不同点在于,Servlet的应用逻辑是在Java文件中,并且完 全从表示层中的HTML分别
16、开来。而JSP的状况是Java和HTML可以组合成一个扩展名 为.jsp的文件。有人说,Servlet就是在Java中写HTML ,而JSP就是在HTML中写Java 代码,当然这个说法是很片面且不够精确的。JSP侧重于视图,Servlet更侧重于限制逻辑, 在MVC架构模式中,JSP适合充当视图(view )而Servlet适合充当限制器(controller )o31、Servlet接口中有哪些方法?答:Servlet接口定义了 5个方法,其中前三个方法与Servlet生命周期相关:- void init(ServletConfig config) throws ServletExcept
17、ion- void destoryO- java.lang.String getServletInfo()- ServletConfig getServletConfigQWeb容器加载Servlet并将其实例化后,Servlet生命周期起先,容器运行其init()方法进 行Servlet的初始化;请求到达时调用Servlet的service。方法,service。方法会依据须要 调用与请求对应的doGet或doPost等方法;当服务器关闭或项目被卸载时服务器会将 Servlet实例销毁,此时会调用Servlet的destroy。方法。32.阐述Servlet和CGI的区分?答:Servlet
18、与CGI的区分在于Servlet处于服务器进程中,它通过多线程方式运行其 service。方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个 请求都产生新的进程,服务完成后就销毁,所以效率上低于Servlet033、简述正则表达式及其用途。答:在编写处理字符串的程序时,经常会有查找符合某些困难规则的字符串的须要。正则表 达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码。说明:计算机诞生初期处理的信息几乎都是数值,但是时过境迁,今日我们 运用计算机处理的信息更多的时候不是数值而是字符串,正则表达式就是在 进行字符串匹配和处理的时候最为强大的工具,绝
19、大多数语言都供应了对正 则表达式的支持。34. java 项设计模式有哪些创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建立者模式、原型模式。结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。行为型模式,共十一种:策略模式、模板方法模式、视察者模式、迭代子模式、责任链模式、叮嘱模式、备忘录模式、状态模式、访问者模式、中介者模式、说明器模式。35.设计模式的六大原则L 开闭原则(Open Close Principle )开闭原则就是说对扩绽开放,对修改关闭。在程序须要进行拓展的时候,不能去修改原有的 代码,实现一个热插拔的效果。所以一句话
20、概括就是:为了使程序的扩展性好,易于维护和 升级。想要达到这样的效果,我们须要运用接口和抽象类,后面的详细设计中我们会提到这 点。2、里氏代换原则(Liskov Substitution Principle )里氏代换原则(Liskov Substitution Principle LSP)面对对象设计的基本原则之一。里氏代 换原则中说,任何基类可以出现的地方,子类确定可以出现。LSP是继承复用的基石,只 有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生 类也能够在基类的基础上增加新的行为。里氏代换原则是对开-闭”原则的补充。实现开 -闭原则的关键步骤就是抽象化
21、。而基类与子类的继承关系就是抽象化的详细实现,所以 里氏代换原则是对实现抽象化的详细步骤的规范。 From Baidu百科3、依靠倒转原则(Dependence Inversion Principle )这个是开闭原则的基础,详细内容:真对接口编程,依靠于抽象而不依靠于详细。4、接口隔离原则(Interface Segregation Principle )这个原则的意思是:运用多个隔离的接口,比运用单个接口要好。还是一个降低类之间的耦 合度的意思,从这儿我们看出,其实设计模式就是一个软件的设计思想,从大型软件架构动 身,为了升级和维护便利。所以上文中多次出现:降低依靠,降低耦合。5、迪米特法
22、则(最少知道原则)(Demeter Principle )为什么叫最少知道原则,就是说:一个实体应当尽量少的与其他实体之间发生相互作用,使 得系统功能模块相对独立。6、合成复用原则(Composite Reuse Principle )36、为什么要运用ORM技术?和JDBC有何不一样?1、繁琐的代码问题:用JDBC的API编程访问数据库,代码量较大,特殊是访问字段较多的表的时候,代码显得繁琐、累赘,简洁出错,例如:public void addAccount(final Account account) throws DAOException final Connection conn=ge
23、tConnection();PreparedStatement pstmt=con.prepareStatment(insert into accountvalue(?,pstmt.setString(l/account.getUserName();pstmt.setInt(2/account.getPassWord();pstmt.setString(3/account.getSex();pstmt.setString(4,account.getQq();pstmt.executeO;conn.CloseQ;可见,程序员须要耗费大量的时间、精力去编写详细的数据库访问的SQL语句,还 要特殊当
24、心其中大量重复的源代码是否有疏漏,并不能集中精力于业务逻辑开发上面。ORM则建立了 Java对象与数据库对象之间的影射关系,程序员不须要编写困难的 SQL语句,干脆操作Java对象即可,从而大大降低了代码量,也使程序员更加专注于业务 逻辑的实现。2、数据库对象连接问题-Spring Data -ActiveJDBC3、Hibernate中SessionFactory是线程平安的吗? Session是线程平安的吗(两个线程 能够共享同一个Session吗)?答:SessionFactory对应Hibernate的一个数据存储的概念,它是线程平安的,可以被多 个线程并发访问。SessionFact
25、ory一般只会在启动的时候构建。对于应用程序,最好将 SessionFactory通过单例模式进行封装以便于访问。Session是一个轻量级非线程平安的 对象(线程间不能共享session ),它表示与数据库进行交互的一个工作单元。Session是 由SessionFactory创建的,在任务完成之后它会被关闭。Session是许久层服务对外供应 的主要接口。Session会延迟获得数据库连接(也就是在须要的时候才会获得)。为了避开 创建太多的session,可以运用ThreadLocal将session和当前线程绑定在一起,这样可以 让同一个线程获得的总是同一个sessiono Hibern
26、ate 3中SessionFactory的 getCurrentSession()方法就可以做到。4、Hibernate中Session的load和get方法的区分是什么?答:主要有以下三项区分:假如没有找到符合条件的记录,get方法返回null , load方法抛出异样。get方法干脆返回实体类对象,load方法返回实体类对象的代理。在Hibernate 3之前,get方法只在一级缓存中进行数据查找,假如没有找到对应的数 据则越过二级缓存,干脆发出SQL语句完成数据读取;load方法则可以从二级缓存中获得 数据;从Hibernate 3起先,get方法不再是对二级缓存只写不读,它也是可以访问
27、二级缓 存的。关系数据对象之间,存在各种关系,包括1对1、1对多、多对1、多对多、级联等。 在数据库对象更新的时候,假如接受JDBC编程,程序员必需特殊当心处理这些关系,以保 证维持这些关系不会出现错误,而这个过程是一个很苦痛的过程。ORM建立Java对象与数据库对象关系影射的同时,也自动依据数据库对象之间的关 系创建Java对象的关系,并且供应了维持这些关系完整、有效的机制。3、系统架构问题现在的应用系统,一般由展示层、业务逻辑层、数据访问层、数据库层等组成,各层 次功能划分特殊清晰。JDBC属于数据访问层,但是运用JDBC编程时,程序员必需知道后 台是用什么数据库、有哪些表、各个表有有哪些
28、字段、各个字段的类型是什么、表与表之间 什么关系、创建了什么索引等等与后台数据库相关的详细信息。相当于软件程序员兼职数据 库 DBA。运用ORM技术,可以将数据库层完全隐藏,呈献给程序员的只有Java的对象,程序 员只须要依据业务逻辑的须要调用Java对象的Getter和Setter方法,即可实现对后台数 据库的操作,程序员不必知道后台接受什么数据库、有哪些表、有什么字段、表与表之间有 什么关系。于是,系统设计人员把ORM搭建好后,把Java对象交给程序员去实现业务逻辑,使 数据访问层与数据库层清晰分界。4、性能问题接受JDBC编程,在许多时候存在效率低下的问题,如:pstmt =conn.p
29、repareStatement(insert into userjnfo values。?)”);for (int i=0; i1000; i+) pstmt.setlnt(lj);pstmt.setString(27,User + i.toString();pstmt.executeUpdateQ;)以上程序将向后台数据库发送1000次SQL语句执行请求,运行效率较低。假如接受ORM技术,ORM框架将依据详细数据库操作须要,会自动延迟向后台数 据库发送SQL请求,如上面的程序,只会在循环完成后,一次向数据库发送操作请求,从 而大大降低通讯量,提高运行效率;ORM也可以依据实际状况,将数据库访
30、问操作合成, 尽量削减不必要的数据库操作请求。37、Spring框架的基本原理1、spring基本概念1 ) struts2是 web 框架,hibernate 是 orm 框架2 ) spring是容器框架,创建bean ,维护bean之间的关系3 ) spring可以管理web层,许久层,业务层,dao层,spring可以配置各个层的组件,并且维护各个层的关系2、spring核心原理1.IOC限制反转概念:限制权由对象本身转向容器,由容器依据配置文件创建对象实例并实现各个对象的依 罪天系。核心:bean工厂2.AOP面对切面编程a.静态代理依据每个详细类分别编写代理类依据一个接口编写一个代
31、理类b.动态代理针对一个方面编写一个InvocationHandler,然后借用JDK反射包中的Proxy类为各种接 口动态生成相应的代理类3、spring原理总结1 .运用spring ,没有new对象,我们把创建对象的任务交给spring框架2.spring事实上是一个容器框架,可以配置各种bean(action/service/domain/dao),并且可以维护bean与bean的关系,当我们须要运用某个bean的时候,我们可以getBean(id), 运用即可.38、SpringMVC框架的原理springMVC 是什么:springMVC 是一个 MVC 的开源框架,springM
32、VC=struts2+spring , springMVC 就相 当于是Struts2加上sring的整合,但是这里有一个怀疑就是,springMVC和spring是什 么样的关系呢?这个在百度百科上有一个很好的说明:意思是说,springMVC是spring 的一个后续产品,其实就是spring在原有基础上,又供应了 web应用的MVC模块,可以 简洁的把springMVC理解为是spring的一个模块(类似AOP , IOC这样的模块),网络 上经常会说springMVC和spring无缝集成其实springMVC就是spring的一个子模块, 所以根本不须要同spring进行整合。第一步
33、:用户发起请求到前端限制器(DispatcherServlet)其次步:前端限制器请求处理器映射器(HandlerM叩pering )去查找处理器(Handle ):通过xml配置或者注解进行查找第三步:找到以后处理器映射器(HandlerMappering )像前端限制器返回执行链(HandlerExecutionChain )第四步:前端限制器(DispatcherServlet)调用处理器适配器(HandlerAdapter)去执行处理器(Handler)第五步:处理器适配器去执行Handler第六步:Handler执行完给处理器适配器返回ModelAndView第七步:处理器适配器向前
34、端限制器返回ModelAndView第八步:前端限制器请求视图解析器(ViewResolver)去进行视图解析第九步:视图解析器像前端限制器返回View第十步:前端限制器对视图进行渲染第十一步:前端限制器向用户响应结果看到这些步骤我信任大家很感觉特殊的乱,这是正常的,但是这里主要是要大家理解springMVC中的几个组件:前端限制器(DispatcherServlet):接收请求,响应结果,相当于电脑的CPU。处理器映射器(HandlerMapping ):依据URL去查找处理器处理器(Handler):(须要程序员去写代码处理逻辑的)处理器适配器(HandlerAdapter):会把处理器包
35、装成适配器,这样就可以支持多种类型 的处理器,类比笔记本的适配器(适配器模式的应用)视图解析器(ViewResovler):进行视图解析,多返回的字符串,进行处理,可以解析成 对应的页面39、jsp 和 servlet 的区分一、基本概念1. ServletServlet是一种服务器端的Java应用程序,具有独立于平台和协议的特性,可以生 成动态的Web页面。它担当客户请求(Web阅读器或其他 客户程序)与服务器响应 (服务器上的数据库或应用程序)的中间层。Servlet是位于Web服务器内部的服务器端的Java应用程序,与传统的从叮嘱行启动的Java应用程序不同,Servlet由Web服 务
36、器进行加载,该Web服务器必需包含支持Servlet的Java虚拟机。1.2 JSPJSP技术运用Java编程语言编写类XML的tags和scriptlets ,来封装产生动态网页的处理逻辑。网页还能通过tags和scriptlets访问存在于服务端的资源的应用逻辑。JSP 将网页逻辑与网页设计的显示分别,支持可重用的基于组件的设计,使基于Web的应用程 序的开发变得快速和简洁。JSP(JavaServer Pages)是一种动态页面技术,它的主要目的是 将表示逻辑从Servlet中分别出来。JSP是一种脚本语言,包装了 Java Servlet系统的界面,简化了 Java和Servlet的运
37、 用难度,同时通过扩展JSP标签(TAG)供应了网页动态执行的实力。JSP供应了一套简洁的 标签,和HTML融合的比较好,可以使不了解Servlet的人可以做出动态网页来。对于Java 语言不熟悉的人,会觉得JSP开发比较便利。JSP修改后可以立刻看到结果,不须要手工编 译,JSP弓I擎会来做这些工作;而Servelt缺须要编译,重新启动Servlet引擎等一系列动 作。但是在JSP中,HTML与程序代码混杂在一起,而Servlet却不是这样。下面我们对 JSP的运行来做一个简洁的介绍,告知大家怎样来执行一个JSP文件:当Web服务器(或 Servlet引擎,应用服务器)支持JSP引擎时,JS
38、P弓摩会照着JSP的语法,将JSP文件转换 成Servlet代码源文件,接着Servlet会被编译成Java可执行字节码(bytecode),并以一 般的Servlet方式载入执行JSP语法简洁,可以便利的嵌入HTML之中,很简洁加入动态 的部分,便利的输出HTML0在Servlet中输出HTML缺须要调用特定的方法,对于引号 之类的字符也要做特殊的处理,加在困难的HTML页面中作为动态部分,比起JSP来说是 比较困难的。2、两者之间的联系和区分11 JSP第一次运行的时候会编译成Servlet,驻留在内存中以供调用。2 JSP是web开发技术,Servlet是服务器端运用的小程序,我们访问一
39、个JSP页面时, 服务器会将这个JSP页面转变成Servlet小程序运行得到结果后,反馈给用户端的阅读器。3 Servlet相当于一个限制层再去调用相应的JavaBean处理数据,最终把结果返回给 JSPO4 Servlet主要用于转向,将请求转向到相应的JSP页面。5 JSP更多的是进行页面显示,Servlet更多的是处理业务,即JSP是页面,Servlet是 实现JSP的方法。6 Servlet可以实现JSP的全部功能,但由于美工运用Servlet做界面特殊困难,后来开 发了 JSPO7 JSP 技术开发网站的两种模式:JSP + JavaBean ; JSP + Servlet + Ja
40、vaBean (一般 在多层应用中,JSP主要用作表现层,而Servlet则用作限制层,因为在JSP中放太多的代码不 利于维护,而把这留给Servlet来实现,而大量的重复代码写在JavaBean中)。【8】二者之间的差别就是,开发界面是JSP干脆可以编写。比如在JSP中写Table标记:数据 ;Servlet 须要加入:out.println( 擞据)。JSP文件在被应用服务器(例如:Tomcat、Resin、Weblogic和Websphere),调用过之后, 就被编译成为了 Servlet文件。也就是说在网页上显示的其实是Servlet文件。Tomcat T 面JSP文件编译之后生成的S
41、ervlet文件被放在了 work文件夹下,JSP中的HTML代码在 Servlet都被out出来,而JSP代码依据标签的不同会放在不同的位置。9 JSP中嵌入JAVA代码,而Servlet中嵌入HTML代码。10在一个标准的MVC架构中,Servlet作为Controller接受用户请求并转发给相应的Action处理,JSP作为View主要用来产生动态页面,EJB作为Model实现你的业务代码。说明:对于load。方法Hibernate认为该数据在数据库中确定存在可以放 心的运用代理来实现延迟加载,假如没有数据就抛出异样,而通过get()方 法获得的数据可以不存在。5、Session 的 s
42、ave。、update。、merge。、lock。、saveOrUpdate()fn persist。方 法分别是做什么的?有什么区分?答:Hibernate的对象有三种状态:瞬时态(transient)、许久态(persistent)和游离态 (detached ),如第135题中的图所示。瞬时态的实例可以通过调用save。、persist。或者saveOrUpdate。方法变成许久态;游离态的实例可以通过调用update。、saveOrUpdate()x lock。或者 replicate。变成许久态。save。和 persist。将会引发 SQL 的 INSERT语句,而update。或
43、merge。会引发UPDATE语句。save。和update。的区分在 于一个是将瞬时态对象变成许久态,一个是将游离态对象变为许久态。merge。方法可以完 成save。和update。方法的功能,它的意图是将新的状态合并到已有的许久化对象上或创 建新的许久化对象。对于persist。方法,依据官方文档的说明:persist。方法把一个瞬 时态的实例许久化,但是并不保证标识符被立刻填入到许久化实例中,标识符的填入可能被 推迟到flush的时间;persist。方法保证当它在一个事务外部被调用的时候并不触发一 个INSERT语句,当须要封装一个长会话流程的时候persist。方法是很有必要的sa
44、ve() 方法不保证第条,它要返回标识符,所以它会立刻执行INSERT语句,不管是在事务内部 还是外部。至于lock。方法和update。方法的区分,update。方法是把一个已经更改过的 脱管状态的对象变成许久状态;lock。方法是把一个没有更改过的脱管状态的对象变成许久 状态。6、阐述Session加载实体对象的过程。答:Session加载实体对象的步骤是:Session在调用数据库查询功能之前,首先会在一级缓存中通过实体类型和主键进行查找,假如一级缓存查找命中且数据状态合法,则干脆返回;假如一级缓存没有命中,接下来Session会在当前NonExists记录(相当于一个查询黑 名单,假如
45、出现重复的无效查询可以快速做出推断,从而提升性能)中进行查找,假如 NonExists中存在同样的查询条件,则返回null ;假如一级缓存查询失败则查询二级缓存,假如二级缓存命中则干脆返回;假如之前的查询都未命中,则发出SQL语句,假如查询未发觉对应记录则将此次查询添 加到Session的NonExists中加以记录,并返回null ;依据映射配置和SQL语句得到ResultSet,并创建对应的实体对象;将对象纳入Session ( 一级缓存)的管理;假如有对应的拦截器,则执行拦截器的onLoad方法;假如开启并设置了要运用二级缓存,则将数据对象纳入二级缓存;返回数据对象。7、Query接口的
46、list方法和iterate方法有什么区分?答:list。方法无法利用一级缓存和二级缓存(对缓存只写不读),它只能在开启查询缓存的 前提下运用查询缓存;iterate。方法可以充分利用缓存,假如目标数据只读或者读取频繁, 运用iterate。方法可以削减性能开销。list。方法不会引起N + 1查询问题,而iterate。方法可能引起N + 1查询问题说明:关于N + 1查询问题,可以参考CSDN上的一篇文章什么是N + 1查询8、Hibernate如何实现分页查询?答:通过Hibernate实现分页查询,开发人员只须要供应HQL语句(调用Session的 createQuery。方法)或查询
47、条件(调用Session的createCriteria。方法)、设置查询起始 行数(调用Query或Criteria接口的setFirstResult()方法)和最大查询行数(调用Query 或 Criteria 接口的 setMaxResults()方法),并调用 Query 或 Criteria 接口的 list。方法, Hibernate会自动生成分页查询的SQL语句。9、锁机制有什么用?简述Hibernate的悲观锁和乐观锁机制。答:有些业务逻辑在执行过程中要求对数据进行排他性的访问,于是须要通过一些机制保证 在此过程中数据被锁住不会被外界修改,这就是所谓的锁机制。Hibernate支持悲观锁和乐观锁两种锁机制。悲观锁,顾名思义悲观的认为在数据处理过程 中极有可能存在修改数据的并发事务(包括本系统的其他事务或来自外部系统的事务),于 是将处理的数据设置为锁定状态。悲观锁必需依靠数据库本身的锁机制才能真正保证数据访 问的排他性,关于数据库的锁机制和事务隔离级别在Java面试题大全(上)中已经探 讨过了。乐观锁,顾名思义,对并发事务持乐观看法(认为对数据的并发操作不会经常性的 发生),通过更加宽松的锁机制来解决由于悲观锁排他性的数据访问对系统性能造成的严峻 影响。最常见的乐观锁
限制150内