广州奥格智能科技有限公司

版权声明: https://blog.csdn.net/qq_32939679/article/details/82657651

1、Servlet包含那几个特定的方法?不同方法分别在什么条件下调用?

HttpServlet 类包含 init() 、 service() 、destroy() 等方法。其中 init() 和 destroy() 方法是继承的。分别在初始化,访问,结束回话时候调用

Struts2框架问题

1.Action是线程安全的吗?为什么?

不是线程安全的,首先JSP默认是以多线程方式执行的,在action里用实例变量时,因为实例变量是在堆中分配的,并被属于该实例的所有线程共享,所以不是线程安全的. 

2.从页面发出的请求(request)数据是如何加载到Action属性的?实际上是通过Struts2框架的什么机制来实现的?能否描述一下您对这种机制的理解?

一、通过get set方法获取

二、通过ServletActionContext获取

三、通过ActionContext获取//导入

MVC运行机制

核心控制器是会过滤所有请求,如果以Action结尾,该亲戚会转入框架处理,当框架获取*Action请求后,根据*Action的前半部分决定调用那个业务逻辑组件,最后根据逻辑组件的处理信息决定转发到那个视图。

3.JSP页面是通过什么方式来获取并显示Action属性值的?能否描述这种实现方式的原理过程吗?

一、用struts标签获取:<s:property value="#session.sessionid"/>

二、用会话获取:session.getAttribute("sessionid");

三、el表达式获取:${sessionScope.sessionid}

Spring 框架问题:

1.service (或bean)要配置数据库事务,一般有哪些配置方式?能否描述下Spring实现数据库事务自动注入的原理过程?

第一种方式:每个Bean都有一个代理

第二种方式:所有Bean共享一个代理基类

第三种方式:使用拦截器

第四种方式:使用tx标签配置的拦截器

第五种方式:全注解

  通过以上配置事务,让我们从复杂的事务处理中得到解脱。使得我们再也无需要去处理获得连接、关闭连接、事务提交和回滚等这些操作。再也无需要我们在与事务相关的方法中处理大量的try…catch…finally代码。

2.带有数据库事务的service可以注入dao,但可以注入其他的也带有数据库事务的service吗?为什么?

dao属于依赖注入,Service属于包内调用

3.详细描述一下如何利用AOP实现通用日志功能的主要步骤过程?

  第一步:在代码中添加自定义注解,并且定义两个属性,一个是日志的描述(description),还有个是操作表类型(tableType),属性参数可按需求改变

第二步:定义切面类,获取切面参数

第三步:在service需要记录日志的地方进行注解

第四步:把切面类所在的包路径添加到Spring注解自动扫描路径下,并且启动对@AspectJ注解的支持

Hibernate框架问题:

1.一级缓存和二级缓存的区别是什么?

第一级是Session的缓存。由于Session对象的生命周期通常对应一个数据库事务或者一个应用事务,因此它的缓存是事务范围的缓存。第一级缓存是必需的,不允许而且事实上也无法比卸除。在第一级缓存中,持久化类的每个实例都具有唯一的OID。

  第二级缓存是一个可插拔的的缓存插件,它是由SessionFactory负责管理。由于SessionFactory对象的生命周期和应用程序的整个过程对应,因此第二级缓存是进程范围或者集群范围的缓存。这个缓存中存放的对象的松散数据。第二级对象有可能出现并发问题,因此需要采用适当的并发访问策略,该策略为被缓存的数据提供了事务隔离级别。缓存适配器用于把具体的缓存实现软件与Hibernate集成。第二级缓存是可选的,可以在每个类或每个集合的粒度上配置第二级缓存。

2.假设让您使用Hibernate框架来批量更新大量数据记录,您会怎么做?这种做法的优缺点是什么?

如果直接更新的话会出现内存溢出等问题,我的处理方法是用每50作为一个数据单元,每50条调用flush()刷新数据,再用clear()清空缓存。优点是逻辑简单,缺点是效率低,更新数据时如果系统出错会很麻烦

猜你喜欢

转载自blog.csdn.net/qq_32939679/article/details/82657651