17、Spring MVC 框架:构建强大的 Java Web 应用程序

嘿,Java 开发者们!今天我们将深入探讨 Spring MVC 框架,它是 Spring 框架中专门用于构建 Web 应用程序的一个强大模块。Spring MVC 遵循经典的 MVC(Model-View-Controller)设计模式,让我们能够轻松地开发出清晰、可维护和可扩展的 Web 应用程序。让我们一起探索 Spring MVC 的世界,看看如何利用它来处理 HTTP 请求和响应,构建出色的 Web 服务和网站吧!

一、Spring MVC 概述

1. 什么是 Spring MVC?

Spring MVC 是 Spring 框架的一部分,它是一个基于 Java 的 Web 开发框架,旨在帮助我们构建灵活、可扩展和可维护的 Web 应用程序。它采用了经典的 MVC 设计模式,将应用程序分为三个核心部分:

  • Model:存储数据,通常是业务逻辑处理的结果,将数据提供给视图进行展示。
  • View:负责呈现数据,通常是 JSP、Thymeleaf 等模板,或者是 JSON、XML 等数据格式。
  • Controller:处理用户请求,调用相应的业务逻辑,将数据存储在 Model 中,并将请求转发给适当的视图。

2. Spring MVC 的优势

  • 轻量级:Spring MVC 是一个轻量级框架,不依赖于其他复杂的技术,易于学习和使用。
  • 松耦合:将业务逻辑、数据和视图分离,提高代码的可维护性和可扩展性。
  • 强大的配置选项:可以通过 XML 或 Java 代码进行配置,提供了高度的灵活性。
  • 支持多种视图技术:可以使用 JSP、Thymeleaf、Freemarker 等多种视图技术。

二、搭建 Spring MVC 项目

1. 配置依赖

使用 Maven 或 Gradle 引入 Spring MVC 依赖,以下是一个 Maven 项目的依赖配置示例:

<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.3.10</version></dependency><!-- 其他依赖,如 Servlet API 等 --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version><scope>provided</scope></dependency>
</dependencies>

2. 配置 Spring MVC 框架

2.1 基于 Java 的配置

可以使用 @Configuration 和 @EnableWebMvc 注解进行配置:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.view.InternalResourceViewResolver;@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {@Beanpublic ViewResolver viewResolver() {InternalResourceViewResolver resolver = new InternalResourceViewResolver();resolver.setPrefix("/WEB-INF/views/");resolver.setSuffix(".jsp");return resolver;}
}

2.2 基于 XML 的配置

使用 web.xml 和 spring-servlet.xml 进行配置:

web.xml

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"version="3.1"><servlet><servlet-name>spring</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/spring-servlet.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>spring</servlet-name><url-pattern>/</url-pattern></servlet-mapping>
</web-app>

spring-servlet.xml

<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsd"><context:component-scan base-package="com.example.controller"/><mvc:annotation-driven/><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/views/"/><property name="suffix" value=".jsp"/></bean>
</beans>

三、创建 Controller

1. 使用 @Controller 注解

使用 @Controller 注解标识控制器类,使用 @RequestMapping 注解处理请求。

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;@Controller
@RequestMapping("/hello")
public class HelloController {@RequestMapping("/greet")public String greet(@RequestParam(name = "name", required = false, defaultValue = "World") String name, Model model) {model.addAttribute("message", "Hello, " + name + "!");return "hello";}
}

2. 处理不同类型的请求

使用不同的请求方法注解,如 @GetMapping@PostMapping@PutMapping@DeleteMapping 等。

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;@Controller
@RequestMapping("/user")
public class UserController {@GetMapping("/login")public String loginForm() {return "login";}@PostMapping("/login")public ModelAndView login(@RequestParam String username, @RequestParam String password) {ModelAndView modelAndView = new ModelAndView();if ("admin".equals(username) && "password".equals(password)) {modelAndView.addObject("message", "Login successful");modelAndView.setViewName("success");} else {modelAndView.addObject("message", "Invalid credentials");modelAndView.setViewName("login");}return modelAndView;}
}

四、使用 Model 和 View

1. Model 的使用

使用 Model 或 ModelAndView 将数据传递给视图。

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;@Controller
@RequestMapping("/data")
public class DataController {@GetMapping("/show")public String showData(Model model) {model.addAttribute("data", "Some data to display");return "dataView";}
}

2. 视图解析器

视图解析器将逻辑视图名解析为实际的视图,例如将 hello 解析为 /WEB-INF/views/hello.jsp

五、数据绑定和验证

1. 数据绑定

