【SpringMVC】工作流程及入门案例

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: 【SpringMVC】工作流程及入门案例

前言

       Spring MVC(Model-View-Controller)是一个基于Java的Web应用程序框架,它是Spring框架的一部分。主要是用来进行Web开发,是对Servlet进行了封装,也可以理解为是Servlet的加强版。

回顾MVC三层架构                          

学习SpringMVC之前我们先来回顾下自定义MVC框架思想:

一个自定义MVC框架的基本工作流程如下:

  1. 用户通过视图与应用程序交互,视图将用户的请求传递给控制器。
  2. 控制器接收用户请求,根据请求的类型和内容决定调用哪个模型处理请求,并根据处理结果决定需要更新哪个视图。
  3. 模型处理请求的过程中可能需要与数据库或其他数据源进行交互,获取所需数据并进行相应的处理。处理完成后,将结果返回给控制器。
  4. 控制器根据模型的处理结果,决定更新哪个视图以展示结果给用户。
  5. 视图接收到控制器的指令后,根据要展示的内容进行相应的处理和渲染,最终将结果呈现给用户。

 

       在自定义MVC中每个请求都需要写一个Servlet,显然是不方便了。SpringMVC的工作流程与此差不多,controller可以处理多个请求,并对请求进行分发,执行不同的业务操作,对它进行了加强让开发更加便捷。

SpringMVC简介                    

       Spring MVC(Model-View-Controller)是一个基于Java的Web应用程序框架,它是Spring框架的一部分。Spring MVC提供了一个简单、灵活且强大的模型,用于构建Web应用程序,它遵循MVC设计模式。这个模式有助于将应用程序的表示层、业务逻辑层和数据访问层分离,使得开发更加模块化和易于维护。

SpringMVC的特点

       Spring MVC的核心原则是分离关注点,将应用程序的不同方面分离开来,以便更好地管理和维护代码。它通过将应用程序分为模型(Model)、视图(View)和控制器(Controller)三个部分来实现这一目标。

  1. 模型(Model):模型代表应用程序的数据和业务逻辑。它可以是一个POJO(Plain Old Java Object)或一个持久化实体类。模型负责处理数据的读取、存储和验证,并提供数据给视图进行展示。
  2. 视图(View):视图负责展示模型中的数据给用户。它可以是一个JSP(JavaServer Pages)、HTML页面或其他模板引擎生成的页面。视图通常是根据模型的数据来动态生成的,以便将数据呈现给用户。
  3. 控制器(Controller):控制器负责处理用户请求并协调模型和视图之间的交互。它接收用户的请求,调用适当的模型处理数据,并选择合适的视图来展示结果。控制器还可以处理表单验证、异常处理和其他与请求相关的逻辑。

SpringMVC核心组件

Spring MVC框架提供了一组核心组件来实现这种模型-视图-控制器的架构。其中包括:

  1. DispatcherServlet:它是Spring MVC的前端控制器,负责接收所有的HTTP请求并将其分发给适当的处理程序。
  2. HandlerMapping:它负责将请求映射到适当的处理程序(控制器)。
  3. Controller:它是处理程序的接口,负责处理用户请求并返回适当的模型和视图。
  4. ViewResolver:它负责将逻辑视图名称解析为实际的视图对象。
  5. View:它负责将模型数据渲染为最终的响应结果,可以是JSP、HTML页面或其他类型的视图。

       除了这些核心组件,Spring MVC还提供了许多其他功能,如数据绑定、表单处理、文件上传、拦截器、国际化支持等,以帮助开发人员更轻松地构建Web应用程序。


   SpringMVC工作流程

  1. 用户发来一个请求,首先进入的是前端控制器DispatcherServlet
  2. 前端控制器(DispacherServlet)将用户发来的请求发送给处理器映射器(HandlerMapping)
  3. 处理器映射器根据前端控制器发来的用户的请求找到对应符合的控制器(Handler),并且将其封装成处理器执行链,返回给前端控制器。
  4. 处理器适配器接收到来自前端控制器的执行链后,找到对应执行此执行链的处理器适配器(HandlerAdapter)来调用的具体的控制器(就是说其对应的方法或者逻辑)
  5. 处理器适配器 (HandlerAdaptoer) 会调用对应的具体的 Controller(处理业务逻辑)
  6. 控制器执行完成后,会返回一个ModelAndView对象给处理器适配器
  7. 处理器适配器将返回来的ModelAndView对象返回给前端控制器(到这里所有的业务处理过程就要完了,接下就是将结果以页面的的形式响应给用户)
  8. 前端控制器将返回回来的ModelAndView对象交给视图解析器(ViewResolver),视图解析器根据传过来的View对象解析成对应的页面对象
  9. ViewResolver 将封装好的将页面对象和Model对象返回给 DIspatcherServlet
  10. 前端控制器再将返回回来的对象交给视图(View)
  11. 视图根据传过来的Model对象再一次的对页面进行渲染(将模型数据填充至视图中),然后在返回给前端控制器。
  12. 前端控制器将完成的结果响应给浏览器,然后浏览器在展现给用户。

 

