[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.mzph.cn/news/43904.shtml

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

相关文章

AI问答:JSBridge / WebView 与 Native 通信

一、理解JSBridge JSBridge是一种连接JavaScript和Native代码的桥梁&#xff0c;它提供了一种方法&#xff0c;使得JavaScript可以直接调用Native的代码&#xff0c;同时使得Native的代码也能直接调用JavaScript的方法&#xff0c;从而实现了JavaScript和Native之间的相互调用和…

LeetCode——二叉树篇(四)

刷题顺序及思路来源于代码随想录&#xff0c;网站地址&#xff1a;https://programmercarl.com 二叉树的定义及创建见&#xff1a; LeetCode ACM模式——二叉树篇&#xff08;一&#xff09;_要向着光的博客-CSDN博客 目录 101. 对称二叉树 递归 使用队列 100. 相同的树 …

无涯教程-Perl - setnetent函数

描述 该函数应在第一次调用getnetent之前调用。 STAYOPEN参数是可选的,在大多数系统上未使用。当getnetent()从网络数据库的下一行检索信息时,setnetent会将枚举设置(或重置)为主机条目集的开头。 语法 以下是此函数的简单语法- setnetent STAYOPEN返回值 此函数不返回任何…

如何使用Redis实现附近商家查询

导读 在日常生活中&#xff0c;我们经常能看见查询附近商家的功能。 常见的场景有&#xff0c;比如你在点外卖的时候&#xff0c;就可能需要按照距离查询附近几百米或者几公里的商家。 本文将介绍如何使用Redis实现按照距离查询附近商户的功能&#xff0c;并以SpringBoot项目…

H13-922题库 HCIP-GaussDB-OLAP V1.5

**H13-922 V1.5 GaussDB(DWS) OLAP题库 华为认证GaussDB OLAP数据库高级工程师HCIP-GaussDB-OLAP V1.0自2019年10月18日起&#xff0c;正式在中国区发布。当前版本V1.5 考试前提&#xff1a; 掌握基本的数据库基础知识、掌握数据仓库运维的基础知识、掌握基本Linux运维知识、…

Git命令详解

1 常用命令 1&#xff09;初始化本地仓库 git init <directory> 是可选的&#xff0c;如果不指定&#xff0c;将使用当前目录。 2&#xff09;克隆一个远程仓库 git clone <url> 3&#xff09;添加文件到暂存区 git add <file> 要添加当前目录中的所…

【Java】2021 RoboCom 机器人开发者大赛-高职组(初赛)题解

7-1 机器人打招呼 机器人小白要来 RoboCom 参赛了&#xff0c;在赛场中遇到人要打个招呼。请你帮它设置好打招呼的这句话&#xff1a;“ni ye lai can jia RoboCom a?”。 输入格式&#xff1a; 本题没有输入。 输出格式&#xff1a; 在一行中输出 ni ye lai can jia Robo…

手把手教你制作印刷包装小程序商城

印刷包装行业越来越受到人们的重视&#xff0c;为了更好地满足消费者的需求&#xff0c;搭建一个专属的小程序商城是一种不错的选择。那么&#xff0c;接下来就让我们一起来学习如何搭建印刷包装小程序商城吧&#xff01; 第一步&#xff1a;登录【乔拓云】网后台&#xff0c;进…

Docker环境安装elasticsearch和kibana

一、安装elasticsearch 创建es-network&#xff0c;让es、kibana在同一个网段&#xff1a; docker network create --driverbridge --subnet192.168.1.10/24 es-network运行elasticsearch docker run -d \ --name elasticsearch \ # 容器名 --hostname elasticsearch # 主机…

iOS开发 - Swift Codable协议实战:快速、简单、高效地完成JSON和Model转换!

前言 Codable 是 Swift 4.0 引入的一种协议&#xff0c;它是一个组合协议&#xff0c;由 Decodable 和 Encodable 两个协议组成。它的作用是将模型对象转换为 JSON 或者是其它的数据格式&#xff0c;也可以反过来将 JSON 数据转换为模型对象。 Encodable 和 Decodable 分别定…

web实现酷炫的canvas粒子动画背景

文章目录 前言一、particle-bg1. git地址&#xff1a;2. 安装3. 使用4. 完整demo 二、tsParticles1. 源码地址&#xff1a;2. 安装3. 引入4. 使用5. 几个例子5.1 ts粒子五彩纸屑烟花5.2 多粒子产卵器-用tsParticles制作5.3 ts粒子鼠标吸引力5.4 粒子烟花 源码地址完结 前言 粒…

【运筹优化】运输问题建模 + Java调用Cplex求解

文章目录 一、问题描述二、思路分析三、建模方案四、Java调用Cplex代码五、输出结果 一、问题描述 运输问题(transportation problem&#xff09;一般是研究把某种商品从若干个产地运至若干个销地而使总运费最小的一类问题。 本博客将根据下面的例题&#xff0c;介绍运输问题…

STM32F407使用Helix库软解MP3并通过DAC输出,最精简的STM32+SD卡实现MP3播放器

只用STM32单片机SD卡耳机插座&#xff0c;实现播放MP3播放器&#xff01; 看过很多STM32软解MP3的方案&#xff0c;即不通过类似VS1053之类的解码器芯片&#xff0c;直接用STM32和软件库解码MP3文件&#xff0c;通常使用了labmad或者Helix解码库实现&#xff0c;Helix相对labm…

WebRTC音视频通话-WebRTC视频自定义RTCVideoCapturer相机

WebRTC音视频通话-WebRTC视频自定义RTCVideoCapturer相机 在之前已经实现了WebRTC调用ossrs服务&#xff0c;实现直播视频通话功能。但是在使用过程中&#xff0c;RTCCameraVideoCapturer类提供的方法不能修改及调节相机的灯光等设置&#xff0c;那就需要自定义RTCVideoCaptur…

到江西赣州ibm维修服务器之旅-联想X3850 x6黄灯故障

2023年08月15日&#xff0c;一位江西赣州工厂客户通过朋友介绍与冠峰售前工程师取得联系&#xff0c;双方对产品故障前后原因沟通的大致情况如下&#xff1a; 服务器型号&#xff1a;Lenovo system x3850 x6 为用户公司erp仓库服务器 服务器故障&#xff1a;正常使用过程中业…

<数据结构与算法>二叉树堆的实现

目录 前言 一、树的概念及结构 1 树的概念 2 树的相关概念 二、二叉树的概念及结构 1.二叉树的概念 2. 特殊的二叉树 3. 二叉树的性质 4.二叉树的存储结构 三、二叉树的顺序结构及实现 1.堆的性质 2.堆的插入 3.堆的实现 堆的结构体 HeapInit 初始化 HeapPush 插入 HeapPop 删…

【C++进阶】继承、多态的详解(多态篇)

【C进阶】继承、多态的详解&#xff08;多态篇&#xff09; 目录 【C进阶】继承、多态的详解&#xff08;多态篇&#xff09;多态的概念多态的定义及实现多态的构成条件&#xff08;重点&#xff09;虚函数虚函数的重写&#xff08;覆盖、一种接口继承&#xff09;C11 override…

solr快速上手:聚合分组查询|嵌套分组指南(十二)

0. 引言 solr作为搜索引擎经常用于各类查询场景&#xff0c;我们之前讲解了solr的查询语法&#xff0c;而除了普通的查询语法&#xff0c;有时我们还需要实现聚合查询来统计一些指标&#xff0c;所以今天我们接着来查看solr的聚合查询语法 1. 常用聚合查询语法 以下演示我们…

面试题-React(一):React是什么?它的主要特点是什么?

探索React&#xff1a;前端开发中的重要角色与主要特点 引言&#xff1a; 在现代前端开发领域&#xff0c;React已经成为最受欢迎和广泛使用的JavaScript库之一。它由Facebook开发并于2013年首次发布。随着时间的推移&#xff0c;React在开发社区中获得了强大的支持和认可。本…

画质提升+带宽优化,小红书音视频团队端云结合超分落地实践

随着视频业务和短视频播放规模不断增长&#xff0c;小红书一直致力于研究&#xff1a;如何在保证提升用户体验质量的同时降低视频带宽成本&#xff1f; 在近日结束的音视频技术大会「LiveVideoStackCon 2023」上海站中&#xff0c;小红书音视频架构视频图像处理算法负责人剑寒向…