Spring MVC 可以自动将请求参数绑定到方法参数或对象上。

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;@Controller
@RequestMapping("/form")
public class FormController {@GetMapping("/submit")public String showForm(Model model) {model.addAttribute("user", new User());return "form";}@PostMapping("/submit")public String submitForm(@ModelAttribute User user) {// 处理用户对象return "result";}
}

2. 数据验证

使用 @Valid 注解和 BindingResult 进行数据验证。

import javax.validation.Valid;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;@Controller
@RequestMapping("/form")
public class FormController {@GetMapping("/submit")public String showForm(Model model) {model.addAttribute("user", new User());return "form";}@PostMapping("/submit")public ModelAndView submitForm(@Valid @ModelAttribute User user, BindingResult result) {ModelAndView modelAndView = new ModelAndView();if (result.hasErrors()) {modelAndView.setViewName("form");} else {modelAndView.setViewName("result");}return modelAndView;}
}

六、异常处理

使用 @ExceptionHandler 注解处理异常。

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.servlet.ModelAndView;@Controller
public class ExceptionController {@GetMapping("/error")public String throwException() {throw new RuntimeException("Something went wrong");}@ExceptionHandler(RuntimeException.class)public ModelAndView handleException(RuntimeException ex) {ModelAndView modelAndView = new ModelAndView();modelAndView.addObject("error", ex.getMessage());modelAndView.setViewName("error");return modelAndView;}
}

七、总结与实践

Spring MVC 是一个功能强大的 Java Web 开发框架,它提供了丰富的功能和灵活的配置选项,帮助我们开发高质量的 Web 应用程序。通过使用控制器、模型和视图,我们可以处理各种 HTTP 请求,进行数据绑定和验证,并处理异常。

现在,你可以开始构建自己的 Spring MVC 项目啦 尝试创建一个简单的网站,包含表单提交、用户登录、数据展示等功能,你会更深入地理解 Spring MVC 的强大之处。如果你在开发过程中遇到任何问题,欢迎在评论区留言,让我们一起探索如何使用 Spring MVC 构建出色的 Web 应用程序,为我们的用户提供优质的 Web 服务。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/9708.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[论文总结] 深度学习在农业领域应用论文笔记14

当下&#xff0c;深度学习在农业领域的研究热度持续攀升&#xff0c;相关论文发表量呈现出迅猛增长的态势。但繁荣背后&#xff0c;质量却不尽人意。相当一部分论文内容空洞无物&#xff0c;缺乏能够落地转化的实际价值&#xff0c;“凑数” 的痕迹十分明显。在农业信息化领域的…

快速分析LabVIEW主要特征进行判断

在LabVIEW中&#xff0c;快速分析程序特征进行判断是提升开发效率和减少调试时间的重要技巧。本文将介绍如何高效地识别和分析程序的关键特征&#xff0c;从而帮助开发者在编写和优化程序时做出及时的判断&#xff0c;避免不必要的错误。 ​ 数据流和并行性分析 LabVIEW的图形…

展示统计信息收集情况

看看最近是否收集失败 SET LINES 200 PAGES 0 SET LONG 100000 longc 100000 COLUMN REPORT FORMAT A200VARIABLE stat_report CLOB; BEGIN:stat_report : DBMS_STATS.REPORT_STATS_OPERATIONS (since > SYSDATE-3 , until > SYSDATE , detail_lev…

STM32 TIM输入捕获 测量频率

输入捕获简介&#xff1a; IC&#xff08;Input Capture&#xff09;输入捕获 输入捕获模式下&#xff0c;当通道输入引脚出现指定电平跳变时&#xff0c;当前CNT的值将被锁存到CCR中&#xff0c;可用于测量PWM波形的频率、占空比、脉冲间隔、电平持续时间等参数 每个高级定时器…

如何将 Windows 上的文件传递到 Mac 上

文章目录 效果需求Windows 上设置共享磁盘【可选】新建一个带有密码的账户查看 Windows 的 IP 地址Mac 上链接 Windows 共享的磁盘 效果 需求 Windows 上有一个有密码的账户 Windows 上设置共享磁盘 windows 这边需要用 Administrator 权限的账号&#xff0c;把要共享的磁盘设…

NLP模型大对比:Transformer > RNN > n-gram

结论 Transformer 大于 RNN 大于 传统的n-gram n-gram VS Transformer 我们可以用一个 图书馆查询 的类比来解释它们的差异&#xff1a; 一、核心差异对比 维度n-gram 模型Transformer工作方式固定窗口的"近视观察员"全局关联的"侦探"依赖距离只能看前…

ODP(OBProxy)路由初探

OBProxy路由策略 Primary Zone 路由 官方声明默认情况&#xff0c;会将租户请求发送到租户的 primary zone 所在的机器上&#xff0c;通过 Primary Zone 路由可以尽量发往主副本&#xff0c;方便快速寻找 Leader 副本。另外&#xff0c;设置primary zone 也会在一定成都上减少…

Python NumPy(7):连接数组、分割数组、数组元素的添加与删除

1 连接数组 函数描述concatenate连接沿现有轴的数组序列stack沿着新的轴加入一系列数组。hstack水平堆叠序列中的数组&#xff08;列方向&#xff09;vstack竖直堆叠序列中的数组&#xff08;行方向&#xff09; 1.1 numpy.concatenate numpy.concatenate 函数用于沿指定轴连…

在线课堂小程序设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

生成模型:扩散模型(DDPM, DDIM, 条件生成)

扩散模型的理论较为复杂&#xff0c;论文公式与开源代码都难以理解。现有的教程大多侧重推导公式。为此&#xff0c;本文通过精简代码&#xff08;约300行&#xff09;&#xff0c;从代码运行角度讲解扩散模型。 本文包括扩散模型的3项技术复现&#xff1a; 1.DDPM (Denoising…

DeepSeek大模型技术解析:从架构到应用的全面探索

一、引言 在人工智能领域&#xff0c;大模型的发展日新月异&#xff0c;其中DeepSeek大模型凭借其卓越的性能和广泛的应用场景&#xff0c;迅速成为业界的焦点。本文旨在深入剖析DeepSeek大模型的技术细节&#xff0c;从架构到应用进行全面探索&#xff0c;以期为读者提供一个…

[权限提升] 常见提权的环境介绍

关注这个框架的其他相关笔记&#xff1a;[内网安全] 内网渗透 - 学习手册-CSDN博客 通过前期的渗透测试&#xff0c;我们大概率会拿到目标的一个 Shell&#xff0c;比如 WebShell 或者 MSF Shell 等等&#xff0c;不同的 Shell 对应提权的姿势也不同&#xff0c;比如有的 Shell…

SQL注入漏洞之高阶手法 宽字节注入以及编码解释 以及堆叠注入原理说明

目录 宽字节注入 编码区分 原理 函数 转译符号解释 注意 绕过方式详解 堆叠【Stack】注入攻击 注入语句 宽字节注入 在说宽字节注入之前 我们需要知道编码相关的知识点&#xff0c;这个有助于搞定什么是宽字节注入 分清楚是ascii码是什么宽字节注入代码里面加入了adds…

Spring Boot - 数据库集成05 - 集成MongoDB

Spring Boot集成MongoDB 文章目录 Spring Boot集成MongoDB一&#xff1a;使用前的准备1&#xff1a;依赖导入 & 配置2&#xff1a;实体类创建 二&#xff1a;核心 - MongoRepository三&#xff1a;核心 - MongoTemplate1&#xff1a;集合操作2&#xff1a;文档操作(重点)3&…

用 Scoop 优雅管理 Windows 软件:安装、配置与使用全指南

本篇将主要讲讲如何用「Scoop」优雅管理 Windows 软件&#xff1a;安装、配置与使用全指南 一、Scoop 是什么&#xff1f; Scoop 是一款专为 Windows 设计的命令行软件包管理工具&#xff0c;它能让你像 Linux 系统一样通过命令快速安装、更新和卸载软件。其核心优势包括&…

基于SpringBoot的假期周边游平台的设计与实现(源码+SQL脚本+LW+部署讲解等)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

JavaScript - Web APIs(下)

日期对象 目标&#xff1a;掌握日期对象&#xff0c;可以让网页显示日期 日期对象&#xff1a;用来表示时间的对象 作用&#xff1a;可以得到当前系统时间 学习路径&#xff1a; 实例化 日期对象方法 时间戳 实例化 目标&#xff1a;能够实例化日期对象 在代码中发…

复古壁纸中棕色系和米色系哪个更受欢迎?

根据最新的搜索结果&#xff0c;我们可以看到棕色系和米色系在复古壁纸设计中都非常受欢迎。以下是对这两种颜色系受欢迎程度的分析&#xff1a; 棕色系 受欢迎程度&#xff1a;棕色系在复古壁纸中非常受欢迎&#xff0c;因为它能够营造出温暖、质朴和自然的氛围。棕色系的壁纸…

Windows11无法打开Windows安全中心主界面

​# 问题描述 安全中心无法打卡主界面&#xff0c;并弹出“需要使用新应用以打开此windowsdefender连接”. 解决方法 以管理员权限打开PowerShell&#xff0c;推荐使用快捷键win x打开快捷界面&#xff0c;选择Windows终端&#xff08;管理员&#xff09;&#xff0c;并在终…

【Valgrind】安装报错: 报错有未满足的依赖关系: libc6,libc6-dbg

Valgrind 内存泄漏检测工具安装 安装 sudo apt install valgrind官方上也是如此 但是在我的系统&#xff08;debian12)上却失败了&#xff1a; 报错有未满足的依赖关系&#xff1a; libc6 : 破坏: valgrind (< 1:3.19.0-1~) 但是 1:3.16.1-1 正要被安装 libc6-dbg : 依赖…