【 <二> 丹方改良:Spring 时代的 JavaWeb】之 Spring MVC 的崛起:从 Struts 到 Spring 的演进

<前文回顾>

点击此处查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshare=blogcolumn&sharetype=blogcolumn&sharerId=12907601&sharerefer=PC&sharesource=FoyoDesigner&sharefrom=from_link

<今日更新>

一、Struts:JavaWeb 的"老大哥"

在 JavaWeb 开发里,Struts 曾经是"老大哥",它用 MVC 模式[1] 把 JavaWeb 开发带入了"新时代"。Struts 的核心是 ActionActionForm,它们分别负责处理请求和封装数据。

1. Action:Struts 的"指挥官"

Action 是 Struts 的"指挥官",它负责处理请求,调用业务逻辑,再把结果交给 JSP 展示。

|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Java Code |
| public class LoginAction extends Action { public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { LoginForm loginForm = (LoginForm) form; String username = loginForm.getUsername(); String password = loginForm.getPassword(); if ("admin".equals(username) && "123456".equals(password)) { return mapping.findForward("success"); } else { return mapping.findForward("failure"); } } } |

2. ActionForm:Struts 的"数据搬运工"

ActionForm 是 Struts 的"数据搬运工",它负责封装表单数据,方便 Action 处理。

|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Java Code |
| public class LoginForm extends ActionForm { private String username; private String password; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } } |

二、Struts 的"辉煌"与"没落"

Struts 虽然"辉煌"过,但它的"没落"也是"命中注定"。Struts 的配置复杂、灵活性差、性能低,让开发者"望而却步"。

1. 配置复杂:Struts 的"硬伤"

Struts 的配置复杂得"让人头大",得写 struts-config.xmlweb.xml 啥的,配置起来"费劲"。

|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| XML Code |
| <!-- struts-config.xml 配置 Action --> <action-mappings> <action path="/login" type="com.example.LoginAction" name="loginForm" scope="request"> <forward name="success" path="/success.jsp"/> <forward name="failure" path="/failure.jsp"/> </action> </action-mappings> |

2. 灵活性差:Struts 的"短板"

Struts 的灵活性差得"让人无语",ActionActionForm 得一一对应,开发起来"费劲"。

|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Java Code |
| public class LoginAction extends Action { public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { // 处理逻辑 } } |

3. 性能低:Struts 的"软肋"

Struts 的性能低得"让人抓狂",每次请求都得创建 ActionActionForm,性能"堪忧"。

三、Spring MVC 的崛起:从"小弟"到"大哥"

Spring MVC 是 Struts 的"小弟",但它用"灵活"和"高效"打败了 Struts,成为了 JavaWeb 开发的"新大哥"。

1. 灵活配置:Spring MVC 的"杀手锏"

Spring MVC 的配置灵活得"让人舒服",能用注解配置,不用再写 struts-config.xml 了。

|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Java Code |
| @Controller public class LoginController { @RequestMapping("/login") public String login(@RequestParam String username, @RequestParam String password, Model model) { if ("admin".equals(username) && "123456".equals(password)) { model.addAttribute("message", "登录成功!"); return "success"; } else { model.addAttribute("message", "用户名或密码错误!"); return "failure"; } } } |

2. 高效性能:Spring MVC 的"王牌"

Spring MVC 的性能高效得"让人惊喜",它用 DispatcherServlet 处理请求,性能"杠杠的"。

|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Java Code |
| public class DispatcherServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 处理请求 } } |

3. 注解配置:Spring MVC 的"轻装上阵"

Spring MVC 的注解配置简单得"让人舒服",能用 @Controller@RequestMapping 啥的,配置起来"顺手"。

