java开发岗高频面试题全解析,java高级面试题及答案
如何解决写爬虫IP受阻的问题?立即使用。
首先,谈谈你对Struts的理解
(更多相关面试问题推荐:java面试问答)
1.struts是按照MVC模式设计的Web层框架。其实就是一个Servlet,叫做ActionServlet或者是ActionServlet的子类。我们可以在web.xml文件中将所有符合特定特征的请求交给这个Servlet,这个Servlet将引用一个配置文件,将每个请求分配给不同的动作进行处理。
(struts可以有多个配置文件,每个配置文件可以按模块进行配置,以防止配置文件过度膨胀)
2.在actionServlet将请求交给Action进行处理之前,它会将请求参数封装到一个formbean对象中(即一个java类,其中每个属性对应一个请求参数)。
3.需要注意的是,在actionServlet将formbean对象传递给action的execute方法之前,可能会调用formbean的validate方法进行验证。只有在验证通过后,这个formbean对象才会被传递给Action的execute方法。否则,它将返回由输入属性指定的错误页。
4.执行操作后,应该会返回显示的结果视图。这个结果视图由actionForward对象表示。ActionForward对象通过struts-config.xml配置文件中的配置关联到一个jsp页面,因为程序使用了struts-config.xml配置文件中为jsp页面设置的逻辑名称,可以实现动作程序代码和返回的jsp页面名称的解耦。
(以上,你也可以根据自己的经历谈谈自己的看法)
第二,谈谈你对Hibernate的理解。
1.面向对象设计软件的内部运行过程可以理解为不断创建各种新对象的过程,建立对象之间的关系,调用对象方法改变各个对象的状态,对象消亡的过程。无论程序如何运行和操作,本质上都是为了得到一个结果。程序在某一时刻和下一时刻运行结果的差异,说明对象在内存中的状态发生了变化。
2.为了在关机和内存空间不足的情况下保持程序的运行状态,需要将内存中对象的状态保存到持久化设备和从持久化设备中恢复,通常保存到关系数据库中保存大量的对象信息。就java程序的运行功能而言,保存对象状态的功能与系统的其他功能相比,应该是一个非常不起眼的附属功能。Java是用jdbc来实现这个功能的,但是这个不起眼的功能却要写大量的代码,它所做的只是保存和恢复对象,而那些大量的jdbc代码并没有什么技术含量。基本上都是用一套常规的标准代码模板写出来的,这是个苦差事,重复性的工作。
3.保存java程序通过数据库运行时产生的对象和恢复对象,实际上实现了java对象和关系数据库记录之间的映射关系,称为ORM(Object relationship mapping)。人们可以通过封装JDBC代码来实现这一功能,封装后的产品被称为ORM框架,Hibernate就是流行的ORM框架之一。使用Hibernate框架,无需编写JDBC代码,只需调用save方法就可以将对象保存到关系数据库中,只需调用get方法就可以从数据库中加载对象。
4.使用Hibernate的基本流程是:配置配置对象、生成SessionFactory、创建会话对象、启动事务、完成CRUD操作、提交事务、关闭会话。
5.使用Hibernate时,首先要配置hibernate.cfg.xml文件,包括数据库连接信息和方言,还要为每个实体配置相应的hbm.xml文件。每个hbm.xml文件都需要在hibernate.cfg.xml文件中注册。
6.在应用Hibernate时,了解会话的缓存原理、级联、延迟加载和hql查询是很重要的。
(以上,也可以结合自己繁琐的使用JDBC来谈谈hibernate的感受)
三。谈谈你对春天的理解。
1.Spring是实现工厂模式的工厂类(这里有必要解释清楚工厂模式是什么)。这个类名是BeanFactory(实际上是一个接口),它通常是程序中BeanFactory ApplicationContext的子类。春天相当于一个大厂班。在其配置文件中,用于创建实例对象的类名和实例对象的属性由bean元素配置。
2.Spring为IOC提供了很好的支持,IOC是一种编程思想和架构艺术,利用这种思想可以很好的实现模块间的解耦。IOC也叫DI(Depency Injection)。
3.Spring很好地封装了AOP技术。AOP叫面向方面编程,就是系统中有很多不相关的方法。在这众多的方法中,需要添加某些系统功能的代码,比如添加日志、权限判断、异常处理等。这种应用程序称为AOP。
采用代理技术实现AOP功能。客户端程序不再调用目标,而是调用代理类。代理类和目标类在外部具有相同的方法声明。实现同一个方法声明有两种方式,一种是实现同一个接口,一种是做目标的子类。
在JDK中,代理类用于生成动态代理,以生成接口的实现类。如果要为一个类生成子类,可以使用CGLI B .将系统函数和相应的调用目标类的方法添加到生成的代理类的方法中。系统函数的代理由Advice对象提供。显然,要创建代理对象,至少需要目标类和通知类。Spring提供了这种支持,只需要在spring配置文件中配置这两个元素就可以实现代理和aop功能。
(以上,你也可以根据自己的经历谈谈自己的看法)
第四,谈谈Struts的优缺点
优势:
1.实现结构清晰的MVC模式,让开发者只关注业务逻辑的实现。
2.可用的标签非常丰富,Struts的标签库(Taglib)如果能灵活使用,可以大大提高开发效率。
3.页面导航使系统的上下文更加清晰。通过一个配置文件,可以把握整个系统各部分之间的关系,对后期的维护大有裨益。尤其是当另一批开发者接手这个项目时,这种优势更加明显。
4.提供异常处理机制。
5.数据库连接池管理
6.支持I18N
缺点:
1.当您转到表示层时,您需要配置forward。如果表示层有十个JSP,你需要配置十次struts,而且有时候还不包括目录和文件的更改,所以需要再修改forward。注意,每次修改配置后,都需要重新部署整个项目,像tomcate这样的服务器必须重启服务器。
2.Struts的动作必须是线程安全的,只允许一个实例处理所有请求。所以action使用的所有资源都必须统一同步,这就导致了线程安全的问题。
3.不方便测试。Struts的每一个动作都与Web层耦合,所以它的测试依赖于Web容器,单元测试很难实现。但是Junit有一个扩展工具,Struts TestCase,可以实现它的单元测试。
4.类型转换。Struts的FormBean将所有数据作为字符串类型,它可以使用工具Commons-Beanutils进行类型转换。但是它的转换是在类的层次上,并且转换的类型是不可配置的。向用户返回类型转换的错误信息也是非常困难的。
5.对Servlet的依赖性太强。Struts在处理动作时必须依赖ServletRequest和ServletResponse,所以无法摆脱Servlet容器。
6.前端表达式语言。Struts集成了JSTL,所以主要使用JSTL表达式语言来获取数据。然而,JSTL的表达式语言在处理集合和索引属性方面很弱。
7.很难控制动作的执行。Struts创建一个动作,控制它的执行顺序会非常困难。您甚至必须重写Servlet来实现您的功能需求。
8.行动前后的处理。Struts基于类层次结构来处理动作,所以在动作前后很难操作。
9.对事件的支持不足。实际上,在struts中,一个表单对应一个Action类(或DispatchAction)。换句话说,在struts中,实际上,一个表单只能对应一个事件。Struts的这种事件模式被称为应用事件,与组件事件相比是一种粗粒度的事件。
(视频教程推荐:java课程)
5.iBatis和Hibernate有什么区别?
相同点:屏蔽掉jdbc api的底层访问细节,利用它,我们可以访问数据,而不需要处理jdbc api。
jdbc api编程流程是固定的,sql语句和java代码混杂在一起,往往需要拼凑sql语句,细节繁琐。
IBA的好处:屏蔽了jdbc api的底层访问细节;将sql语句与java代码分开;提供了将结果集自动封装到名为实体对象和对象的集合中的功能。queryForList返回对象集,queryForObject返回单个对象。提供用于将实体对象的属性自动传递给sql语句的参数。
Hibernate是一个全自动的orm映射工具,可以自动生成sql语句。ibatis要求我们在xml配置文件中编写sql语句。Hibernate比ibatis负责任和强大得多。因为hibernate自动生成sql语句,所以我们无法控制语句,也无法写出具体高效的sql。对于一些不太复杂的sql查询,hibernate可以帮助我们完成它们。然而,对于特别复杂的查询,hibernate很难适应。这个时候使用ibatis是个不错的选择,因为ibatis还是自己写sql语句。
不及物动词hibernate中的多表查询。每个表取几个字段,也就是说查询结果集没有对应的实体类。如何解决这个问题?
方案一:根据Object[]数据取出数据,然后自己分组bean。
解决方案2:为每个表的bean编写一个构造函数。比如表1需要找出两个field1,field2和field2,那么一个构造函数就是Bean(type1filed1,type2 field2),然后直接在hql中生成Bean就可以了。
七。介绍Hibernate的L2缓存。
按照以下思路回答:
(1)首先明确什么是缓存。
(2)再说了,和hibernate的会话是一级缓存,就是有了一级缓存,为什么还要二级缓存?
(3)最后,如何配置Hibernate的L2缓存。
1.缓存是将数据库中以前查询和使用过的对象存储在内存中(一种数据结构)。这种数据结构通常或类似于HashMap。当你想在将来使用一个对象时,首先查询缓存中是否有这个对象。如果有,使用缓存中的对象。如果没有,查询数据库并将查询到的对象保存在缓存中以备下次使用。
2.Hibernate的session是缓存的一种,通常称为Hibernate的一级缓存。当您想使用Session从数据库中查询一个对象时,Session首先检查该对象是否存在于它自己的内部,然后直接返回它。如果它不存在,您可以访问数据库并将查询结果保存在您自己的内部。
由于会话代表一个会话进程,并且会话与一个数据库连接相关联,因此最好不要让会话长时间处于打开状态。通常,它只在事务中使用,应该在事务结束时关闭。并且会话是线程不安全的,当被多个线程共享时容易出现问题。通常只有全局意义上的缓存才是真正的缓存应用,具有极大的缓存价值。所以Hibernate的会话级缓存的缓存功能并不明显,应用价值并不显著。Hibernate的L2缓存是为Hibernate配置一个全局缓存,这样多个线程和事务可以共享这个缓存。我们希望的是一个人用过,其他人也能用。会话没有这样的效果。
3.L2缓存是独立于Hibernate的软件组件,属于第三方。许多厂商和组织都提供缓存产品,如EHCache和OSCache等。要在hibernate中使用二级缓存,首先要在hibernate.cfg.xml的配置文件中配置使用哪个厂商的缓存产品,然后配置自己的配置文件,最后配置Hibernate中的哪些实体对象要纳入二级缓存的管理。知道了L2缓存的原理和这个思想,配置Hibernate L2缓存就很容易了。
扩展知识:一个SessionFactory可以关联一个二级缓存,即二级缓存只能负责缓存数据库中的数据。使用Hibernate的二级缓存时,注意不要让其他应用程序或SessionFactory更改当前数据库中的数据,这样缓存的数据会和数据库中的实际数据不一致。
八。什么是JDO?
JDO是java对象持久性的新规范,是Java数据对象的缩写,也是访问数据仓库中对象的标准化API。JDO提供了透明的对象存储,所以开发者完全没有必要用额外的代码来存储数据对象(比如使用JDBC API)。这些繁琐的例行任务已经转移到JDO产品提供商,解放了开发人员,让他们将时间和精力集中在业务逻辑上。此外,JDO非常灵活,因为它可以在任何底层数据层上运行。
比较:JDBC只是对关系数据库(RDBMS)JDO更通用,对任何底层数据都提供存储功能,如关系数据库、文件、XML和对象数据库(ODBMS)等。这使得应用程序更具可移植性。
九。Hibernate的一对多和多对一双向关联有什么区别?
一对多关联映射和多对一关联映射的基本原理是一样的,就是在多点的一端加一个外键到一端,主要区别是维护端不同。
他们之间的区别在于他们维护不同的关系:
一对多关联映射是指一边加载一端的数据,一边加载另一端的数据。多对一关联映射是指一边加载一端的数据,一边加载另一端的数据。
X.Hibernate如何延迟加载?
1.Hibernate2延迟加载实现:a)实体对象b)集合
2.Hibernate3提供了属性的延迟加载功能。当Hibernate查询数据时,数据并不存在于内存中。当程序真正对数据进行操作时,对象存在于内存中,从而实现了延迟加载。它节省了服务器的内存开销,从而提高了服务器的性能。
相关教程推荐:java入门教程以上是java高频基础面试问题3354 (6)的详细内容。更多请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。