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.mzph.cn/diannao/68565.shtml

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

相关文章

decison tree 决策树

熵 信息增益 信息增益描述的是在分叉过程中获得的熵减&#xff0c;信息增益即熵减。 熵减可以用来决定什么时候停止分叉&#xff0c;当熵减很小的时候你只是在不必要的增加树的深度&#xff0c;并且冒着过拟合的风险 决策树训练(构建)过程 离散值特征处理&#xff1a;One-Hot…

研发的立足之本到底是啥?

0 你的问题&#xff0c;我知道&#xff01; 本文深入T型图“竖线”的立足之本&#xff1a;专业技术 技术赋能业务能力。研发在学习投入精力最多&#xff0c;也误区最多。 某粉丝感发展遇到瓶颈&#xff0c;项目都会做&#xff0c;但觉无提升&#xff0c;想跳槽。于是&#x…

WPF基础 | 深入 WPF 事件机制:路由事件与自定义事件处理

WPF基础 | 深入 WPF 事件机制&#xff1a;路由事件与自定义事件处理 一、前言二、WPF 事件基础概念2.1 事件的定义与本质2.2 常见的 WPF 事件类型 三、路由事件3.1 路由事件的概念与原理3.2 路由事件的三个阶段3.3 路由事件的标识与注册3.4 常见的路由事件示例 四、自定义事件处…

DeepSeekMoE:迈向混合专家语言模型的终极专业化

一、结论写在前面 论文提出了MoE语言模型的DeepSeekMoE架构&#xff0c;目的是实现终极的专家专业化(expert specialization)。通过细粒度的专家分割和共享专家隔离&#xff0c;DeepSeekMoE相比主流的MoE架构实现了显著更高的专家专业化和性能。从较小的2B参数规模开始&#x…

机器人抓取与操作经典规划算法(深蓝)——2

1 经典规划算法 位姿估计&#xff1a;&#xff08;1&#xff09;相机系位姿 &#xff08;2&#xff09;机器人系位姿 抓取位姿&#xff1a;&#xff08;1&#xff09;抓取位姿计算 &#xff08;2&#xff09;抓取评估和优化 路径规划&#xff1a;&#xff08;1&#xff09;笛卡…

【Qt】06-对话框

对话框 前言一、模态和非模态对话框1.1 概念1.2 模态对话框1.2.1 代码QAction类 1.2.2 模态对话框运行分析 1.3 非模态对话框1.3.1 代码局部变量和成员变量setAttribute 类 1.3.2 现象解释 二、标准对话框2.1 提示对话框 QMessageBox2.1.1 现象及解释 2.2 问题对话框2.2.1 现象…

< OS 有关 > Android 手机 SSH 客户端 app: connectBot

connectBot 开源且功能齐全的SSH客户端,界面简洁,支持证书密钥。 下载量超 500万 方便在 Android 手机上&#xff0c;连接 SSH 服务器&#xff0c;去运行命令。 Fail2ban 12小时内抓获的 IP ~ ~ ~ ~ rootjpn:~# sudo fail2ban-client status sshd Status for the jail: sshd …

是否需要显式使用 epoll_ctl ( fd , EPOLL_CTL_DEL , ... ) 来从红黑树里显式删除过期的套接字

&#xff08;1&#xff09;关于 epoll 操作的三大系统函数&#xff1a; epoll_create ( … ) 、 epoll_ctl ( … ) 、 epoll_wait&#xff08;…&#xff09;。具体的函数原型略。这些函数完成了 epoll 对象的创建、 套接字往 epoll 红黑树中的添加、修改 与 删除 。 本文的整理…

【Hadoop】Hadoop 概述

Hadoop 概述 Hadoop 是什么Hadoop 发展历史Hadoop 三大发行版本Hadoop 优势&#xff08;4 高&#xff09;Hadoop 组成&#xff08;面试重点&#xff09;HDFS 架构概述YARN 架构概述MapReduce 架构概述HDFS、YARN、MapReduce 三者关系 大数据技术生态体系 Hadoop 是什么 Hadoop…

网络爬虫学习:应用selenium获取Edge浏览器版本号,自动下载对应版本msedgedriver,确保Edge浏览器顺利打开。

一、前言 我从24年11月份开始学习网络爬虫应用开发&#xff0c;经过2个来月的努力&#xff0c;于1月下旬完成了开发一款网络爬虫软件的学习目标。这里对本次学习及应用开发进行一下回顾总结。 前几天我已经发了一篇日志&#xff08;网络爬虫学习&#xff1a;应用selenium从搜…

