java面试题合集(9)

139 阅读6分钟

学习java.java实战项目

1.1 Struts1和Struts2区别

依赖关系:

Struts2以WebWork(也就是MVC框架)为核心。采用拦截器的机制来处理用户请求,struts1严重依赖于servletAPI,属于侵入性框架,struts2不严重依赖于servletAPI,属于非侵入性框架。

线程模型方面:

struts1的Action是单实例的,一个Action的实例处理所有的请求。

struts2的Action是一个请求对应一个实例(每次请求都新new出一个对象),没有线程安全方面的问题。

封装请求参数:

struts1中强制使用ActionForm对象封装请求的参数。

Struts2可以选择使用POJO类(也就是javaBean)来封装请求的参数,或者直接使用Action的属性。

核心控制器:

struts1的前端总控制器(核心总控制器)为ActionServlet,是一个Servlet类。

struts2的前端总控制器(核心总控制器)为FileterDispatcher,是一个过滤器。

说明:

struts2.1.3以前,核心总控制器:

org.apache.struts2.dispatcher.FilterDispatcher

struts2.1.3以后,核心总控制器:

org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter

1.2 SpringMVC、Struts1和Struts2区别

1、 springMVC单例非线程安全,struts1单例非线程安全,struts2线程安全对每个请求都产生一个实例。

2、 springMVC和String1的入口都是servlet,而struts2是Filter。springMVC 的前端总控制器为 DispatcherServlet,struts1 的前端总控制器为 ActionServlet,struts2 的前端总控制器为 FilterDispatcher。

3、 参数传递:struts是在接受参数的时候,可以用属性来接受参数,这就说明参数是让多个方法共享的。springMVC用方法来接受参数。

4、 springMVC是基于方法的设计,而sturts是基于类。

1.3 Struts2在的type类型

1、 dispatcher:它是默认的,用来转向页面,通常处理JSP。

2、 redirect:将用户重定向到一个已配置好的URL。

3、 redirectAction:将用户重定向到一个已定义好的action。

4、 chain:将action和另外一个action链接起来。

5、 freemarker:呈现Freemarker模板。

6、 httpheader:返回一个已配置好的HTTP头信息响应。

7、 stream:向浏览器发送InputSream对象对下载的内容和图片非常有用。

8、 velocity:呈现Velocity模板。

9、 xslt :该XML可以通过XSL模板进行转换。

10、 plaintext:显示原始文件内容,例如文件源代码。

1.4 Struts2的常用标签

首先需要引用<%@taglib prefix="s" uri="/struts-tags"%>

1、 <s:if></s:if>判断标签后面可跟<s:else>

2、 <s:iterator></s:iterator>迭代标签

3、 <s:include></s:include>引入标签可以把一个JSP页面或者servlet引入一个页面中

4、 <s:property></s:property>输出标签

5、 <s:set></s:set>标签赋予变量一个特定范围内的值

6、 <s:form></s:form>表单标签

7、 <s:testarea></s:textarea>文本域标签

8、 <s:select></s:select>下拉标签

9、 <s:url></s:url>声明一个url的路径

最常用的是:

判断<s:if></s:if>

循环<s:iterator></s:terator>

输出<s:property></s:property>

1.5 Hibernate可get和load的区别

加载方式:

load为延迟加载(返回的是一个只有id属性的代理,只有使用该对象属性时,才 发出sql语句)。

get为立即加载(执行时,会立即向数据库发出sql语句)。

返回结果:

load检索不到记录时,会抛ObjectNotFoundException异常。

get检索不到记录时,会返回null。

1.6 Hibernate、Ibatis、JDBC区别

