SpringMVC Day 01:入门案例

前言

在我们的日常工作和学习中,Web 开发是一个无法回避的重要环节。而在 Java Web 开发领域,SpringMVC 无疑是一个重量级选手。它以其灵活性、强大功能和清晰的 MVC 结构,赢得了大量开发者的青睐。但是,对于初学者来说,SpringMVC 的学习曲线可能会比较陡峭。因此,我决定写这篇博客,希望通过一个简单的入门案例,帮助大家快速理解和掌握 SpringMVC。

在这篇博客中,我将会以一个简单的 "Hello, SpringMVC!" 为例,逐步引导大家了解 SpringMVC 的基本概念和使用方法。我们将从环境配置开始,然后逐步介绍如何定义 Controller、如何配置视图解析器、如何处理请求等基本操作。我将尽可能地解释每一步的原理和目的,希望能帮助大家更好地理解 SpringMVC。

无论你是刚接触 Web 开发,还是已经有一定经验的开发者,我都希望这篇博客能对你有所帮助。如果在阅读过程中有任何问题,欢迎在评论区留言,我会尽力回答。

那么,让我们开始吧!

一、开始学习

1、新建 Maven 项目,结构如下
2、导入依赖
XML 复制代码
    <dependencies>
    
        <!-- springmvc 依赖,会将spring的核心包一并添加进来 -->
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.3.23</version>
        </dependency>
     

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

        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.4.5</version>
        </dependency>



    </dependencies>

这些 Maven 依赖项主要包括:

  1. spring-webmvc:Spring Web MVC 框架的核心依赖项,用于开发基于 Spring 的 Web 应用程序。

  2. lombok:一个 Java 库,可以通过注解来简化 Java 代码的编写,例如自动生成 getter/setter 方法、构造函数等。

  3. logback-classic:一个 Java 日志框架,提供了比 JDK 自带日志更强大的功能,例如异步日志、多线程安全、自定义日志格式等。

这些依赖项可以满足开发基于 Spring 的 Web 应用程序的需求,其中 lombok 和 logback-classic 是可选的,可以根据实际需求选择是否使用。

3、在 resources 下新建一个springmvc.xml,完成相应配置
XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!-- 启用注解扫描 -->
   <context:component-scan base-package="edu.nf.ch01"/>
    <!-- 启用 mvc 注解处理器
         这个注解驱动注册了 RequestMappingHandlerMapping (请求映射处理器)
         和一个 RequestMappingHandlerAdapter (请求处理适配器),同时
         提供了 @RequestBody 、@ResponseBody注解支持,数据绑定等支持
    -->
    <mvc:annotation-driven/>
    <!-- 配置视图解析器,springmvc 支持多种试图,不同的视图由不同的
         视图解析器来解析,
         例如:想要使用 jsp 作为视图,那么就需要配置
         InternalResourceViewResolver 这个视图解析器,
         用于解析内部的 JSP 资源
         -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 设置 jsp 资源的前缀,用于指定 JSP 存放的目录 -->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <!-- 设置 jsp 资源的后缀名,以 ".jsp" 结尾 -->
        <property name="suffix" value=".jsp"/>
    </bean>

</beans>

这段 Spring 配置主要用于配置 Spring MVC 视图解析器。

  1. <context:component-scan>:启用注解扫描,该标签会自动扫描指定包下的所有类,并将带有 @Controller、@Service、@Repository、@Component 等注解的类注册为 Spring Bean。

  2. <mvc:annotation-driven/>:启用 Spring MVC 注解驱动,该标签会自动注册各种基于注解的 Spring MVC 组件,例如 @RequestMapping、@RequestBody、@ResponseBody 等。

  3. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">:配置 Spring MVC 视图解析器,该标签会创建一个名为 internalResourceViewResolver 的 Spring Bean,并将它注册到 Spring 容器中。

  4. <property name="prefix" value="/WEB-INF/jsp/"/>:配置视图前缀,该属性指定了 JSP 文件的存放路径,即所有 JSP 文件都存放在 /WEB-INF/jsp/ 目录下。

  5. <property name="suffix" value=".jsp"/>:配置视图后缀,该属性指定了 JSP 文件的后缀名,即所有 JSP 文件的后缀名都是 .jsp。