SpringMVC入门案例

添加pom.xml依赖

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.example</groupId>
  <artifactId>mybatis_spring</artifactId>
  <packaging>war</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>mybatis_spring Maven Webapp</name>
  <url>http://maven.apache.org</url>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <maven.compiler.plugin.version>3.7.0</maven.compiler.plugin.version>
        <!--添加jar包依赖-->
        <!--1.spring 5.0.2.RELEASE相关-->
        <spring.version>5.0.2.RELEASE</spring.version>
        <!-- jstl+standard -->
        <jstl.version>1.2</jstl.version>
        <standard.version>1.1.2</standard.version>
        <!-- spring -->
        <spring.version>5.0.2.RELEASE</spring.version>
    </properties>
    <dependencies>
        <!--1.spring相关-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <!-- spring mvc相关依赖 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>jstl</groupId>
            <artifactId>jstl</artifactId>
            <version>${jstl.version}</version>
        </dependency>
        <dependency>
            <groupId>taglibs</groupId>
            <artifactId>standard</artifactId>
            <version>${standard.version}</version>
        </dependency>
    </dependencies>
  <build>
      <finalName>mybatis_spring</finalName>
  </build>
</project>

缺少jstl+standard的这两个jar包会报java.lang.NoClassDefFoundError: javax/servlet/jsp/jstl/core/Config,那是因为org.springframework.web.servlet.view.JstlView在视图解析时需要这二个jar包。

创建spring-mvc.xml

<?xml version="1.0" encoding="UTF-8"?>
<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"
       xmlns="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
      http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    <!--1) 扫描com.zking.zf及子子孙孙包下的控制器(扫描范围过大,耗时)-->
    <context:component-scan base-package="com.ycxw"/>
    <!--2) 此标签默认注册DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter -->
    <mvc:annotation-driven/>
    <!--3) 创建ViewResolver视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- viewClass需要在pom中引入两个包:standard.jar and jstl.jar -->
        <property name="viewClass"
                  value="org.springframework.web.servlet.view.JstlView"></property>
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
    <!--4) 单独处理图片、样式、js等资源 -->
    <!-- <mvc:resources location="/css/" mapping="/css/**"/>
     <mvc:resources location="/js/" mapping="/js/**"/>
     <mvc:resources location="WEB-INF/images/" mapping="/images/**"/>-->
</beans>

解释:

这段代码是一个Spring MVC应用程序的XML配置文件。它用于配置Spring MVC的一些基本设置,包括组件扫描、注解驱动、视图解析器和静态资源处理。下面是对这段代码的逐行解释:

  1. <context:component-scan base-package="com.ycxw"/>:启用组件扫描,让Spring自动扫描指定包(在这里是com.ycxw)及其子包中的所有类,识别并注册带有特定注解(如@Controller、@Service等)的类为Spring容器中的bean。
  2. <mvc:annotation-driven/>:启用Spring MVC的注解驱动功能,让Spring MVC自动注册默认的处理器映射(DefaultAnnotationHandlerMapping)和处理器适配器(AnnotationMethodHandlerAdapter),以支持基于注解的控制器方法。
  3. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">:定义一个视图解析器(InternalResourceViewResolver)的bean,用于将控制器返回的逻辑视图名解析为实际的视图资源(如JSP文件)。
  4. <property name="viewClass" value="org.springframework.web.servlet.view.JstlView">:设置视图解析器的viewClass属性,指定使用JstlView类来处理JSTL标签。
  5. <property name="prefix" value="/WEB-INF/jsp/"/>:设置视图解析器的prefix属性,指定视图资源(如JSP文件)的前缀路径。
  6. <property name="suffix" value=".jsp"/>:设置视图解析器的suffix属性,指定视图资源(如JSP文件)的后缀。
  7. <!--4) 单独处理图片、样式、js等资源 -->:这是一个注释,说明接下来的配置是用于处理静态资源。
  8. <!-- <mvc:resources location="/css/" mapping="/css/**"/>:这是一个注释掉的配置,如果启用,它会将请求路径以/css/开头的请求映射到/css/目录下的静态资源(如CSS文件)。
  9. <!-- <mvc:resources location="/js/" mapping="/js/**"/>:这是一个注释掉的配置,如果启用,它会将请求路径以/js/开头的请求映射到/js/目录下的静态资源(如JavaScript文件)。
  10. <!-- <mvc:resources location="WEB-INF/images/" mapping="/images/**"/>:这是一个注释掉的配置,如果启用,它会将请求路径以/images/开头的请求映射到WEB-INF/images/目录下的静态资源(如图片文件)。

       总之,这段代码配置了一个基本的Spring MVC应用程序,包括组件扫描、注解驱动、视图解析器和静态资源处理。

配置web.xml

配置步骤:

  1. 配置Spring与Web项目集成
  2. 配置中文乱码过滤器
  3. 配置SpringMVC核心控制器DispatcherServlet
<?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_3_1.xsd"
         version="3.1">
  <display-name>Archetype Created Web Application</display-name>
  <!-- Spring和web项目集成start -->
  <!-- spring上下文配置文件 -->
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:spring-context.xml</param-value>
  </context-param>
  <!-- 读取Spring上下文的监听器 -->
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  <!-- Spring和web项目集成end -->
  <!-- 中文乱码处理 -->
  <filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <async-supported>true</async-supported>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <!-- Spring MVC servlet -->
  <servlet>
    <servlet-name>SpringMVC</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!--此参数可以不配置,默认值为:/WEB-INF/springmvc-servlet.xml-->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:spring-mvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
    <!--web.xml 3.0的新特性,是否支持异步-->
    <async-supported>true</async-supported>
  </servlet>
  <servlet-mapping>
    <servlet-name>SpringMVC</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>

编写处理器类

package com.ycxw.web;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
 * @author 云村小威
 * @site blog.csdn.net/Justw320
 * @create 2023-09-04 20:11
 */
@Controller
public class HelloController {
    @RequestMapping(value="/hello")
    public String hello(){
        System.out.println("调用了hello方法...");
        return null;
    }
}
  1. @Controller:使用@Controller注解标记这个类是一个Spring MVC控制器。这个注解告诉Spring框架,这个类将处理HTTP请求。
  2. @RequestMapping(value="/hello"):使用@RequestMapping注解映射一个HTTP请求路径(在这里是/hello)到控制器的一个方法(在这里是hello()方法)。当用户访问/hello路径时,hello()方法将被调用。

编写hello.jsp

在spring-mvc.xml文件已配置ViewResolver视图解析器

运行测试

静态资源处理

所有文件都会被spring-mvc.xml配置文件进行拦截,所以要添加配置,让处理器扫描扫该资源

<mvc:resources location="/static/" mapping="/static/**"/>

如路径:

运行测试:

相关文章
|
7月前
|
Java 应用服务中间件 Spring
SpringMVC快速入门加登录流程分析
SpringMVC快速入门加登录流程分析
89 0
|
7月前
|
SQL JavaScript Java
springboot+springm vc+mybatis实现增删改查案例!
springboot+springm vc+mybatis实现增删改查案例!
|
5天前
|
设计模式 前端开发 Java
步步深入SpringMvc DispatcherServlet源码掌握springmvc全流程原理
通过对 `DispatcherServlet`源码的深入剖析,我们了解了SpringMVC请求处理的全流程。`DispatcherServlet`作为前端控制器,负责请求的接收和分发,处理器映射和适配负责将请求分派到具体的处理器方法,视图解析器负责生成和渲染视图。理解这些核心组件及其交互原理,有助于开发者更好地使用和扩展SpringMVC框架。
22 4
|
4月前
|
Java 数据库连接 Spring
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
文章是关于Spring、SpringMVC、Mybatis三个后端框架的超详细入门教程,包括基础知识讲解、代码案例及SSM框架整合的实战应用,旨在帮助读者全面理解并掌握这些框架的使用。
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
|
4月前
|
XML JSON 数据库
SpringMVC入门到实战------七、RESTful的详细介绍和使用 具体代码案例分析(一)
这篇文章详细介绍了RESTful的概念、实现方式,以及如何在SpringMVC中使用HiddenHttpMethodFilter来处理PUT和DELETE请求,并通过具体代码案例分析了RESTful的使用。
SpringMVC入门到实战------七、RESTful的详细介绍和使用 具体代码案例分析(一)
|
4月前
|
前端开发 Java Spring
SpringMVC种通过追踪源码查看是哪种类型的视图渲染器(一般流程方法)
这篇文章通过示例代码展示了如何在Spring MVC中编写和注册拦截器,以及如何在拦截器的不同阶段添加业务逻辑。
SpringMVC种通过追踪源码查看是哪种类型的视图渲染器(一般流程方法)
|
4月前
|
前端开发 应用服务中间件 数据库
SpringMVC入门到实战------八、RESTful案例。SpringMVC+thymeleaf+BootStrap+RestFul实现员工信息的增删改查
这篇文章通过一个具体的项目案例,详细讲解了如何使用SpringMVC、Thymeleaf、Bootstrap以及RESTful风格接口来实现员工信息的增删改查功能。文章提供了项目结构、配置文件、控制器、数据访问对象、实体类和前端页面的完整源码,并展示了实现效果的截图。项目的目的是锻炼使用RESTful风格的接口开发,虽然数据是假数据并未连接数据库,但提供了一个很好的实践机会。文章最后强调了这一章节主要是为了练习RESTful,其他方面暂不考虑。
SpringMVC入门到实战------八、RESTful案例。SpringMVC+thymeleaf+BootStrap+RestFul实现员工信息的增删改查
SpringMVC入门到实战------3、@RequestMapping注解(超详细基础知识+实际代码案例)
该博客文章详细介绍了SpringMVC中`@RequestMapping`注解的使用方法,包括其功能、位置、value属性、method属性、params属性、headers属性以及支持的路径风格和占位符,并通过实际代码案例展示了如何建立请求与控制器方法之间的映射关系。
SpringMVC入门到实战------3、@RequestMapping注解(超详细基础知识+实际代码案例)
|
7月前
|
JSON 前端开发 Java
SpringMVC概述、SpringMVC的工作流程、创建SpringMVC的项目
SpringMVC概述、SpringMVC的工作流程、创建SpringMVC的项目
49 2
|
7月前
|
前端开发 Java 定位技术
生活小事件(SpringMVC主要的组件及作用和执行流程)
Spring MVC 的主要组件包括 DispatcherServlet(核心,请求调度)、HandlerMapping(URL 映射到处理器)、HandlerAdapter(统一执行处理器)、Handler(处理业务逻辑,通常为 @Controller 类)、ViewResolver(视图解析)和 View(渲染输出)。通过这些组件的协作,Spring MVC 实现了从接收请求到返回响应的流程,类似于警察处理交通违规的协调过程。
下一篇
DataWorks