Hibernate属于全自动, Ibatis属于半自动,Jdbc属于手动,从开发效率上讲hibernate较高,ibatis居中,jdbc较低,从执行效率上讲hibernate较低,ibatis居中,jdbc较高,因为jdbc是手工写sql语句,程序员对sql的控制能力更大,可以根据业务需要进行优化,而ibatis虽然也可以对sql进行优化,但是他里面将resultset封装为实体的过程中采用了反射机制所以一定程度上影响了性能,而hibernate因为高度封装所以开发效率相对较高,但正因为这个原因,所以程序员在对sql语句的控制和优化方面相对比较弱,而且在将resultset封装成实体的过程中也采用了反射机制,所以在性能方面较低。

1.7 Hibernate与JDBC区别

1、 hibernate和jdbc主要区别就是,hibernate先检索缓存中的映射对象( 即hibernate操作的是对象),而jdbc则是直接操作数据库。

2、 Hibernate是JDBC的轻量级的对象封装,它是一个独立的对象持久层框架。Hibernate可以用在任何JDBC可以使用的场合。

3、 Hibernate是一个和JDBC密切关联的框架,所以Hibernate的兼容性和JDBC驱动,和数据库都有一定的关系,但是和使用它的Java程序,和App Server没有任何关系,也不存在兼容性问题。

4、 如果正确的使用JDBC技术,它的执行效率一定比hibernate要好,因为hibernate是基于jdbc的技术。

5、 JDBC使用的是SQL语句,Hibernate使用的是HQL语句,但是HQL语句最终还会隐式转换成SQL语句执行。

1.8 Hibernate两大配置文件

*.hbm.xml:主键生成策略,映射关系,一对多,一对一的关系。

Hibernate.cfg.xml:方言(用哪个数据库),数据库连接信息,包含*.hbm.xml内容,映射文件,也可以配事务。

1.9 Hibernate中的事务处理

开启事务 session.beginTransaction();

执行相关的操作,如果成功则session.getTransaction().commit();

执行操作失败则 session.getTransaction.rollback();

1.10 Hibernate三种状态及如何转换

Transient(瞬时)

new 一个初始化对象后,并没有在数据库里保存数据,处于瞬时状态;

Persistent(持久化)

当执行save()方法,调用session.close()方法之前,内存中的对象与数据库有对应关系处于持久化状态;

Detached(托管/游离)

   当执行session.close()之后,处于托管状态;

状态的转换

处于托管状态下,调用update()方法后,转换为持久化状态;

在持久化状态下,执行delete()方法后,转换为临时状态;

在未初始化对象之前,调用get(),load(),find(),iterate()之后,直接进入持久化状态。

1.11 Hibernate中的五大核心接口

1、 Configuration接口的作用是对Hibernate进行配置,以及对它进行启动。(加载hibernate.cfg.xml)并创建一个SessionFactory对象。

2、 SessionFactory接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。SessionFactory是线程安全的。

3、 Session(会话)接口是Hibernate应用使用的主要接口。Session接口负责执行被持久化对象的CRUD操作(增删改查)。Session对象是非线程安全的。Session 相当于jdbc的connection

4、 Query和Criteria接口负责执行各种数据库查询。

5、 Transaction接口负责操作相关的事务。

1.12 Hibernate缓存概述

hibernate分为一级缓存即session缓存也叫事务级别的缓存以及二级缓存sessionFactory即应用级别的缓存,还有查询缓存即三级缓存。

一级缓存的生命周期和session的生命周期保持一致,hibernate默认就启用了一级缓存,不能将其关闭,可以通过session.clear()和session.evict(object)来管理一级缓存。其中get,load,iterate都会使用一级缓存,一级缓存缓存的是对象。

二级缓存的生命周期和sessionFactory的生命周期保持一致,可以跨session,被多个session共享,hibernate3默认开启二级缓存,也可以手动开启并指定缓存插件如ehcache,oscache等。二级缓存也只能缓存对象。

三级缓存也叫查询缓存,查询缓存是针对普通属性结果集的缓存,对实体对象的结果集只缓存id。对query.list()起作用,query.iterate不起作用,也就是query.iterate不使用查询缓存。