这段 Spring 配置主要用于配置 Spring MVC 的视图解析器,它会将 JSP 文件的存放路径和后缀名配置成固定值,以便于在控制器中返回视图名称时可以直接使用逻辑视图名,而无需显式指定 JSP 文件的路径和后缀名。

注意:以后这个文件都写在 web-inf 里面和web.xml 放在一起。

4、完成配置 web.xml
XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<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_4_0.xsd"
         version="4.0">
    <!-- 核心请求总控制器,负责接受的所有的请求,并根据映射的 url
         地址将请求分发给具体控制器的方法来处理 -->
    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- springmvc 默认会从 webapp-info 目录下查找名为
             [servletName]-servlet.xml的配置文件、这里是
             spring 官方默认的约定命名、如果想要自定义文件名并且想存放在其他目录下
             则需要通过 contextConfigLocation 初始化参数来配置
             例如自定义一个 springmvc.xml 配置文件放在 resources 目录下
        -->
                <init-param>
                    <param-name>contextConfigLocation</param-name>
                    <param-value>classpath:springmvc.xml</param-value>
                </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>

这是一个 Java Web 应用程序的 web.xml 配置文件,其中主要配置了一个名为 dispatcher 的 Servlet,并将它映射到根路径 / 上。

具体来说,这个 web.xml 文件的作用如下:

  1. 定义了一个名为 dispatcher 的 Servlet,并将它的类路径设置为 org.springframework.web.servlet.DispatcherServlet,这个 Servlet 是 Spring MVC 框架的核心控制器,负责接受所有的 HTTP 请求,并将它们分发给合适的控制器进行处理。

  2. 通过 contextConfigLocation 初始化参数,指定了 Spring MVC 的配置文件路径为 classpath:springmvc.xml,这个配置文件中包含了 Spring MVC 的各种配置信息,例如控制器、视图解析器、拦截器等。

  3. 将 dispatcher Servlet 映射到根路径 / 上,这样所有的 HTTP 请求都会被转发到 dispatcher Servlet 上进行处理,然后根据请求的 URL 路径将请求分发给合适的控制器进行处理。

这个 web.xml 文件是一个 Java Web 应用程序的核心配置文件,它定义了 Servlet、Servlet 映射和初始化参数等信息,使得应用程序能够正确地处理 HTTP 请求并返回响应。

5、在 controller 包下新建一个 HelloController 控制器
java 复制代码
/**
 * @Date 2023-10-19
 * @Author qiu
 * 控制层使用 @controller 注解标识
 */
@Controller
@Slf4j
public class HelloController {

    @RequestMapping("/hello")
    public ModelAndView hello() {
        log.info("Hello word");
        // 响应视图,JSP 视图解析器都是基于转发的机制
        ModelAndView index = new ModelAndView("index");
        return index;
    }

}

这是一个使用 Spring MVC 编写的 Controller 类,它使用了 @Controller 注解将该类标记为 Spring MVC 的控制器,使用 @RequestMapping 注解将该方法映射到 /hello 路径上,当用户访问 /hello 路径时,该方法会被调用。

具体来说,这个 Controller 类的作用如下:

  1. 使用 @Controller 注解将该类标记为 Spring MVC 的控制器,这样 Spring MVC 框架就能够自动将该类注册为一个 Spring Bean,并将其管理起来。

  2. 使用 @RequestMapping 注解将该方法映射到 /hello 路径上,这样当用户访问 /hello 路径时,该方法就会被调用。

  3. 在该方法中,使用 log.info 输出一条日志,表示该方法已经被调用。

  4. 使用 ModelAndView 类创建一个名为 index 的视图模型,该模型表示要返回的视图名称为 index。

  5. 将该视图模型返回给 Spring MVC,由 Spring MVC 负责将其转发到 index.jsp 视图进行渲染。

