[Java优选系列第2弹]SpringMVC入门教程:从零开始搭建一个Web应用程序

想和你们分享我眼里的代码世界🗺️  优选系列持续更新中💫

一直在等你,你终于来啦💖

                           绿色代表解释说明                黄色代表重点                红色代表精髓

        SpringMVC是一个基于Java的Web框架,它使用了MVC(模型-视图-控制器)的设计模式,将Web应用程序分为三个层次:模型层负责封装业务逻辑和数据,视图层负责展示用户界面,控制器层负责处理用户请求和调用模型层和视图层。

        本文将详细介绍如何使用SpringMVC来开发一个简单而优雅的Web应用程序。我们将从创建一个Maven项目开始,然后配置SpringMVC所需的依赖和文件,接着编写控制器类和视图页面,最后运行我们的应用程序。通过本文,你将能够快速入门和掌握SpringMVC的核心概念和功能。


目录

一、Maven简介及安装

二、 SpringMVC的基本使用

(一)SpringMVC简介

(二)SpringMVC项目的基础搭建

1.引入坐标

2.编写一个初始化类

3.编写配置类,SpringConfig.java

4.编写配置类,WebConfig.java

5.编写Controller类

三、SpringMVC框架提供的高效功能

(一)请求参数及其属性

(二)bean对象自动生成get、set、构造器

(三)数据校验

(四)异常处理

(五)拦截器

1️⃣常用注解大全

2️⃣常用配置文件方法大全

3️⃣常用坐标配置大全


一、Maven简介及安装

        maven是用于管理项目所依赖的jar包。以前我们用到别人开发的jar包,需要自己去找jar包,并且手动导入到项目中。通过Maven,我们只需要在Web项目中的pom.xml文件中导入坐标(告诉Maven这个包在哪),就会自动导入jar包。使用maven的jar包时,maven先中本地仓库中去查找,如果找不到,再去中央仓库中去查找。

        坐标格式如下:

<dependency><groupId>commons-dbutils</groupId><artifactId>commons-dbutils</artifactId><version>1.7</version>
</dependency>

        maven配置和安装非本文重点,可以参考这个博客:史上最全安装Maven教程_mvnw 按照_小Du猿的博客-CSDN博客

二、 SpringMVC的基本使用

