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

news2024/9/24 3:20:27

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

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

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

        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
	 */
	@Override
	protected Class<?>[] getRootConfigClasses() {
		return new Class[]{SpringConfig.class};
	}

	/**
	 * 配置一个springmvc的配置类
	 * @return
	 */
	@Override
	protected Class<?>[] getServletConfigClasses() {
		return new Class[]{WebConfig.class};
	}

	/**
	 * 配置一个路径,告诉tomcat哪些请求要交给springmvc来处理
	 * /  所有的请求都交给springmvc处理
	 * @return
	 */
	@Override
	protected 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. 打开页面网页资源的访问权限
@Override
    protected 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) {
        //添加一个消息转换器,可以把对象自动转换成json
        converters.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.coloradmin.cn/o/900713.html

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

相关文章

旅行越野SUV——捷途旅行者即将与大家见面!

从2020年开始,国内车市踊跃出许多性格鲜明的车型,例如坦克300、极氪001、蔚来ET5旅行版以及五菱悦野,虽然它们属于小众车型,但奈何销量都非常亮眼,这也从另一角度证明现如今的年轻消费群体很喜欢特点鲜明的汽车产品。前段时间,捷途汽车发布的捷途旅行者,一款定位旅行越野SUV的新…

JVM的前世今生之类加载过程

1. 什么是JVM VM是JavaVirtualMachine&#xff08;Java虚拟机&#xff09;的缩写&#xff0c;JVM是一种用于计算设备的规范&#xff0c;它是一个虚构出来的计算机&#xff0c;是通过在实际的计算机上仿真模拟各种计算机功能来实现的。它可以实现跨操作系统运行&#xff0c;即一…

CMake语法复习

前言 此文总结了库的制作和一些CMake常用的一些语法。 一&#xff1a;创建静态库和动态库 静态库的生成和使用 动态库的生成和使用 二&#xff1a;使用CMake来生成Makefile&#xff0c;生成可执行文件 顶层目录下的CMakeLists.txt project(HELLO) add_subdirectory(libhell…

设计模式之备忘录模式(Memento)的C++实现

1、备忘录模式的提出 在软件功能开发过程中&#xff0c;某些对象的状态在转换过程中&#xff0c;由于业务场景需要&#xff0c;要求对象能够回溯到对象之前某个点的状态。如果使用一些共有接口来让其他对象得到对象的状态&#xff0c;便会暴露对象的实现细节。备忘录模式是在不…

ps打开出现dll文件丢失怎么回事?该如何修复

今天在看到一个ps的相关问题&#xff0c;可能很多同学也遇到过&#xff0c;安装好ps软件之后&#xff0c;打开会提示无法启动此程序。然后会有各种文件的丢失一般都是xxx.dll文件的格式&#xff0c;并提示尝试重新安装该程序&#xff0c;以解决此问题。不但是PS&#xff0c;还有…

226、仿真-基于51单片机楼道教室走道智能灯光光照人体感应检测控制Proteus仿真设计(程序+Proteus仿真+配套资料等)

毕设帮助、开题指导、技术解答(有偿)见文未 目录 一、硬件设计 二、设计功能 三、Proteus仿真图 四、程序源码 资料包括&#xff1a; 需要完整的资料可以点击下面的名片加下我&#xff0c;找我要资源压缩包的百度网盘下载地址及提取码。 方案选择 单片机的选择 方案一&…

Hlang--用Python写个编程语言-函数与基本数据结构实现

文章目录 前言语法表述解析器修改词法解析函数节点函数节点解析List的解析实现解释器节点函数操作String和List处理总结前言 okey,经过一段时间的努力,接下来要实现的是函数。当然还有对应的基本数据结构,那么之后的话,我们的工作就开始进一步转换了。 那么在这块我们要实…

java:数据库连接池

概念 举个例子来说吧&#xff0c;假设我们开了一家餐馆&#xff0c;客人来了&#xff0c;我们就请一个服务员&#xff0c;使用完后再把他开除了&#xff0c;下个客人再来了&#xff0c;我们再请一个&#xff0c;使用完再开除。 这是不是我们现在使用 JDBC 连接数据库的场景&a…

电脑提示缺少vcomp140.dll怎样修复-vcomp140.dll丢失怎么办?

在使用电脑软件或者玩游戏时候&#xff0c;我们有时候会遇到提示系统丢失DLL状况&#xff0c;相信很多用电脑的都遇到过&#xff0c;我曾多次遇到提示丢失DLL&#xff0c;每次都要折腾了几小时&#xff0c;终于&#xff01;在我多次折腾后&#xff0c;&#xff0c;有幸得到这个…

ForkJoinPool 你真的明白和用对了吗

ForkJoinPool 是一个功能强大的 Java 类&#xff0c;用于处理计算密集型任务&#xff0c;使用 ForkJoinPool 分解计算密集型任务&#xff0c;并并行执行它们&#xff0c;能够产生更好的性能。它的工作原理是将任务分解成更小的子任务&#xff0c;使用分而治之的策略进行操作&am…

mysql数据传输到mssql

一、找开Navicat Premium 12 此时目标数据库会创建一个同名的表

ElasticSearch DSL语句(bool查询、算分控制、地理查询、排序、分页、高亮等)

文章目录 DSL 查询种类DSL query 基本语法1、全文检索2、精确查询3、地理查询4、function score &#xff08;算分控制&#xff09;5、bool 查询 搜索结果处理1、排序2、分页3、高亮 RestClient操作 DSL 查询种类 查询所有&#xff1a;查询所有数据&#xff0c;一般在测试时使…

【C++11新特性】lambda表达式

文章目录 1. lambda表达式概念2. lambda表达式语法3. lambda表达式应用 1. lambda表达式概念 lambda表达式是一个匿名函数&#xff0c;恰当使用lambda表达式可以让代码变得简洁&#xff0c;并且可以提高代码的可读性。 见见lambda表达式的使用 现在要对若干商品分别按照价格和…

Java并发----创建线程的三种方式及查看进程线程

一、直接使用 Thread // 创建线程对象 Thread t new Thread() {public void run() {// 要执行的任务} }; // 启动线程 t.start(); 例如&#xff1a; // 构造方法的参数是给线程指定名字&#xff0c;推荐 Thread t1 new Thread("t1") {Override// run 方法内实现…

LED驱动型IC芯片的原理介绍

一、LED驱动器是什么 LED驱动器&#xff08;LED Driver&#xff09;&#xff0c;是指驱动LED发光或LED模块组件正常工作的电源调整电子器件。由于LED PN结的导通特性决定&#xff0c;它能适应的电源电压和电流变动范围十分狭窄&#xff0c;稍许偏离就可能无法点亮LED或者发光效…

AraNet:面向阿拉伯社交媒体的新深度学习工具包

阿拉伯语是互联网上第四大最常用的语言&#xff0c;它在社交媒体上的日益增加为大规模研究阿拉伯语在线社区提供了充足的资源。然而&#xff0c;目前很少有工具可以从这些数据中获得有价值的见解&#xff0c;用于决策、指导政策、协助应对等。这种情况即将改变吗&#xff1f; …

Java日志框架-JUL

JUL全称Java util logging 入门案例 先来看着入门案例&#xff0c;直接创建logger对象&#xff0c;然后传入日志级别和打印的信息&#xff0c;就能在控制台输出信息。 可以看出只输出了部分的信息&#xff0c;其实默认的日志控制器是有一个默认的日志级别的&#xff0c;默认就…

串口通讯

USART是全双工同步通讯 在同步通信中&#xff0c;数据信号所传输的内容绝大多数属于有效数据&#xff0c;而异步通信中包含了各种帧的标识符&#xff0c;所以同步通讯的效率更高。但是同步通信对时钟要求苛刻&#xff0c;允许的误差小。而异步通信则允许双方的误差较大 比特率…

【MySQL系列】--初识数据库

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

币圈最后的黑暗时刻?也是牛市来临前的准备阶段!

最近加密市场的波动并不乐观&#xff0c;整体走势呈下行趋势&#xff0c;比特币价格跌至2.5万美元&#xff0c;以太坊更是跌破1500美元&#xff0c;其他山寨币也纷纷下挫&#xff0c;市场情绪相对悲观。 更令人担忧的是&#xff0c;当前加密市场缺乏新的叙事&#xff0c;也没有…