week08_文本匹配任务

1、文本匹配任务概述 狭义&#xff1a; 给定一组文本&#xff0c;判断其是否语义相似 今天天气不错 match 今儿个天不错呀 √ 今天天气不错 match 你的代码有bug 以分值形式给出相似度 今天天气不错 match 今儿个天不错呀 0.9 今天天气不错 match…

Kafka 副本机制(包含AR、ISR、OSR、HW 和 LEO 介绍)

文章目录 Kafka 副本机制&#xff08;包含AR、ISR、OSR、HW 和 LEO 介绍&#xff09;1. 副本的基本概念2. 副本同步和一致性2.1 AR&#xff08;Assigned Replicas&#xff09;2.2 ISR&#xff08;In-Sync Replicas&#xff09;2.3 OSR&#xff08;Out-of-Sync Replicas&#xf…

【JavaEE】_MVC架构与三层架构

目录 1. MVC架构 2. 三层架构 3. MVC架构与三层架构的对比 3.1 MVC与三层架构的对比 3.2 MVC与三层架构的共性 1. MVC架构 在前文已介绍关于SpringMAC的设计模式&#xff0c;详见下文&#xff1a; 【JavaEE】_Spring Web MVC简介-CSDN博客文章浏览阅读967次&#xff0c;点…

【Matlab高端绘图SCI绘图模板】第006期 对比绘柱状图 (只需替换数据)

1. 简介 柱状图作为科研论文中常用的实验结果对比图&#xff0c;本文采用了3组实验对比的效果展示图&#xff0c;代码已调试好&#xff0c;只需替换数据即可生成相关柱状图&#xff0c;为科研加分。通过获得Nature配色的柱状图&#xff0c;让你的论文看起来档次更高&#xff0…

【QT】 控件 -- 显示类

&#x1f525; 目录 [TOC]( &#x1f525; 目录) 1. 前言 2. 显示类控件2.1 Label 1、显示不同文本2、显示图片3、文本对齐、自动换行、缩进、边距4、设置伙伴 3.2 LCD Number 3.3 ProgressBar 3.4 Calendar Widget 3. 共勉 &#x1f525; 1. 前言 之前我在上一篇文章【QT】…

前端-Rollup

Rollup 是一个用于 JavaScript 的模块打包工具&#xff0c;它将小的代码片段编译成更大、更复杂的代码&#xff0c;例如库或应用程序。它使用 JavaScript 的 ES6 版本中包含的新标准化代码模块格式&#xff0c;而不是以前的 CommonJS 和 AMD 等特殊解决方案。ES 模块允许你自由…

网络直播时代的营销新策略:基于受众分析与开源AI智能名片2+1链动模式S2B2C商城小程序源码的探索

摘要&#xff1a;随着互联网技术的飞速发展&#xff0c;网络直播作为一种新兴的、极具影响力的媒体形式&#xff0c;正逐渐改变着人们的娱乐方式、消费习惯乃至社交模式。据中国互联网络信息中心数据显示&#xff0c;网络直播用户规模已达到3.25亿&#xff0c;占网民总数的45.8…

STM32调试手段:重定向printf串口

引言 C语言中经常使用printf来输出调试信息&#xff0c;打印到屏幕。由于在单片机中没有屏幕&#xff0c;但是我们可以重定向printf&#xff0c;把数据打印到串口&#xff0c;从而在电脑端接收调试信息。这是除了debug外&#xff0c;另外一个非常有效的调试手段。 一、什么是pr…

利用飞书机器人进行 - ArXiv自动化检索推荐

相关作者的Github仓库 ArXivToday-Lark 使用教程 Step1 新建机器人 根据飞书官方机器人使用手册&#xff0c;新建自定义机器人&#xff0c;并记录好webhook地址&#xff0c;后续将在配置文件中更新该地址。 可以先完成到后续步骤之前&#xff0c;后续的步骤与安全相关&…

混合专家模型MoE的全面详解

什么是混合专家&#xff08;MoE&#xff09;&#xff1f; 混合专家&#xff08;MoE&#xff09;是一种利用多个不同的子模型&#xff08;或称为“专家”&#xff09;来提升LLM质量的技术。 MoE的两个主要组成部分是&#xff1a; 专家&#xff1a;每个前馈神经网络&#xff08…