高级java每日一道面试题-2024年9月16日-框架篇-Spring MVC和Struts的区别是什么?
如果有遗漏,评论区告诉我进行补充
面试官: 如何处理事务中的性能问题?
我回答:
在Java高级面试中,Spring MVC和Struts是两个常被提及的MVC框架,它们各自具有独特的特点和优势。以下是对这两个框架的详细比较:
架构设计方面
-
Spring MVC:
- MVC架构:Spring MVC也是一个基于MVC架构的Web框架。
- Controller类:控制器部分由Controller类实现,通常使用注解(如
@Controller
)来标记。 - 配置文件:Spring MVC可以使用XML配置文件(如
spring-mvc.xml
),但更常见的是使用注解配置(如@RequestMapping
)。
作为Spring框架的一部分,Spring MVC采用了一种轻量级的架构设计。它提供了全面的企业级特性,如依赖注入(DI)、面向切面编程(AOP)、事务管理等。这使得Spring MVC能够与Spring框架的其他部分无缝集成,从而提供更丰富的功能和更好的扩展性。
-
Struts:
- MVC架构:Struts是一个基于MVC(Model-View-Controller)架构的Web框架。
- Action类:控制器部分由Action类实现,每个Action类对应一个用户请求。
- 配置文件:Struts使用
struts-config.xml
文件进行配置,包括Action映射、Forward配置等。
Struts是一个独立的MVC框架,专注于Web层的MVC设计模式。虽然它也提供了MVC架构的支持,但相比之下,其架构设计更为传统,核心部分较为臃肿,包含更多的配置和框架文件。
控制器实现
Struts
- Action类:继承自
Action
类,必须实现execute
方法。 - ActionForm:用于封装表单数据,需要手动绑定和验证。
- ActionForward:用于页面跳转,需要在
struts-config.xml
中配置。
Spring MVC
- Controller类:使用
@Controller
注解标记,方法使用@RequestMapping
(或其派生注解如@GetMapping
,@PostMapping
)来映射请求。 - Model:可以直接在方法参数中使用
Model
对象来传递数据到视图。 - 返回值:可以返回字符串(表示视图名称)或
ModelAndView
对象。
配置方式
Struts
- XML配置:所有的配置都在
struts-config.xml
文件中进行,包括Action映射、Forward配置等。 - 配置繁琐:需要手动配置每个Action和Forward,配置文件可能变得非常庞大和复杂。
Spring MVC
- 注解配置:使用注解(如
@Controller
,@RequestMapping
)来配置控制器和请求映射,减少了XML配置的繁琐。 - 灵活配置:可以混合使用XML配置和注解配置,提供了更大的灵活性。
拦截机制
- Spring MVC:Spring MVC采用方法级别的拦截机制。每个请求都会对应一个方法,并且请求参数会直接注入到方法的形参中。这种机制使得方法之间的数据隔离更加清晰,也便于进行单元测试。
- Struts:Struts采用类级别的拦截机制。每次请求都会创建一个新的Action实例,并通过setter和getter方法将请求数据注入到Action的属性中。这种机制使得Action的属性在所有方法中共享,虽然方便了在多个方法中访问数据,但也增加了数据管理的复杂性。
依赖注入
Struts
- 依赖注入:Struts 2支持依赖注入,但默认使用的是Struts自己的依赖注入框架。
- 配置复杂:依赖注入的配置相对复杂,需要在
struts.xml
中进行配置。
Spring MVC
- 依赖注入:Spring MVC完全集成Spring框架的依赖注入功能,可以轻松地注入依赖。
- 简单配置:依赖注入的配置非常简单,通常在Spring配置文件中进行。
性能和可测试性
- 性能:由于Spring MVC采用了轻量级的架构设计和高效的拦截机制,因此它在性能方面通常优于Struts。此外,Spring MVC还支持异步处理和多线程并发,进一步提高了应用程序的响应速度和吞吐量。
- 可测试性:Spring MVC的设计更加简单和灵活,使得开发者可以更容易地编写和执行单元测试。相比之下,Struts的测试通常需要更多的准备工作和依赖项,因此可测试性较差。
视图解析
Struts
- 视图解析:使用
ActionForward
对象来指定视图,需要在struts-config.xml
中配置。 - 固定视图:视图路径和名称通常是固定的,灵活性较低。
Spring MVC
- 视图解析:使用
ViewResolver
来解析视图,可以在配置文件中灵活配置视图解析规则。 - 动态视图:视图路径和名称可以动态生成,灵活性较高。
表单处理
Struts
- ActionForm:需要创建ActionForm类来封装表单数据,手动进行数据绑定和验证。
- 数据绑定:数据绑定需要手动配置,灵活性较低。
Spring MVC
- 命令对象:可以直接在Controller方法中使用命令对象(POJO)来接收表单数据,Spring自动进行数据绑定。
- 数据验证:支持JSR-303(如Hibernate Validator)进行数据验证,配置简单。
插件和扩展
Struts
- 插件:Struts 2提供了丰富的插件支持,如JSON插件、Tiles插件等。
- 扩展性:扩展性较好,但需要更多的配置和代码。
Spring MVC
- 插件:Spring MVC本身是Spring生态系统的一部分,可以方便地集成Spring的其他模块(如Spring Security、Spring Data等)。
- 扩展性:扩展性非常好,可以通过拦截器、处理器等机制进行扩展。
总结
- Spring MVC在配置灵活性、依赖注入、视图解析、表单处理等方面具有明显优势,更适合现代Web应用的开发。
- Struts虽然也有一些优点,但在灵活性和易用性方面略逊一筹,更适合一些传统的Web应用。