(一)SpringMVC简介

        SpringMVC是一个表现层(Servlet层)框架,主要用于处理前端发来的请求。它代替了第1弹中([Java优选系列第1弹]如何优化Java三层架构开发效率?三个实用技巧分享_高垚淼的博客-CSDN博客),我们所说的使用单纯Servlet来进行开发的模型,极大的提高了开发效率。

       使用SpringMVC有以下几个优点:

        🔸它与Spring框架完美集成,可以利用Spring的依赖注入、事务管理、安全等特性。

        🔸它支持多种视图技术,如JSP、Thymeleaf、Freemarker等,可以灵活地选择适合的视图渲染方式。

        🔸它提供了丰富的注解和接口,可以方便地实现请求映射、参数绑定、数据校验、异常处理等功能。

        🔸它采用前端控制器模式,通过一个DispatcherServlet来统一处理所有的HTTP请求,并将它们分发给相应的处理器,从而简化了Web开发流程。(将在第三弹专门发布一篇文章,解析SpringMVC的底层实现机制

        在实际开发中,使用注解进行SpringMVC项目的创建更广泛,因此,本文基于注解开发的方式进行讲解,基于xml方式不进行赘述。

(二)SpringMVC项目的基础搭建

1.引入坐标

打开pom.xml文件,并添加以下语句,引入构建SpringMVC项目的jar包。

		<dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.3.24</version></dependency>

2.编写一个初始化类

        单独新建一个类,继承AbstractAnnotationConfigDispatcherServletInitializer类并实现其三个默认方法。

public class WebInit extends AbstractAnnotationConfigDispatcherServletInitializer {/*** 配置spring的配置类* @return*/@Overrideprotected Class<?>[] getRootConfigClasses() {return new Class[]{SpringConfig.class};}/*** 配置一个springmvc的配置类* @return*/@Overrideprotected Class<?>[] getServletConfigClasses() {return new Class[]{WebConfig.class};}/*** 配置一个路径,告诉tomcat哪些请求要交给springmvc来处理* /  所有的请求都交给springmvc处理* @return*/@Overrideprotected String[] getServletMappings() {return new String[]{"/"};}
}

3.编写配置类,SpringConfig.java

创建一个config包,在包中编写配置类,SpringConfig.java(名字可以随便取)。

//@Configuration标识这是一个配置类
@Configuration
public class SpringConfig {
}

4.编写配置类,WebConfig.java

在config包中编写配置类,WebConfig.java。

//@Configuration标识这是一个配置类
@Configuration
//配置一个要扫描的包
@ComponentScan("com.woniu.springmvc")
public class WebConfig {
}

5.编写Controller类

创建一个controller包,编写处理请求的Controller类。

//这是一个控制器类,用于处理前端发来的请求
@Controller
public class HelloController {//把返回的内容直接返回给浏览器(默认情况下,会去找相应的文件)@ResponseBody//指定处理哪个路径的请求@RequestMapping("/test")public String test(){System.out.println("请求来了");return "woniu蜗牛";}}

        这样我们就完成了一个最基本的SpringMVC项目的创建,只需要在 Controller类中编写接收请求的各种方法即可。

三、SpringMVC框架提供的高效功能

(一)请求参数及其属性

@RequestParam注解标识获取前端传过来的参数

@ResponseBody注解标识直接返回数据的内容给前端(不加,默认是返回网页资源)

@ResponseBody
@RequestMapping("/test")
public String test(//@RequestParam指定要获取哪一个参数//value/name指定参数名称//required是否为必须传的参数,默认是true//defaultValue在没传参数的情况下,指定一个默认值。@RequestParam(value = "name",required = false) String name,@RequestParam(value = "age",required = false,defaultValue = "100") Integer age){System.out.println(name+":"+age);return "woniu蜗牛";
}//大多数情况下
@ResponseBody
@RequestMapping("/test1")
public String test1(String name,Integer age){//简写,要求形参名必须和参数名一样System.out.println(name);System.out.println(age);return "test1";
}

(二)bean对象自动生成get、set、构造器

  • 导入坐标,lombok

	<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.26</version></dependency>

  • 给bean对象加上注释@get、@set、@ToString、@NoArgsConsturctor(以上可以用@Data替换)、@AllArgsConsturctor

(三)数据校验

  • 引入坐标
  • 在验证的实体类的属性上,标注相应注解如@min(value = 10)
  • 在方法的参数中为要验证的实体类,标注相应注解@valid

  • 获取错误消息,添加参数BindingResault,这个参数必须放在验证类参数的后面一个

  •  可以自定义错误信息,在注解中写  

(四)异常处理

  • 加上注解@EsceptionHandler,处理当前类。出异常会自动运行

 

  • 全局异常处理:单独创建一个处理异常类并加上@RestControlleAdvice注解标识,放入同一个异常处理方法(别忘记注解)

  • 全局异常和局部异常处理,依旧遵循就近原则

(五)拦截器

  • 编写拦截器类实现HandlerInterceptor接口,并实现其中的三个方法 

        PreHandle() 返回true才会继续执行postHandl()和afterCompletion();postHandl()执行完才会继续执行afterCompletion()。可以用于进行登录检查、权限验证等操作

        PostHandl() 可以给请求绑定数据。可以用于对模型数据或视图进行处理或修改。该方法的参数modelAndView是一个模型和视图对象,包含了控制器方法返回的数据和视图名称。 

        afterCompletion() ,可以接收异常。用于进行一些资源清理、性能监控等操作。该方法的参数ex是一个异常对象,表示控制器方法或视图渲染过程中抛出的异常,如果没有异常,则为null。

  • 在配置类中,添加拦截器

附录:

1️⃣常用注解大全

  1. @AllArgsConstructor 标识bean对象生成全参构造器
  2. @NoArgsConstructor 标识bean对象生成无参构造器
  3. @Configuration 标识是配置类
  4. @Controller 标识是控制层
  5. @ComponentScan("全类名") 标识作用的控制层
  6. @Data 标识bean对象自动生成get、set、toStirng、无参构造器方法(注意:如果@Data和@AllArgsConstructor一起使用,无参构造器会被覆盖,需要手动再创建一次@NoArgsConstructor)
  7. @ExceptionHandler 用于处理控制器中发生的异常,可以指定异常类型和返回值
  8. @RestControllerAdvice 标识该类中的异常方法作用于全局(类似于RestController,等价于@ResponseBody+ControllerAdvice)
  9. @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") 标识自动转成指定格式(注意,前端的格式需要与此对应,可用value-format)
  10. @ModelAttribute 用于绑定请求参数到模型属性上,可以在方法或参数上使用
  11. @PathVariable 标识将(形如:/xx/1 )请求中的参数绑定到方法参数上
  12. @RequestBody 标识将接收的Json字符串转为Java对象
  13. @RequestMapping(value = "路径" , Method = RequestMethod.post) 标识访问的url路径(使用@getMapping、@postMapping代替)
  14. @ResponseBody 标识将该变量直接返回给页面
  15. @RestController 作用等于@ResponseBody+@Controller
  16. @RequestParam 标识将(形如:/xx?name=1 )请求中的参数绑定到方法参数上(如果请求参数和方法参数相同,可以省略)
  17. @SessionAttributes(value = "xx") 标识存储数据到Map(Request请求域)中时,同时放入到Session域中

2️⃣常用配置文件方法大全

  1. 打开页面网页资源的访问权限
@Overrideprotected void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {configurer.enable();}

     2.添加自定义格式化器和转换器

protected void addFormatters(FormatterRegistry registry) {super.addFormatters(registry);registry.addConverter(new DateConverter());}

    3. 后端中,将对象转为Json字符串。用于扩展或修改已有的消息转换器列表

protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {//添加一个消息转换器,可以把对象自动转换成jsonconverters.add(new MappingJackson2HttpMessageConverter());}

(这里想和大家分享的是,前端使用Axios发送携带对象的请求,会自动转为Json字符串发送;接收携带Json字符串的相应,会自动转为对象。这真的很好用,都不用转来转去了) 

3️⃣常用坐标配置大全

   1.使用SpringMVC框架

<dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.3.24</version></dependency>

   2.后端对象转为Json字符串

<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.14.1</version>
</dependency>

    3.Bean对象生成set、get等方法

	<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.26</version></dependency>

   4.处理LocalDateTime

	<dependency><groupId>com.fasterxml.jackson.datatype</groupId><artifactId>jackson-datatype-jsr310</artifactId><version>2.14.2</version></dependency>

   5.数据校验

		<dependency><groupId>org.hibernate.validator</groupId><artifactId>hibernate-validator</artifactId><version>6.2.5.Final</version></dependency>

   6.文件上传

		<dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.3.3</version></dependency>

                                以上就是本文的全部内容啦,确定不来个点赞👍和收藏💖嘛~ 

 

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

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

相关文章

Linux 消息队列的创建与使用

消息队列的创建与使用 进程a发送一条消息&#xff0c;进程b读取消息。 a.c代码&#xff1a; b.c代码&#xff1a; 1.a进程创建向消息队列&#xff0c;并向消息队列中发送消息 运行a程序之前&#xff0c;当前系统中消息队列的数量为0&#xff1a; 运行一次a程序&#xff0c;消…

5、flink任务中可以使用哪些转换算子(Transformation)

1、什么是Flink中的转换算子 在使用 Flink DataStream API 开发流式计算任务时&#xff0c;可以将一个或多个 DataStream 转换成新的 DataStream&#xff0c;在应用程序中可以将多个数据转换算子合并成一个复杂的数据流拓扑图。 2、常用的转换算子 Flink提供了功能各异的转换算…

53.Linux day03 文件查看命令,vi/vim常用命令

今天进行了新的学习。 目录 1.cat a.查看单个文件的内容&#xff1a; b.查看多个文件的内容&#xff1a; c.将多个文件的内容连接并输出到一个新文件&#xff1a; d.显示带有行号的文件内容&#xff1a; 2.more 3.less 4.head 5.tail 6.命令模式 7.插入模式 8.图…

H3C交换机如何配置本地端口镜像并在PC上使用Wireshake抓包

环境: H3C S6520-26Q-SI version 7.1.070, Release 6326 Win 10 专业版 Wireshake Version 4.0.3 问题描述: H3C交换机如何配置本地端口镜像并在PC上使用Wireshake抓包 解决方案: 配置交换机本地端口镜像 1.进入系统视图,并创建本地镜像组1 <H3C>system-vie…

Python项目实战:基于napari的3D可视化(点云+slice)

文章目录 一、napari 简介二、napari 安装与更新三、napari【巨巨巨大的一个BUG】四、napari 使用指南4.1、菜单栏&#xff08;File View Plugins Window Help&#xff09;4.2、Window&#xff1a;layer list&#xff08;参数详解&#xff09;4.3、Window&#xff1a;layer…

Linux学习之Telnet明文漏洞

yum install telnet telnet-server xinetd -y安装软件。 systemctl start xinetd.service开启xinetd&#xff0c;systemctl start telnet.socket开启telnet。 xinetd来监控端口&#xff0c;然后把数据传给telnet。 ifconfig eth0看一下eth0网卡信息&#xff0c;。 iptable…

Linux Mint 21.3 计划于 2023 年圣诞节发布

Linux Mint 项目近日公布了基于 Ubuntu 的 Linux Mint 发行版下一个重要版本的一些初步细节&#xff0c;以及备受期待的基于 Debian 的 LMDE 6&#xff08;Linux Mint Debian Edition&#xff09;版本。 近日&#xff0c;Linux Mint 项目负责人克莱门特-勒菲弗&#xff08;Clem…

万字长文·通俗易懂·一篇包掌握——输入/输出·文件操作(c语言超详细系列)(二)

前言&#xff1a;Hello&#xff0c;大家好&#x1f618;&#xff0c;我是心跳sy&#xff0c;上一节我们主要学习了格式化输入输出的基本内容&#xff0c;这一节我们对格式化进行更加深入的了解&#xff0c;对文件概念进行介绍&#xff0c;并且对输入、输出与文件读写的基本概念…

基于 KubeSphere 的应用容器化在智能网联汽车领域的实践

公司简介 某国家级智能网联汽车研究中心成立于 2018 年&#xff0c;是担当产业发展咨询与建议、共性技术研发中心、创新成果转化的国家级创新平台&#xff0c;旨在提高我国在智能网联汽车及相关产业在全球价值链中的地位。 目前着力建设基于大数据与云计算的智能汽车云端运营…

[bug] 记录version `GLIBCXX_3.4.29‘ not found 解决方法

在使用mediapipe 这个库的时候&#xff0c;首次使用出现 GLIBCXX_3.4.29’ not found 错误&#xff0c; 看起来是安装mediapipe 的时候自动升级了 matplotlib 这个库&#xff0c;导致依赖的 libstd.so 版本不满足了&#xff0c;GLIBCXX_3.4.29 is an object from libstdc.so.…

Debian10: 安装nut服务器(UPS)

UPS说明&#xff1a; UPS的作用就不必讲了&#xff0c;我选择是SANTAKTGBOX-850&#xff0c;规格为 850VA/510W&#xff0c;可以满足所需&#xff0c;关键是Debian10自带了驱动可以支持&#xff0c;免去安装驱动&#xff0c;将UPS通过USB线连接服务器即可&#xff0c;如下图所示…

【数理知识】向量与基的内积,Matlab 代码验证

序号内容1【数理知识】向量的坐标基表示法&#xff0c;Matlab 代码验证2【数理知识】向量与基的内积&#xff0c;Matlab 代码验证 文章目录 1. 向量与基的内积2. 二维平面向量举例3. 代码验证Ref 1. 向量与基的内积 假设存在一个二维平面内的向量 a ⃗ \vec{a} a &#xff0c…

QT TLS initialization failed问题(已解决) QT基础入门【网络编程】openssl

问题: qt.network.ssl: QSslSocket::connectToHostEncrypted: TLS initialization failed 这个问题的出现主要是使用了https请求:HTTPS ≈ HTTP + SSL,即有了加密层的HTTP 所以Qt 组件库需要OpenSSL dll 文件支持HTTPS 解决: 1.加入以下两行代码获取QT是否支持opensll以…

【学习FreeRTOS】第8章——FreeRTOS列表和列表项

1.列表和列表项的简介 列表是 FreeRTOS 中的一个数据结构&#xff0c;概念上和链表有点类似&#xff0c;列表被用来跟踪 FreeRTOS中的任务。列表项就是存放在列表中的项目。 列表相当于链表&#xff0c;列表项相当于节点&#xff0c;FreeRTOS 中的列表是一个双向环形链表列表的…

@Repeatable的作用以及具体如何使用

文章目录 1. 前言2. 先说结论3. 案例演示 1. 前言 最近无意看到某些注解上有Repeatable&#xff0c;出于比较好奇&#xff0c;因此稍微研究并写下此文章。 2. 先说结论 Repeatable的作用&#xff1a;使被他注释的注解可以在同一个地方重复使用。 具体使用如下&#xff1a; T…

.netcore grpc客户端工厂及依赖注入使用

一、客户端工厂概述 gRPC 与 HttpClientFactory 的集成提供了一种创建 gRPC 客户端的集中方式。可以通过依赖包Grpc.Net.ClientFactory中的AddGrpcClient进行gRPC客户端依赖注入AddGrpcClient函数提供了许多配置项用于处理一些其他事项&#xff1b;例如AOP、重试策略等 二、案…

【100天精通python】Day41:python网络爬虫开发_爬虫基础入门

目录 专栏导读 1网络爬虫概述 1.1 工作原理 1.2 应用场景 1.3 爬虫策略 1.4 爬虫的挑战 2 网络爬虫开发 2.1 通用的网络爬虫基本流程 2.2 网络爬虫的常用技术 2.3 网络爬虫常用的第三方库 3 简单爬虫示例 专栏导读 专栏订阅地址&#xff1a;https://blog.csdn.net/…

Databend 开源周报第 106 期

Databend 是一款现代云数仓。专为弹性和高效设计&#xff0c;为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务&#xff1a;https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。 数据脱敏 Data…

APSIM模型参数优化 批量模拟丨气象数据准备、物候发育和光合生产、物质分配与产量模拟、土壤水分平衡算法、土壤碳氮平衡模块、农田管理模块等

随着数字农业和智慧农业的发展&#xff0c;基于过程的农业生产系统模型在模拟作物对气候变化的响应与适应、农田管理优化、作物品种和株型筛选、农田固碳和温室气体排放等领域扮演着越来越重要的作用。APSIM (Agricultural Production Systems sIMulator)模型是世界知名的作物生…

nginx php-fpm安装配置

nginx php-fpm安装配置 nginx本身不能处理PHP&#xff0c;它只是个web服务器&#xff0c;当接收到请求后&#xff0c;如果是php请求&#xff0c;则发给php解释器处理&#xff0c;并把结果返回给客户端。 nginx一般是把请求发fastcgi管理进程处理&#xff0c;fascgi管理进程选…