Java框架面试题总结
### Java框架面试题总结 #### Struts篇 **1. Struts的工作流程** Struts框架是一种基于MVC(Model-View-Controller)架构模式的Java Web应用框架。它的工作流程如下: - **客户端发起请求**:客户端通过浏览器或其他前端工具向服务器发送HTTP请求。 - **请求到达ActionServlet**:所有的HTTP请求都会被路由到Struts的核心控制器`ActionServlet`。这个控制器是Struts的入口点,负责接收并处理所有来自客户端的请求。 - **ActionServlet解析请求**:`ActionServlet`解析请求,查找与请求相关的`Action`和`ActionForm`对象。 - **创建或重用ActionForm对象**:如果请求携带了表单数据,`ActionServlet`将会创建或重用一个`ActionForm`对象,并将请求参数填充到该对象中。 - **验证ActionForm**:`ActionServlet`会调用`ActionForm`对象的方法来验证表单数据的有效性。如果验证失败,将返回错误信息到视图层显示。 - **调用Action对象**:验证通过后,`ActionServlet`根据`struts-config.xml`配置文件中的配置,找到相应的`Action`对象,并调用其`execute()`方法。在这个过程中,`Action`对象可以从`ActionForm`中获取数据,并调用业务逻辑组件来执行具体的业务逻辑。 - **Action返回结果**:`Action`对象执行完毕后,会返回一个表示下一步操作的`ActionForward`对象给`ActionServlet`。 - **ActionServlet处理返回值**:`ActionServlet`根据`ActionForward`对象的指示,将控制权交给相应的视图组件(如JSP页面),最终响应给客户端。 **2. Struts的工作流程分解** 当Web应用程序采用了Struts框架后,在Web应用启动时,Struts框架会初始化并加载配置文件`struts-config.xml`。这个配置文件定义了整个应用的结构,包括各个Action、Form Bean以及它们之间的映射关系。初始化完成后,Struts就准备好接收客户端请求,并按照上面所述的流程进行处理。 **3. Struts控制器组件的组成及其主要功能** - **ActionServlet**:核心控制器,负责接收请求、解析请求、分发请求给相应的Action处理。 - **ActionForm**:用于封装客户端请求的数据,提供验证机制。 - **Action**:具体执行业务逻辑的组件,从ActionForm获取数据并调用模型层进行处理。 - **ActionForward**:定义了Action执行后的跳转路径。 **4. Struts中的几个关键对象的作用** - **ActionServlet**:作为控制器,管理整个Struts框架的流程。 - **ActionForm**:封装表单数据,提供验证功能。 - **Action**:业务逻辑处理器,执行具体的业务操作。 - **ActionForward**:定义Action执行的结果,决定下一个请求路径。 - **ActionMapping**:配置文件中定义的Action映射,用来关联ActionForm和Action。 **5. Struts工作流程图(用例图)** 由于本文档无法展示图形,建议查阅相关书籍或在线资源获得Struts工作流程图的具体示意图。 **6. 说说MVC设计模式及其优点** MVC即Model-View-Controller,是一种常用的设计模式,旨在将数据模型、用户界面和控制逻辑分离。其优点包括: - **代码复用**:模型部分可以独立于视图和控制器,便于代码重用。 - **模块化**:将复杂的应用程序划分为更小的模块,便于维护和扩展。 - **降低耦合度**:通过明确的接口定义,使得各个组件之间的耦合度降低,提高了系统的灵活性。 **7. Struts是如何实现MVC的?** Struts框架通过以下组件实现了MVC模式: - **Model**:由业务逻辑组件和数据访问对象组成。 - **View**:由JSP页面或HTML页面组成。 - **Controller**:由ActionServlet、Action和ActionForm组成。 **8. Struts的优点与缺点** - **优点**: - 易于理解和使用。 - 强大的表单验证机制。 - 丰富的标签库支持。 - 良好的文档支持和社区资源。 - **缺点**: - 性能问题,特别是在大量并发请求的情况下。 - 较为臃肿,对于简单的应用来说可能显得过于复杂。 **9. Struts的Action是不是线程安全的?如果不是,有什么方式可以保证Action的线程安全?** 默认情况下,Struts的Action不是线程安全的,因为Action实例会被复用。确保线程安全的方式包括: - 使用`@Scope("prototype")`注解标记Action类,确保每次请求都创建一个新的实例。 - 将所有成员变量声明为`transient`,避免在序列化过程中导致线程不安全。 - 在`execute`方法中避免使用实例变量,只使用局部变量。 **10. Tiles框架是什么?** Tiles框架是一种用于构建网页布局的框架,它可以方便地创建复杂的网页布局。Tiles框架通常与Struts框架结合使用,用来定义页面布局和组织页面结构。 **11. Struts1.x和Struts2的区别** - **架构差异**:Struts2采用了拦截器栈模型,而Struts1则采用了传统的MVC模式。 - **配置方式**:Struts2支持XML和注解两种配置方式,而Struts1仅支持XML配置。 - **性能优化**:Struts2在性能方面进行了优化,尤其是在高并发场景下的表现优于Struts1。 **12. Struts的常用标签库及用法** - **Struts HTML标签库**:提供了一系列用于表单生成的标签,例如`<html:form>`、`<html:text>`等。 - `<html:form>`:定义一个表单。 - `<html:text>`:创建一个文本输入框。 - `<html:submit>`:创建一个提交按钮。 - **Struts Bean标签库**:提供了一组用于处理Bean的操作标签,例如`<bean:message>`、`<bean:write>`等。 - `<bean:message>`:用于显示国际化消息。 - `<bean:write>`:输出Bean属性的值。 - `<bean:define>`:定义一个变量。 - **Struts Logic标签库**:提供了一组用于逻辑控制的标签,例如`<logic:equal>`、`<logic:notEmpty>`等。 - `<logic:equal>`:判断两个值是否相等。 - `<logic:notEmpty>`:判断一个值是否非空。 - `<logic:iterate>`:循环遍历集合。 **13. JSP中动态INCLUDE与静态INCLUDE的区别?** - **动态INCLUDE**:在运行时动态决定是否包含另一个页面,可以传递参数。 - **静态INCLUDE**:在编译时就已经确定,不支持参数传递。 --- #### Ajax篇 **1. ajax是什么** Ajax全称Asynchronous JavaScript and XML,是一种创建交互式网页应用的技术,能够在不重新加载整个页面的情况下更新部分内容。 **2. ajax实现的原理** Ajax通过JavaScript异步地向服务器发送请求,并在后台获取和处理数据,然后动态更新页面的一部分内容。 **3. ajax框架的基本流程** - 发起Ajax请求。 - 服务器端处理请求。 - 返回处理结果。 - 客户端处理返回数据。 - 更新页面内容。 **4. DWR的实现原理** DWR(Direct Web Remoting)是一种简化Ajax开发的框架,它允许在JavaScript中直接调用服务器端的Java方法。 **5. ajax开发步骤** - 创建XMLHttpRequest对象。 - 设置请求类型和URL。 - 发送请求。 - 处理服务器返回的数据。 - 更新页面内容。 --- #### Spring篇 **一. 基础知识** **1. 对IOC的理解** IoC即Inversion of Control,控制反转,是一种设计思想,使得对象的创建过程从对象本身转移到外部容器上。Spring框架通过IoC容器管理对象的生命周期和依赖关系。 **2. 依赖注入的三种实现形式** - **构造器注入**:通过构造函数传递依赖。 - **Setter注入**:通过setter方法传递依赖。 - **接口注入**:通过实现特定接口注入依赖。 **3. Setter注入和构造方法注入比较** - **Setter注入**:易于测试,可以在运行时更改依赖。 - **构造方法注入**:保证依赖不可变,更适合必填的依赖。 **4. 对AOP的理解,以及AOP在项目中是如何使用的** AOP即Aspect Oriented Programming,面向切面编程,是一种编程范式,用于处理横切关注点。在Spring中,AOP通过代理模式实现,可以通过声明式或编程式方式使用。 **5. AOP的概念和术语** - **切面**:代表一个关注点,例如日志记录。 - **连接点**:程序执行的某个位置,例如方法调用。 - **通知**:在连接点执行的动作。 - **引入**:添加新的方法或属性到已有类的过程。 - **织入**:将切面和连接点结合起来的过程。 **6. Spring中有五种不同的通知** - **Before通知**:在连接点之前执行。 - **After通知**:无论方法正常执行还是抛出异常都会执行。 - **After-returning通知**:在方法正常返回后执行。 - **After-throwing通知**:在方法抛出异常后执行。 - **Around通知**:环绕通知,可以在连接点前后执行自定义逻辑。 **7. Spring bean的生命周期** - **实例化**:通过构造器或工厂方法创建Bean。 - **设置属性**:填充Bean的属性值。 - **初始化**:调用初始化方法。 - **销毁**:调用销毁方法。 **8. Bean的作用域** - **singleton**:单例模式,容器中只有一个Bean实例。 - **prototype**:原型模式,每次请求都会创建一个新的Bean实例。 - **request**:每个HTTP请求都有一个Bean实例。 - **session**:每个HTTP Session都有一个Bean实例。 - **global-session**:全局会话作用域,通常用于portlet。 **9. Spring自动代理** Spring通过AOP自动为Bean生成代理对象,代理对象在调用目标方法时会触发通知的执行。 **10. Spring事务特点** - 支持声明式事务管理。 - 支持编程式事务管理。 - 提供了多种隔离级别和传播行为。 **11. 谈谈Spring事务的理解** Spring提供了强大的事务管理功能,可以使用声明式事务简化事务的处理,同时支持编程式事务管理,提供更灵活的控制。 **12. 编程式事务和声明式事务如何选择?** - **声明式事务**:适用于简单且固定不变的事务需求。 - **编程式事务**:适用于复杂的事务逻辑或需要特殊处理的情况。 **二. Spring应用** **13. spring中的BeanFactory与ApplicationContext的作用和区别?** - **BeanFactory**:基本的容器接口,提供了Bean的实例化、配置和管理功能。 - **ApplicationContext**:继承了BeanFactory的功能,并提供了更多的高级功能,如国际化支持、事件发布机制等。 **14. Spring里面applicationContext.xml文件能不能改成其他文件名?** 可以,但需要在配置文件中指定正确的文件名。 **15. spring中commons-logging.jar的作用** `commons-logging.jar`是Apache Commons Logging项目提供的日志抽象层,它允许开发者编写一次日志代码,然后在运行时选择合适的日志实现。 **16. spring中读取xml配置文件、获取bean的几种方式** - 通过`ApplicationContext`接口的`newClassPathXmlApplicationContext(String[] configLocations)`方法加载配置文件。 - 使用`BeanFactory`的`new XmlBeanFactory(Resource resource)`方法。 **17. Spring启动参数contextConfigLocation和ContextLoaderListener理解** - `contextConfigLocation`:配置Spring上下文的XML文件位置。 - `ContextLoaderListener`:监听器,用于初始化Web应用的Spring上下文。 **18. Spring框架在web容器是如何启动的?** - 注册`ContextLoaderListener`监听器。 - 监听器在Web应用启动时加载配置文件,初始化Spring上下文。 - 容器加载Spring配置,创建Bean实例。 - 应用运行期间,Spring管理Bean的生命周期。 --- #### Hibernate篇 **1. Hibernate优缺点** - **优点**: - 自动管理对象的生命周期。 - 提供强大的ORM映射功能。 - 支持多种数据库。 - **缺点**: - 配置相对繁琐。 - 性能优化需要深入理解。 **2. Hibernate工作原理及为什么要用** Hibernate通过ORM技术将Java对象与数据库表建立映射关系,简化了数据持久化的处理。使用Hibernate可以提高开发效率,减少重复代码。 **3. Hibernate是如何延迟加载?** 延迟加载是指在实际需要数据时才加载数据。Hibernate通过代理模式实现延迟加载,只有在真正需要数据时才会发出SQL查询语句。 **4. Hibernate中怎样实现类之间的关系?** - **一对一**:使用`@OneToOne`注解。 - **一对多**:使用`@OneToMany`注解。 - **多对多**:使用`@ManyToMany`注解。 **5. 说下Hibernate的缓存机制** - **一级缓存**:Session级别的缓存,由Hibernate自动管理。 - **二级缓存**:Application级别的缓存,需要手动配置。 **6. 什么样的数据适合放到二级缓存中?** - 经常被多个Session访问的数据。 - 数据更新频率较低的数据。 **7. Hibernate的查询方式** - HQL(Hibernate Query Language):类似于SQL的查询语言。 - Criteria API:提供了一种基于标准的API来构建查询。 **8. 如何优化Hibernate?** - 使用适当的缓存策略。 - 合理设计映射关系。 - 减少不必要的查询。 **9. 说说Hibernate中的update()和saveOrUpdate()的区别** - `update()`:仅更新已存在的对象。 - `saveOrUpdate()`:根据对象的状态决定是保存还是更新。 **10. 说说Hibernate中的session的load()和get()的区别。** - `load()`:可能会抛出异常,如果没有找到对应的对象。 - `get()`:如果找不到对应的对象,返回null。 **11. 谈谈Hibernate中inverse的作用** `inverse`属性用于指定关联关系的维护方,即哪一方负责更新关联关系。 **12. hibernate中对象的三种状态** - **瞬时态**:对象尚未被持久化,没有关联的数据库记录。 - **持久态**:对象已被持久化,有一个关联的数据库记录。 - **脱管态**:对象曾被持久化,但现在脱离了Hibernate的管理。 **13. 在数据库中条件查询速度很慢的时候,如何优化?** - 使用索引。 - 减少查询范围。 - 合理使用分页。 **14. 在hibernate中进行多表查询,每个表中各取几个字段,也就是说查询出来的结果集并没有一个实体类与之对应,如何解决这个问题?** 可以使用`Criteria`或`Query`对象的`setResultTransformer()`方法,使用`AliasToBeanResultTransformer`或自定义转换器来处理结果集。 --- #### iBatis篇 **1. iBatis的优缺点** - **优点**: - 灵活性较高。 - 学习曲线相对较低。 - **缺点**: - 不支持自动ORM映射。 - 需要手动编写SQL语句。 **2. iBatis与Hibernate区别(比较)** - **ORM映射**:iBatis需要手动编写SQL,Hibernate自动映射。 - **学习曲线**:iBatis较容易上手,Hibernate较为复杂。 - **灵活性**:iBatis灵活性更高,适合复杂的SQL查询。 **3. iBatis与传统JDBC比较** - **代码量**:iBatis减少了大量的样板代码。 - **数据库连接管理**:iBatis简化了连接管理和错误处理。 **4. Hibernate和iBatis的映射关系** - **Hibernate**:通过注解或XML配置文件定义对象-关系映射。 - **iBatis**:通过SQL映射文件定义SQL语句和结果映射。 **5. iBatis动态标签有哪些?** - `<if>`:根据条件判断是否包含子元素。 - `<choose>`、`<when>`、`<otherwise>`:选择性包含子元素。 - `<foreach>`:循环遍历集合或数组。 **6. iBatis中使用like‘%#filedName#%’时,有什么问题?** 可能导致SQL注入问题,应使用预编译语句来防止SQL注入。 **7. iBatis中#与$的区别?** - `#`:预编译处理,可防止SQL注入。 - `$`:字符串替换,存在SQL注入风险。 --- #### 框架问题 **1. SSH框架的配置文件加载顺序** - **Spring**:首先加载Spring的配置文件。 - **Struts**:加载Struts的配置文件。 - **Hibernate**:最后加载Hibernate的配置文件。 **2. Spring框架在web容器是如何启动的?** - 注册`ContextLoaderListener`监听器。 - 监听器在Web应用启动时加载配置文件,初始化Spring上下文。 **3. Webservice+spring2.0+iBatis项目的加载顺序** - **Spring**:加载Spring配置文件。 - **Webservice**:配置Web服务相关组件。 - **iBatis**:加载iBatis配置文件。 **4. appfuse框架机制** AppFuse是一个基于Struts、Spring和Hibernate的快速应用开发框架,提供了一个模板项目,用于快速搭建应用。 **5. iBatis与Hibernate如何选择?** - **iBatis**:适合需要高度定制SQL查询的应用。 - **Hibernate**:适合希望自动处理ORM映射的应用。
剩余33页未读,继续阅读
- o5xuqq2013-05-23内容很丰富,很实用。
- 金兄2012-11-16整理得不错,比较齐,有用
- 粉丝: 2
- 资源: 3
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助