这个 Controller 类的作用是处理 /hello 路径的 HTTP 请求,将请求转发到 index.jsp 视图进行渲染,并在控制台输出一条日志。

我们具体来说一下 ModelAndView :

ModelAndView 是 Spring MVC 框架中的一个类,它用于封装控制器处理请求后需要返回的视图名称和模型数据。

具体来说,ModelAndView 类中包含了两部分信息:

  1. 视图名称:表示控制器处理请求后需要返回的视图名称,可以是 JSP 视图、Thymeleaf 视图、FreeMarker 视图等。

  2. 模型数据:表示控制器处理请求后需要返回给视图的数据,可以是任意类型的 Java 对象,例如字符串、数字、日期、集合、Map 等。

在控制器中,通过创建 ModelAndView 对象并设置视图名称和模型数据,就可以将控制器处理请求后的结果返回给 Spring MVC 框架,然后由框架将其转发到对应的视图进行渲染。

6、新建 index.jsp 页面
html 复制代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>welcome to SpringMVC!</h1>
</body>
</html>

在页面中输出一句话:welcome to SpringMVC 。

7、打包项目
1)、配置 jetty 服务器

点击 + artifact

二、运行项目

到这里我们的第一个入门案例"welcome to SpringMVC"就完成了。

三、使用 Springmvc 和使用 javaweb 的区别

Spring MVC 是一种基于 Spring 框架的 Web 应用程序开发框架,而 JavaWeb 是指使用 Java 技术开发 Web 应用程序的一种方式。它们之间的区别主要在以下几个方面:

  1. 开发模式:JavaWeb 开发通常采用传统的 Servlet/JSP 开发模式,而 Spring MVC 则是采用 MVC(Model-View-Controller)设计模式,将应用程序分为模型、视图和控制器三层。

  2. 框架特性:Spring MVC 提供了更加完善的 IoC(Inversion of Control)和 AOP(Aspect Oriented Programming)功能,可以更加方便地进行组件的管理和切面编程;而 JavaWeb 的开发则需要手动进行对象的创建和配置,并且相对缺乏 AOP 的支持。

  3. 可扩展性:Spring MVC 框架具有很好的可扩展性,可以与其他 Spring 框架集成,如 Spring Boot、Spring Security 等,以及与第三方框架集成,如 MyBatis、Hibernate 等;而 JavaWeb 的可扩展性相对较弱。

  4. 学习曲线:相对于 JavaWeb,Spring MVC 的学习曲线可能会稍微陡峭一些,需要掌握更多的概念和技术。

Spring MVC 框架相对于传统的 JavaWeb 开发,提供了更加灵活、高效、可扩展的开发方式,并且具有更好的代码重用性和可维护性。

四、gitee 案例

案例地址:ch01 · qiuqiu/SpringMVC - 码云 - 开源中国 (gitee.com)

相关推荐
untE EADO1 分钟前
Tomcat的server.xml配置详解
xml·java·tomcat
ictI CABL10 分钟前
Tomcat 乱码问题彻底解决
java·tomcat
敖正炀13 分钟前
DelayQueue 详解
java
敖正炀39 分钟前
PriorityBlockingQueue 详解
java
shark222222244 分钟前
Spring 的三种注入方式?
java·数据库·spring
陈煜的博客1 小时前
idea 项目只编译不打包,跳过测试,快速开发
java·ide·intellij-idea
hERS EOUS1 小时前
Spring Boot + Spring AI快速体验
人工智能·spring boot·spring
JAVA学习通1 小时前
LangChain4j 与 Spring AI 的技术选型深度对比:2026 年 Java AI 工程化实践指南
java·人工智能·spring
.柒宇.1 小时前
Java八股之反射
java·开发语言
敖正炀1 小时前
LinkedTransferQueue 详解
java