高级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应用。
相关推荐
不爱学习的YY酱28 分钟前
【操作系统不挂科】<CPU调度(13)>选择题(带答案与解析)
java·linux·前端·算法·操作系统
丁总学Java33 分钟前
Maven项目打包,com.sun.tools.javac.processing
java·maven
kikyo哎哟喂44 分钟前
Java 代理模式详解
java·开发语言·代理模式
Doker 多克1 小时前
Spring AI 框架使用的核心概念
人工智能·spring·chatgpt
duration~1 小时前
SpringAOP模拟实现
java·开发语言
小码ssim1 小时前
IDEA使用tips(LTS✍)
java·ide·intellij-idea
我明天再来学Web渗透1 小时前
【SQL50】day 2
开发语言·数据结构·leetcode·面试
潜洋1 小时前
Spring Boot教程之五:在 IntelliJ IDEA 中运行第一个 Spring Boot 应用程序
java·spring boot·后端
暮志未晚Webgl2 小时前
109. UE5 GAS RPG 实现检查点的存档功能
android·java·ue5
小叶lr2 小时前
idea 配置 leetcode插件 代码模版
java·leetcode·intellij-idea