|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Java Code |
| @Controller public class LoginController { @RequestMapping("/login") public String login(@RequestParam String username, @RequestParam String password, Model model) { // 处理逻辑 } } |

四、Spring MVC 的"历史":从 Spring 2.5 到 Spring 5.0

Spring MVC 从 Spring 2.5 开始就有了,虽然现在 Spring 5.0 已经"普及"了,但 Spring MVC 的"核心功能"依然没变。

1. Spring 2.5:初代"小弟"

Spring 2.5 在 2007 年发布,Spring MVC 是它的"初代小弟"。虽然功能简单,但已经能满足大部分开发需求了。

2. Spring 3.0:引入注解配置

Spring 3.0 在 2009 年发布,引入了注解配置,让 Spring MVC 的"玩法"更加丰富。

|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Java Code |
| @Controller public class LoginController { @RequestMapping("/login") public String login(@RequestParam String username, @RequestParam String password, Model model) { // 处理逻辑 } } |

3. Spring 4.0:支持 RESTful

Spring 4.0 在 2013 年发布,支持 RESTful[2],让 Spring MVC 的"玩法"更加灵活。

|----------------------------------------------------------------------------------------------------------------------------------|
| Java Code |
| @RestController public class UserController { @GetMapping("/users/{id}") public User getUser(@PathVariable int id) { // 处理逻辑 } } |

4. Spring 5.0:支持 Reactive

Spring 5.0 在 2017 年发布,支持 Reactive[3],让 Spring MVC 的"玩法"更加高效。

|------------------------------------------------------------------------------------------------------------------------------------------|
| Java Code |
| @RestController public class UserController { @GetMapping("/users/{id}") public Mono<User> getUser(@PathVariable int id) { // 处理逻辑 } } |

五、Spring MVC 的"骚操作"

1. RESTful 风格的"骚操作"

Spring MVC 支持 RESTful 风格,能用 @RestController@GetMapping 啥的,开发起来"顺手"。

|----------------------------------------------------------------------------------------------------------------------------------|
| Java Code |
| @RestController public class UserController { @GetMapping("/users/{id}") public User getUser(@PathVariable int id) { // 处理逻辑 } } |

2. 文件上传的"骚操作"

Spring MVC 支持文件上传,能用 MultipartFile 处理文件上传,开发起来"顺手"。

|----------------------------------------------------------------------------------------------------|
| Java Code |
| @PostMapping("/upload") public String upload(@RequestParam("file") MultipartFile file) { // 处理逻辑 } |

3. 异常处理的"骚操作"

Spring MVC 支持全局异常处理,能用 @ControllerAdvice@ExceptionHandler 啥的,开发起来"顺手"。

|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Java Code |
| @ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(Exception.class) public ResponseEntity<String> handleException(Exception e) { return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(e.getMessage()); } } |

专有名词解释:

  1. MVC 模式:Model-View-Controller,一种设计模式,用于将应用程序分为模型、视图和控制器三层。
  2. RESTful:一种基于 HTTP 协议的架构风格,强调资源的表述和状态转移。
  3. Reactive:一种响应式编程模型,支持异步、非阻塞的操作。
相关推荐
都叫我大帅哥19 分钟前
Spring Batch:让大数据处理像流水线一样丝滑
java·spring
都叫我大帅哥3 小时前
Spring Batch中的ItemWriter:数据搬运工的“终极驿站” 📦
java·spring
我的炸串拌饼店12 小时前
ASP.NET MVC 中SignalR实现实时进度通信的深度解析
后端·asp.net·mvc
CUIYD_198912 小时前
Spring MVC 处理静态资源请求 - ResourceHandler
java·spring·mvc
Maỿbe14 小时前
实现回显服务器(基于UDP)
java·javaweb·echo·回显服务器
电子科技圈1 天前
为AR眼镜等多种智能可穿戴设备添加穿戴状态检测功能
经验分享·后端·嵌入式硬件·ar·restful·智能硬件·智能手表
程序员岳焱1 天前
SpringMVC 开发避坑指南:十大常见问题深度解析与解决方案
java·后端·spring
sg_knight1 天前
Spring Cloud LoadBalancer深度解析:官方负载均衡方案迁移指南与避坑实践
java·spring boot·spring·spring cloud·微服务·负载均衡
llwszx1 天前
Spring Boot 整合 Spring AI 与 MCP 开发智能体工具指南
人工智能·spring boot·spring·智能体·spring ai·mcp
mall_09051 天前
Spring Cloud使用Eureka调用接口,超时设置(三)
spring·spring cloud·eureka