1、Java 工程师(程序员)面题Struts,Spring,Hibernate 三大框架1.Hibernate 工作原理及为什么要用?原理: 1.读取并解析配置文件 2.读取并解析映射信息,创建 SessionFactory 3.打开 Session 4.创建事务 Transation 5.持久化操作 6.提交事务 7.关闭 Session 8.关闭 SesstionFactory 为什么要用: 1. 对 JDBC 访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。 2. Hibernate 是一个基于 JDBC 的主流持久化框架,是一个优秀的 ORM 实现。他很大程度的简化 DA
2、O 层的编码工作 3. hibernate 使用 Java 反射机制,而不是字节码增强程序来实现透明性。 4. hibernate 的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。 2Hibernate 是如何延迟加载? 1. Hibernate2 延迟加载实现:a)实体对象 b)集合(Collection) 2. Hibernate3 提供了属性的延迟加载功能 当 Hibernate 在查询数据的时候,数据并没有存在与内存中,当程序真正对数据的操作时,对象才存在与内存中,就实现了延迟加载,他节省了服务器的内存开销,从而提高了服务器
3、的性能。 3Hibernate 中怎样实现类之间的关系?(如:一对多、多对多的关系) 类与类之间的关系主要体现在表与表之间的关系进行操作,它们都是对对象进行操作,我们程序中把所有的表与类都映射在一起,它们通过配置文件中的 many-to-one、one-to-many、many-to-many 4.Struts1 流程:1、客户端浏览器发出 HTTP 请求。2、根据 web.xml 配置,该请求被 ActionServlet 接收。3、根据 struts-config.xml 配置, ActionServlet 先将请求中的参数填充到 ActionForm 中,然后 ActionServlet
4、 再将请求发送到 Action 进行处理。4、是否验证,需要验证则调用ActionForm 的 validate 方法,验证失败则跳转到 input,成功则继续。5、Action 从ActionForm 获得数据,调用 javabean 中的业务方法处理数据。6、Action 返回ActionForward 对象,跳转到相应 JSP 页面或 Action。7、返回 HTTP 响应到客户端浏览器。MVC 设计模式:modal:“模型 ” 也称业务逻辑,是正真完成任务的代码,相当与JavaBeanview:视图,其实就是显示界面,相当于 JSPcontroller:控制器,他控制模型和视图的交互过
5、程,相当于 servletstruts1 是基于 MVC 设计模式 hibernate 是基于 ORM 对象关系映射 5.struts 是什么?struts1 是基于 JSP 和 servlet 的一个开源的 Web 应用框架,使用的是 MVC 的设计模式struts2 是基于 webwork 技术的框架,是 sun 和 webwork 公司联手开发的一个功能非常齐全的框架,struts2 和 struts1 没有任何关系,是一个全新的框架 6.spring 是什么?spring 是一个集成了许多第三方框架的大杂烩,其核心技术是 IOC(控制反转,也称依赖注入)和 AOP(面向切面编程) 7.
6、hibernate 是什么?hibernate 是基于 ORM 对象关系映射(完成对象数据到关系数据映射的机制)实现的,做数据持久化的工具 8.JSF 是什么?JavaServer Face 是基于组件的 web 开发框架,跟 sturts 差不多的框架 9.数据库里面的索引和约束是什么?索引是为了提高数据的检索速度,索引是建立在数据表上,根据一个或多个字段建立的约束是为了保持数据的完整性,约束有非空约束,主键约束,外键约束等等。10.spring 是什么这个问题,往往可以通过我们为什么要使用 spring 这个问题来切入:AOP 让开发人员可以创建非行为性的关注点,称为横切关注点,并将它们插
7、入到应用程序代码中。使用 AOP 后,公共服务 (比 如日志、持久性、事务等)就可以分解成方面并应用到域对象上,同时不会增加域对象的对象模型的复杂性。 IOC 允许创建一个可以构造对象的应用环境,然后向这些对象传递它们的协作对象。正如单词 倒置 所表明的,IOC 就像反 过来的 JNDI。没有使用一堆抽象工厂、服务定位器、单元素(singleton)和直接构造(straight construction) ,每一个对象都是用其协作对象构造的。因此是由容器管理协作对象(collaborator) 。 Spring 即使一个 AOP 框架,也是一 IOC 容器。 Spring 最好的地方是它有助于
8、您替换对象。有了 Spring,只要用 JavaBean 属性和配置文件加入依赖性(协作对象) 。然后可以很容易地在需要时替换具有类似接口的协作对象。 11.用自己的话简要阐述 struts2 的执行流程。Struts 2 框架本身大致可以分为 3 个部分:核心控制器 FilterDispatcher、业务控制器 Action和用户实现的企业业务逻辑组件。核心控制器 FilterDispatcher 是 Struts 2 框架的基础,包含了框架内部的控制流程和处理机制。业务控制器 Action 和业务逻辑组件是需要用户来自己实现的。用户在开发 Action 和业务逻辑组件的同时,还需要编写相关
9、的配置文件,供核心控制器 FilterDispatcher 来使用。 Struts 2 的工作流程相对于 Struts 1 要简单,与 WebWork 框架基本相同,所以说 Struts 2 是WebWork 的升级版本。基本简要流程如下:1、客户端浏览器发出 HTTP 请求。2、根据web.xml 配置,该请求被 FilterDispatcher 接收。3、根据 struts.xml 配置,找到需要调用的Action 类和方法, 并通过 IoC 方式,将值注入给 Aciton。4、Action 调用业务逻辑组件处理业务逻辑,这一步包含表单验证。5、Action 执行完毕,根据 struts.
10、xml 中的配置找到对应的返回结果 result,并跳转到相应页面。6、返回 HTTP 响应到客户端浏览器。1 Action 是不是线程安全的?如果不是 有什么方式可以保证 Action 的线程安全?如果是,说明原因 不是声明局部变量,或者扩展 RequestProcessor,让每次都创建一个 Action,或者在 spring 中用scope=“prototype“来管理2.MVC,分析一下 struts 是如何实现 MVC 的 m:JavaBean 或结合 EJB 组件或者 pojo 构成 c:Action 来实现 v:一组 JSP 文件及其标签构成。3.struts 中的几个关键对象的
11、作用 (说说几个关键对象的作用) Action:控制器类,ActionForm:表单对象,DynaValidatorForm:动态form,ActonMapping:配置文件中 action 节点的信息4.说说 AOP 和 IOC 的概念以及在 spring 中是如何应用的 AOP:面向方面编程,ioc:依赖注入;声明式事务和编程式事务积极一些通用部分5.Hibernate 有哪几种查询数据的方式 hql 查询,sql 查询,条件查询6.load()和 get()的区别 hibernate 对于 load 方法认为该数据在数据库中一定存在,可以放心的使用代理来延迟加载,load 默认支持延迟加
12、载,在用到对象中的其他属性数 据时才查询数据库,但是万一数据库中不存在该记录,只能抛异常 ObjectNotFoundEcception;所说的 load 方法抛异常是指在使用该对 象的数据时,数据库中不存在该数据时抛异常,而不是在创建这个对象时。由于session 中的缓存对于 hibernate 来说是个相当廉价的资源,所以在 load 时会先查一下session 缓存看看该 id 对应的对象是否存在,不存在则创建代理(load 时候之查询一级缓存,不存在则创建代理) 。get() 现在一级缓存找,没有就去二级缓存找,没有就去数据库找,没有就返回 null ;而对于 get 方法,hibe
13、rnate 一定要获取到真实的数据,否则返回 null。7.谈谈 hibernate 的延迟加载和 openSessionInView 延迟加载要在 session 范围内,用到的时候再加载;opensessioninview 是在 web 层写了一个filter 来打开和关闭 session,这样就表示在一次 request 过程中 session 一直开着,保证了延迟加载在 session 中的这个前提。8.spring 的事务有几种方式?谈谈 spring 事务的隔离级别和传播行为。 声明事务和编程事务 隔离级别: - DEFAULT 使用数据库默认的隔离级别 - READ_UNCOMM
14、ITTED 会出现脏读,不可重复读和幻影读问题 - READ_COMMITTED 会出现重复读和幻影读 - REPEATABLE_READ 会出现幻影读 - SERIALIZABLE 最安全,但是代价最大,性能影响极其严重 和传播行: - REQUIRED 存在事务就融入该事务,不存在就创建事务 - SUPPORTS 存在事务就融入事务,不存在则不创建事务 - MANDATORY 存在事务则融入该事务,不存在,抛异常 - REQUIRES_NEW 总是创建新事务 - NOT_SUPPORTED 存在事务则挂起,一直执行非事务操作 - NEVER 总是执行非事务,如果当前存在事务则抛异常 - N
15、ESTED 嵌入式事务9.Hibernate 中的 update()和 saveOrUpdate()的区别. 摘自 hibernate 说明文档: saveOrUpdate()做下面的事: 如果对象已经在本 session 中持久化了,不做任何事 如果另一个与本 session 关联的对象拥有相同的持久化标识(identifier),抛出一个异常 如果对象没有持久化标识(identifier)属性,对其调用 save() 如果对象的持久标识(identifier)表明其是一个新实例化的对象,对其调用 save() 如果对象是附带版本信息的(通过 或 ) 并且版本属性的值表明其是一个新实例化的对
16、象,save()它。 否则 update() 这个对象10.Spring 对多种 ORM 框架提供了很好的支持,简单描述在 Spring 中使用 Hibernate 的方法,并结合事务管理。 getHiberanteTemplate 里面提供了 save,update,delete,find 等方法。 简单说一个:如果配置了声明式事务,当执行 getHibernateTemplate 的各种方法的时候,事务会自动被加载 如果没有配置事务,那么以上操作不会真正的被同步到数据库,除非配置了 hibernate 的autocommit=true8.spring 的事务有几种方式?谈谈 spring
17、事务的隔离级别和传播行为。 spring 事务分两种形式,声明式事务和编程式事务,spring 提供了一个事务的接口PaltformTractionManager 接口,针对不同的事务,spring 进行了不同的实现,对 hibernate 事务的实现 HIbernateTractionManager,对 JDBC 的 JdbcTractionManager,DataSourceTractionManager 以及 JdoTractionManager。接口 platformTractionManager 提供了三个方法,获取事务,提交和回滚的方法。*分享面试题二】Spring,hiberna
18、te,struts 的面试笔试题(含答案) (声明:这里不是为其他商业利益,是为学习讨论使用)【郑重声明】:单纯接分将被删帖,希望大家有自己的感触 Hibernate 工作原理及为什么要用? 原理: 1.读取并解析配置文件 2.读取并解析映射信息,创建 SessionFactory 3.打开 Sesssion 4.创建事务 Transation 5.持久化操作 6.提交事务 7.关闭 Session 8.关闭 SesstionFactory为什么要用: 1. 对 JDBC 访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。2. Hibernate 是一个基于 JDBC 的主流持久
19、化框架,是一个优秀的 ORM 实现。他很大程度的简化 DAO 层的编码工作3. hibernate 使用 Java 反射机制,而不是字节码增强程序来实现透明性。4. hibernate 的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。2 Hibernate 是如何延迟加载 ? 1. Hibernate2 延迟加载实现:a)实体对象 b)集合(Collection)2. Hibernate3 提供了属性的延迟加载功能当 Hibernate 在查询数据的时候,数据并没有存在与内存中,当程序真正对数据的操作时,对象才存在与内存中,就实现了
20、延迟加载,他节省了服务器的内存开销,从而提高了服务器的性能。3Hibernate 中怎样实现类之间的关系?(如:一对多、多对多的关系)类与类之间的关系主要体现在表与表之间的关系进行操作,它们都市对对象进行操作,我们程序中把所有的表与类都映射在一起,它们通过配置文件中的 many-to-one、one-to-many、many-to-many、4 说下 Hibernate 的缓存机制1. 内部缓存存在 Hibernate 中又叫一级缓存,属于应用事物级缓存2. 二级缓存: a) 应用及缓存 b) 分布式缓存 条件:数据不会被第三方修改、数据大小在可接受范围、数据更新频率低、同一数据被系统频繁使用
21、、非 关键数据 c) 第三方缓存的实现5 Hibernate 的查询方式 Sql、Criteria,object comptosition Hql: 1、 属性查询 2、 参数查询、命名参数查询 3、 关联查询 4、 分页查询 5、 统计函数6 如何优化 Hibernate? 1.使用双向一对多关联,不使用单向一对多 2.灵活使用单向一对多关联 3.不用一对一,用多对一取代 4.配置对象缓存,不使用集合缓存 5.一对多集合使用 Bag,多对多集合使用 Set 6. 继承类使用显式多态 7. 表字段要少,表关联不要怕多,有二级缓存撑腰7 Struts 工作机制?为什么要使用 Struts? 工作
22、机制: Struts 的工作流程: 在 web 应用启动时就会加载初始化 ActionServlet,ActionServlet 从 struts-config.xml 文件中读取配置信息,把它们存放到各种配置对象 当 ActionServlet 接收到一个客户请求时,将执行如下流程. -(1)检索和用户请求匹配的 ActionMapping 实例,如果不存在 ,就返回请求路径无效信息; -(2)如果 ActionForm 实例不存在,就创建一个 ActionForm 对象,把客户提交的表单数据保存到 ActionForm 对象中; -(3)根据配置信息决定是否需要表单验证.如果需要验证,就调
23、用 ActionForm 的 validate()方法; -(4)如果 ActionForm 的 validate()方法返回 null 或返回一个不包含 ActionMessage 的ActuibErrors 对象, 就表示表单验证成功; -(5)ActionServlet 根据 ActionMapping 所包含的映射信息决定将请求转发给哪个 Action,如果相应 的 Action 实例不存在,就先创建这个实例,然后调用 Action的 execute()方法; -(6)Action 的 execute()方法返回一个 ActionForward 对象,ActionServlet 在把客
24、户请求转发给 ActionForward 对象指向的 JSP 组件; -(7)ActionForward 对象指向 JSP 组件生成动态网页,返回给客户 ;为什么要用: JSP、Servlet 、JavaBean 技术的出现给我们构建强大的企业应用系统提供了可能。但用这些技术构建的系统非常的繁乱,所以在此之上,我们需要一个规则、一个把这些技术组织起来的规则,这就是框架,Struts 便应运而生。基于 Struts 开发的应用由 3 类组件构成:控制器组件、模型组件、视图组件8 Struts 的 validate 框架是如何验证的? 在 struts 配置文件中配置具体的错误提示,再在 Form
25、Bean 中的 validate()方法具体调用。9 说下 Struts 的设计模式 MVC 模式: web 应用程序启动时就会加载并初始化 ActionServler。用户提交表单时,一个配置好的 ActionForm 对象被创建,并被填入表单相应的数 据,ActionServler 根据 Struts-config.xml 文件配置好的设置决定是否需要表单验证,如果需要就调用 ActionForm 的 Validate()验证后选择将请求发送到哪个 Action,如果 Action 不存在,ActionServlet 会先创建这个对象,然后调用 Action 的 execute()方法。E
26、xecute()从 ActionForm 对象中获取数据,完成业务逻辑,返回一个 ActionForward 对 象, ActionServlet 再把客户请求转发给 ActionForward 对象指定的 jsp 组件,ActionForward 对象指定的 jsp 生成动 态的网页,返回给客户。10 spring 工作机制及为什么要用? 1.spring mvc 请所有的请求都提交给 DispatcherServlet,它会委托应用系统的其他模块负责负责对请求进行真正的处理工作。 2.DispatcherServlet 查询一个或多个 HandlerMapping,找到处理请求的 Cont
27、roller. 3.DispatcherServlet 请请求提交到目标 Controller 4.Controller 进行业务逻辑处理后,会返回一个 ModelAndView 5.Dispathcher 查询一个或多个 ViewResolver 视图解析器,找到 ModelAndView 对象指定的视图对象 6.视图对象负责渲染返回给客户端。为什么用: AOP 让开发人员可以创建非行为性的关注点,称为横切关注点,并将它们插入到应用程序代码中。使用 AOP 后,公共服务 (比 如日志、持久性、事务等)就可以分解成方面并应用到域对象上,同时不会增加域对象的对象模型的复杂性。 IOC 允许创建一
28、个可以构造对象的应用环境,然后向这些对象传递它们的协作对象。正如单词 倒置 所表明的,IOC 就像反 过来的 JNDI。没有使用一堆抽象工厂、服务定位器、单元素(singleton)和直接构造(straight construction) ,每一个对象都是用其协作对象构造的。因此是由容器管理协作对象(collaborator) 。 Spring 即使一个 AOP 框架,也是一 IOC 容器。 Spring 最好的地方是它有助于您替换对象。有了 Spring,只要用 JavaBean 属性和配置文件加入依赖性(协作对象) 。然后可以很容易地在需要时替换具有类似接口的协作对象。Struts,Spr
29、ing,Hibernate 优缺点 Struts 跟 Tomcat、Turbine 等诸 多 Apache 项目一样,是开源软件,这是它的一大优点。使开发者能更深入的了解其内部实现机制。 Struts 开放源码框架的创建是为了使开发者在构建基于 Java Servlet 和 JavaServer Pages(JSP)技术的 Web 应用时更加容易。Struts 框架为开放者提供了一个统一的标准框架,通过使用 Struts 作为基础,开发者能够更专注 于应用程序的商业逻辑。Struts 框架本身是使用 Java Servlet 和 JavaServer Pages 技术的一种Model-View
30、-Controller(MVC)实现.具体来讲,Struts 的优点有:1. 实现 MVC 模式,结构清晰,使开发者只关注业务逻辑的实现.2. 有丰富的 tag 可以用 ,Struts 的标记库(Taglib),如能灵活动用,则能大大提高开发效率。另外,就目前国内的 JSP 开发者而言,除了使用 JSP 自带的常用标记外,很少开发自己的标记,或许 Struts 是一个很好的起点。3. 页面导航.页面导航将是今后的一个发展方向,事实上,这样做,使系统的脉络更加清晰。通过一个配置文件,即可把握整个系统各部分之间的联系,这对于后期的维护有着莫大的好处。尤其是当另一批开发者接手这个项目时,这种优势体现
31、得更加明显。4. 提供 Exception 处理机制 .5. 数据库链接池管理6. 支持 I18N缺点:一、转到展示层时,需要配置 forward,每一次转到展示层,相信大多数都是直接转到jsp,而涉及到转向, 需要配置 forward,如果有十个展示层的 jsp,需要配置十次 struts,而且还不包括有时候目录、文件变更,需要重新修改 forward,注意, 每次修改配置之后,要求重新部署整个项目,而 tomcate 这样的服务器,还必须重新启动服务器,如果业务变更复杂频繁的系统,这样的操作简单不可想象。 现在就是这样,几十上百个人同时在线使用我们的系统,大家可以想象一下,我的烦恼有多大。
32、二、 Struts 的 Action 必需是 threadsafe 方式,它仅仅允许一个实例去处理所有的请求。所以 action 用到的所有的资源都必需统一同步,这个就引起了线程安全的问题。三、 测试不方便. Struts 的每个 Action 都同 Web 层耦合在一起,这样它的测试依赖于 Web容器,单元测试也很难实现。不过有一个 Junit 的扩展工具 Struts TestCase 可以实现它的单元测试。四、 类型的转换. Struts 的 FormBean 把所有的数据都作为 String 类型,它可以使用工具Commons-Beanutils 进行类型转化。但它的转化都是在 Cla
33、ss 级别,而且转化的类型是不可配置的。类型转化时的错误信息返回给用户也是非常困难的。五、 对 Servlet 的依赖性过强. Struts 处理 Action 时必需要依赖 ServletRequest 和ServletResponse,所有它摆脱不了 Servlet 容器。六、前端表达式语言方面.Struts 集成了 JSTL,所以它主要使用 JSTL 的表达式语言来获取数据。可是 JSTL 的表达式语言在 Collection 和索引属性方面处理显得很弱。七、 对 Action 执行的控制困难. Struts 创建一个 Action,如果想控制它的执行顺序将会非常困难。甚至你要重新去写
34、Servlet 来实现你的这个功能需求。八、 对 Action 执行前和后的处理. Struts 处理 Action 的时候是基于 class 的 hierarchies,很难在 action 处理前和后进行操作。九、 对事件支持不够. 在 struts 中,实际是一个表单 Form 对应一个 Action 类(或DispatchAction),换一句话说:在 Struts 中实际是一个表单只能 对应一个事件,struts 这种事件方式称为 application event,application event 和 component event 相比是一种粗粒度的事件。Struts 重要的表
35、单对象 ActionForm 是一种对象,它代表了一种应用,这个对象中至少包含几个字段, 这些字段是 Jsp 页面表单中的 input 字段,因为一个表单对应一个事件,所以,当我们需要将事件粒度细化到表单中这些字段时,也就是说,一个字段对应一 个事件时,单纯使用 Struts 就不太可能,当然通过结合 JavaScript 也是可以转弯实现的。2HibernateHibernate 是一个开放源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象封装,使得 Java 程序员可以随心所欲的使用对象编程思维来操纵数据库。Hibernate 可以应用在任何使用 JDBC 的场合,既可以在
36、Java 的客户端程序实用,也可以在Servlet/JSP 的 Web 应用中使用,最具革命意义的是,Hibernate 可以在应用 EJB 的 J2EE 架构中取代 CMP,完成数据持久化的重任。大多数开发机构经常采取创建各自独立的数据持久层。一旦底层的数据结构发生改变,那么修改应用的其余部分使之适应这种改变的代价将是十分巨大的。 Hibernate 适时的填补了这一空白,它为 Java 应用提供了一个易用的、高效率的对象关系映射框架。 hibernate 是个轻量级的持久性框架,功 能却非常丰富。优点:a.Hibernate 使用 Java 反射机制而不是字节码增强程序来实现透明性。b.H
37、ibernate 的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。c.它支持各种关系数据库,从一对一到多对多的各种复杂关系。缺点:它限制您所使用的对象模型。(例如,一个持久性类不能映射到多个表) 其独有的界面和可怜的市场份额也让人不安,尽管如此,Hibernate 还是以其强大的发展动力减轻了这些风险。其他的开源持久性框架也有一些,不过都没有 Hibernate 这样有市场冲击力。上面回贴情绪有点激动,希望谅解,我不是因为有人批评 Hibernate 而感到不快,而是因为帖子里面的观点实在让我觉得荒谬。不管觉得 Hibernate 好也吧,不好也吧,我唯一觉得遗憾的是,在中文论坛里面找
38、不到一个对 Hibernate 的真正高水平的评价。在 TSS 上有一个关于 Hibernate 的 hot thread,跟了几百贴,其中包括 Hibernate 作者 Gavin 和 LiDO JDO的 CTO,对于 JDO 和 Hibernate 有过一些激烈的争论,我曾经耐心的看了一遍,仍然没有发现针对 Hibernate 真正有力的攻击,那些所 谓的攻击无非针对 Hibernate 没有一个 GUI的配置工具,没有商业公司支持,没有标准化等等这些站不住脚的理由。补充几点我的意见:一、Hibernate 是 JDBC 的轻量级的对象封装,它是一个独立的对象持久层框架,和 App Ser
39、ver,和 EJB 没有什么必然的联系。Hibernate 可以用在任何 JDBC 可以使用的场合,例如 Java 应用程序的数据库访问代码,DAO 接口 的实现类,甚至可以是 BMP 里面的访问数据库的代码。从这个意义上来说,Hibernate 和 EB 不是一个范畴的东西,也不存在非此即彼的关系。二、Hibernate 是一个和 JDBC 密切关联的框架,所以 Hibernate 的兼容性和 JDBC 驱动,和数据库都有一定的关系,但是和使用它的 Java 程序,和 App Server 没有任何关系,也不存在兼容性问题。三、Hibernate 不能用来直接和 Entity Bean 做对
40、比,只有放在整个 J2EE 项目的框架中才能比较。并且即使是放在软件整体框架中来看,Hibernate 也是做为 JDBC 的替代者出现的,而 不是 Entity Bean 的替代者出现的,让我再列一次我已经列 n 次的框架结构:传统的架构:1) Session Bean Entity Bean DB为了解决性能障碍的替代架构:2) Session Bean DAO JDBC DB使用 Hibernate 来提高上面架构的开发效率的架构:3) Session Bean DAO Hibernate DB就上面 3 个架构来分析:1、内存消耗:采用 JDBC 的架构 2 无疑是最省内存的,Hibe
41、rnate 的架构 3 次之,EB 的架构 1 最差。2、运行效率:如果 JDBC 的代码写的非常优化,那么 JDBC 架构运行效率最高,但是实际项目中,这一点几乎做不到,这需要程序员非常精通 JDBC,运用 Batch 语句,调整PreapredStatement 的 Batch Size 和 Fetch Size 等参数,以及在必要的情况下采用结果集cache 等等。而一般情况下程序员是做不到这一点的。因此 Hibernate 架构表现出最快的运行效率。 EB 的架构效率会差的很远。3、开发效率:在有 JBuilder 的支持下以及简单的项目,EB 架构开发效率最高,JDBC 次之,Hib
42、ernate 最差。但是在大的项目,特别是持久层关系映射很复杂的情况下,Hibernate效率高的惊人,JDBC 次之,而 EB 架构很可能会失败。4、分布式,安全检查,集群,负载均衡的支持由于有 SB 做为 Facade,3 个架构没有区别。四、EB 和 Hibernate 学习难度在哪里?EB 的难度在哪里?不在复杂的 XML 配置文件上,而在于 EB 运用稍微不慎,就有严重的性能障碍。所以难在你需要学习很多 EJB 设计模式来避开性能问题,需 要学习 App Server和 EB 的配置来优化 EB 的运行效率。做 EB 的开发工作,程序员的大部分精力都被放到了EB 的性能问题上了,反而
43、没有更多的精力关注本身就主要 投入精力去考虑的对象持久层的设计上来。Hibernate 难在哪里?不在 Hibernate 本身的复杂,实际上 Hibernate 非常的简单,难在Hibernate 太灵活了。当你用 EB 来实现持久层的时候,你会发现 EB 实在是太笨拙了,笨拙到你根本没有什么可以选择的余地,所以你根本就不用花费精力去设计方案,去平衡方案的好坏,去费脑筋考虑选择哪个方案,因为只有唯一的方案摆在你面前,你只能这么做,没得选择。Hibernate 相反,它太灵活了,相同的问题,你至少可以设计出十几种方案来解决,所以特别的犯难,究竟用这个,还是用那个呢?这些方案之间到底有什 么区别
44、呢?他们的运行原理有什么不同?运行效率哪个比较好?光是主键生成,就有七八种方案供你选择,你为难不为难?集合属性可以用 Set,可以用 List,还可以用 Bag,到底哪个效率高,你为难不为难?查询可以用 iterator,可以用 list,哪个好,有什么区别?你为难不为难?复合主键你 可以直接在 hbm 里面配置,也可以自定义 CustomerType,哪种比较好些?你为难不为难?对于一个表,你可以选择单一映射一个对象,也可以映射成 父子对象,还可以映射成两个1:1 的对象,在什么情况下用哪种方案比较好,你为难不为难?这个列表可以一直开列下去,直到你不想再看下去为止。当你面前摆着无数的眼花缭乱
45、的方案的时候,你会觉得幸福呢?还是悲哀呢?如果你是一个负责的程序员, 那么你一定会仔细研究每种方案的区别,每种方案的效率,每种方案的适用场合,你会觉得你已经陷入进去拔不出来了。如果是用 EB,你第一秒种就已经做出了决 定,根本没得选择,比如说集合属性,你只能用 Collection,如果是 Hibernate,你会在 Bag,List 和 Set 之间来回犹豫不决,甚至搞 不清楚的话,程序都没有办法写。3 Spring它是一个开源的项目,而且目前非常活跃;它基于 IoC(Inversion of Control,反向控制)和 AOP 的构架多层 j2ee 系统的框架,但它不强迫你必须在每一层中
46、必须使用 Spring,因为它模块化的很好,允许你根据自 己的需要选择使用它的某一个模块;它实现了很优雅的MVC,对不同的数据访问技术提供了统一的接口,采用 IoC 使得可以很容易的实现 bean的装配,提供 了简洁的 AOP 并据此实现 Transcation Managment,等等优点:a. Spring 能有效地组织你的中间层对象,不管你是否选择使用了 EJB。如果你仅仅使用了Struts 或其他为 J2EE 的 API 特制的 framework,Spring 致力于解决剩下的问题。b. Spring 能消除在许多工程中常见的对 Singleton 的过多使用。根据我的经验,这是一个
47、很大的问题,它降低了系统的可测试性和面向对象的程度。c. 通过一种在不同应用程序和项目间一致的方法来处理配置文件,Spring 能消除各种各样自定义格式的属性文件的需要。曾经对某个类要寻找的是哪个魔法般的 属性项或系统属性感到不解,为此不得不去读 Javadoc 甚至源编码?有了 Spring,你仅仅需要看看类的JavaBean 属性。Inversion of Control 的使用(在下面讨论)帮助完成了这种简化。d.通过把对接口编程而不是对类编程的代价几乎减少到没有,Spring 能够促进养成好的编程习惯。e. Spring 被设计为让使用它创建的应用尽可能少的依赖于他的 APIs。在 S
48、pring 应用中的大多数业务对象没有依赖于 Spring。f. 使用 Spring 构建的应用程序易于单元测试。g.Spring 能使 EJB 的使用成为一个实现选择,而不是应用架构的必然选择。你能选择用POJOs 或 local EJBs 来实现业务接口,却不会影响调用代码。h. Spring 帮助你解决许多问题而无需使用 EJB。Spring 能提供一种 EJB 的替换物,它们适用于许多 web 应用。例如,Spring 能使用 AOP 提供声明性事务管理而不通过 EJB 容器,如果你仅仅需要与单个数据库打交道,甚至不需要一个 JTA 实现。i. Spring 为数据存取提供了一个一致的
49、框架 ,不论是使用的是 JDBC 还是 O/R mapping 产品(如 Hibernate) 。Spring 确实使你能通过最简单可行的解决办法来解决你的问题。而这是有有很大价值的。缺点:使用人数不多、jsp 中要写很多代码、控制器过于灵活,缺少一个公用控制器。6. Java web 部分1、Tomcat 的优化经验答:去掉对 web.xml 的监视,把 jsp 提前编辑成 Servlet。有富余物理内存的情况,加大 tomcat 使用的 jvm 的内存1、HTTP 请求的 GET 与 POST 方式的区别(1)get 是从服务器上获取数据,post 是向服务器传送数据。 在客户端,Get 方式在通过 URL 提交数据,数据在 URL 中可以看到;POST 方式,数据放置在 HTML HEADER 内提交。 (2) 对于 get 方式,服务器端用 Request.QueryString 获取变量的值,对于 post 方式,服务器端用 Request.Form 获取提交的数据。 (3) GET 方式提交的数据最多只能有 1024 字节,而 POST 则没有此限制