SSH面试题,ssh框架期末考试题及答案

  SSH面试题,ssh框架期末考试题及答案

  如何解决写爬虫IP受阻的问题?立即使用。

  Hibernate是如何工作的,为什么要用Hibernate?

  (更多相关面试问题推荐:java面试问答)

  工作原理:

  1.读取并解析配置文件。

  2.读取并分析映射信息以创建SessionFactory。

  3.打开会话

  4.创建交易记录转换

  5.持续操作

  6.提交事务

  7.关闭会话

  8.关闭会话工厂

  为什么使用Hibernate(即它的优点):

  1.封装了JDBC访问数据库的代码,大大简化了数据访问层繁琐的重复代码。

  2.Hibernate是基于JDBC的主流持久性框架,也是一个优秀的ORM实现。他大大简化了DAO层的编码工作。

  3.hibernate使用Java反射机制代替字节码增强器来实现透明性。

  4.Hibernate映射的灵活性非常好。它支持各种关系数据库,从一对一到多对多的复杂关系。

  2、Hibernate中get和load方法的区别

  Hibernate对于load方法认为数据必须存在于数据库中,可以安全地使用代理延迟加载。如果在使用过程中发现问题,只能抛出异常;

  Hibernate对于get方法,hibernate必须获取真实的数据,否则将返回null。

  具体介绍:

  1.对于get方法,hibernate会确认id对应的数据是否存在,首先在会话缓存中查找,然后在L2缓存中查找。如果没有,它将查询数据库,如果数据库中没有,它将返回null。

  2.当load方法加载实体对象时,它是根据映射文件上的类级别的lazy属性进行配置的(默认为true)。

  情境讨论:

  (1)如果为真,先在会话缓存中查找,看id对应的对象是否存在。如果没有,使用延迟加载返回实体的代理类对象(代理类是实体类的子类,由CGLIB动态生成)。等到对象被具体使用(除了获取OID),然后查询L2缓存和数据库。如果没有找到符合条件的记录,将引发ObjectNotFoundException。

  (2)如果为false,与get方法的搜索顺序相同,只是如果最后没有找到符合条件的记录,会抛出ObjectNotFoundException。

  3.Hibernate如何延迟加载?

  Hibernate3提供了属性的延迟加载。Hibernate查询数据时,数据并不存在于内存中,而当程序真正对数据进行操作时,对象存在于内存中,从而实现了延迟加载,节省了服务器的内存开销,从而提高了服务器的性能。

  4.Hibernate中如何实现类之间的关系?

  类和表的关系主要体现在表之间关系的操作上,都是对对象进行操作。我们在程序中将所有的表和类映射在一起,它们通过配置文件中的多对一、一对多、多对多进行操作。

  5.Hibernate中的update()和saveOrUpdate()有什么区别?

  saveOrUpdate():

  1.如果该对象已在此会话中持久化,则不执行任何操作。

  2.如果与此会话关联的另一个对象具有相同的持久标识符,则引发异常。

  3.如果对象没有持久标识符属性,则调用save()。

  4.如果对象的持久标识符表明它是一个新实例化的对象,则调用save()

  5.如果对象附有版本信息(通过版本或时间戳),并且version属性的值表明它是新实例化的对象,则调用save()。否则更新()该对象。

  更新() :

  就是直接更新一个自由实体对象。

  6.谈谈Hibernate的缓存机制。

  1.一级缓存:内部缓存存在于Hibernate中,属于应用事务级缓存。

  2.二级缓存:应用级缓存和分布式缓存。

  使用场景:数据不会被第三方修改,数据大小在可接受的范围内,数据更新频率低,同一数据被系统频繁使用,且不是关键数据。

  3.引入第三方缓存(如ehcache等。).

  7.如何优化Hibernate?

  1.使用双向一对多关联,而不是单向一对多关联

  2.灵活使用单向一对多关联

  3.不要一对一,使用多对一

  4.不使用集合缓存配置对象缓存。

  5.Bag用于一对多集合,set用于多对多集合。

  6.继承的类使用显式多态。

  7.表字段少,不用怕表关联多,有二级缓存支持。

  8.谈谈hibernate的延迟加载和openSessionInView

  延迟加载应该在session范围内,使用时再加载;

  Opensessioninview在web层写一个过滤器来打开和关闭会话,也就是说在一个请求过程中会话总是打开的,这就保证了会话延迟加载的前提。

  (视频推荐:java课程)

  9.简要描述struts2的工作流程

  1.客户端浏览器发送一个HTTP请求。

  2.根据web.xml的配置,该请求由FilterDispatcher接收。

  3.根据struts.xml配置,找到需要调用的动作类和方法,通过IoC将值注入Aciton。

  4.动作调用业务逻辑组件来处理业务逻辑。这一步包括表单验证。

  5.动作执行后,根据struts.xml中的配置找到对应的返回结果,跳转到对应的页面。

  6.向客户端浏览器返回HTTP响应。

  10、说说Struts的设计模式。

  MVC模式

  1、ActionServlet将在web应用程序启动时加载并初始化;

  2.当用户提交表单时,创建一个配置好的ActionForm对象,并填入表单的相应数据;

  3.ActionServlet根据Struts-config.xml文件的配置设置决定是否需要进行表单验证。如果需要,它调用ActionForm的Validate(),然后选择将请求发送到哪个操作。如果动作不存在,ActionServlet会先创建这个对象,然后调用动作的execute()方法;

  4.Execute()从ActionForm对象获取数据,完成业务逻辑,并返回ActionForward对象。ActionServlet然后将客户请求转发给ActionForward对象指定的jsp组件;

  5.ActionForward对象指定的jsp生成一个动态网页并返回给客户。

  1、Struts的优缺点

  优势:

  1.实现结构清晰的MVC模式,让开发者只关注业务逻辑的实现。

  2.可用的标签非常丰富,Struts的标签库(Taglib)如果能灵活使用,可以大大提高开发效率。另外,就国内JSP开发者而言,除了JSP自带的常用标记,很少开发自己的标记。也许Struts是一个很好的起点。

  3.页面导航。页面导航将是未来的一个发展方向。事实上,这样做会使系统的脉络更加清晰。通过一个配置文件,可以把握整个系统各部分之间的关系,对后期的维护大有裨益。尤其是当另一批开发者接手这个项目时,这种优势更加明显。

  4.提供异常处理机制。

  5.数据库连接池管理

  6.支持I18N

  缺点:

  1.到了显示层,需要配置forward。每次去显示层,我相信大部分都是直接去jsp,但是到了转的时候,就需要配置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的这种事件模式称为applicationevent,与组件事件相比是一种粗粒度的事件。

  12.为什么要用spring(即优点)?

  1.无论您是否选择使用EJB,Spring都可以有效地组织您的中间层对象。如果你只使用Struts或者其他专门为J2EE API设计的框架,Spring致力于解决剩下的问题。

  2.Spring可以消除Singleton在很多项目中的过度使用。过度使用Singleton降低了系统的可测试性和面向对象程度。

  3.通过在不同的应用程序和项目中以一致的方式处理配置文件,Spring可以消除对各种定制格式属性文件的需要。我很困惑一个类要找的是哪个神奇的属性项或者系统属性,所以我不得不去读Javadoc甚至源代码。使用Spring,您只需要查看类的JavaBean属性。控制反转的使用(下面讨论)有助于实现这种简化。

  4.通过将编程接口而不是类的成本降低到几乎为零,Spring可以促进良好编程习惯的形成。

  5.Spring旨在让用它创建的应用程序尽可能少地依赖它的API。Spring应用程序中的大多数业务对象都不依赖于Spring。

  6.用Spring构建的应用程序很容易进行单元测试。

  7.Spring可以使EJB的使用成为一种实现选择,而不是应用程序架构的必然选择。可以选择使用POJOs或者本地EJB来实现业务接口,但是不会影响调用代码。

  8.Spring可以帮助您解决许多问题,而无需使用EJB。Spring可以为EJB提供一个替代品,它适用于许多web应用程序。例如,Spring可以使用AOP来提供没有EJB容器的声明式事务管理。如果您只需要处理单个数据库,您甚至不需要JTA实现。

  9.无论使用JDBC还是O/R映射产品(比如Hibernate ), spring都为数据访问提供了一致的框架。

  13.列出你知道的几种实现spring事务的方法。

  (1)、程序化事务管理:需要手工编写代码,实际开发中很少用到。

  (2)需要为每个事务管理类配置基于TransactionProxyFactoryBean的声明式事务管理。

  (3)基于AspectJ的XML声明式事务管理,不需要改变类,可以在XML文件中配置。

  (4)基于注释的声明式事务管理配置简单,需要在业务层类中添加注释。

  14.谈谈spring事务的隔离级别和传播行为。

  隔离级别:

  -DEFAULT使用数据库的默认隔离级别。

  -READ_UNCOMMITTED会导致脏读、不可重复读和幻影读的问题。

  -READ_COMMITTED,会出现重复读取和幻影读取。

  -REPEATABLE_READ将导致幻像读取。

  -SERIALIZABLE最安全,但是最贵,性能影响极其严重。

  和传播线:

  -如果存在事务,则需要将它合并到事务中;如果不存在,将会创建它。

  -支持如果一个事务存在,它将被合并到事务中;如果它不存在,就不会被创建。

  -强制如果有交易,会整合到交易中;如果没有事务,将抛出异常。

  -REQUIRES_NEW _ new总是创建新事务。

  -NOT_SUPPORTED如果有事务,事务将被挂起,非事务操作将一直执行。

  -从不总是执行非事务,如果当前有事务,则抛出异常。

  -嵌套的嵌入式事务

  15.DI机制是什么?

  依赖注入和控制反转是同一个概念。具体来说,当一个角色需要另一个角色的协助时,在传统的编程过程中,调用者通常会创建被调用者的实例。

  但是spring中创建被调用者的工作不再由调用者完成,所以称之为控制反转。创建被调用者的工作由spring完成,然后注入调用者。

  所以也叫依赖注入。

  Spring以动态和灵活的方式管理对象。注入方式有两种:设置注入和构造注入。

  注射的优点:直观自然。

  注入的优点:可以在构造函数中决定依赖关系的顺序。

  16.什么是AOP?

  面向方面编程(AOP)改进了spring的依赖注入(DI ),

  面向方面编程在spring中主要表现在两个方面:

  1.为方面编程提供声明式事务管理。

  2.spring支持用户定义的方面。

  推荐教程:java入门以上是2022年最新SSH框架面试题目的详细内容。更多请关注我们的其他相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: