• SpringMVC的工作流程及入门


    目录

    一、概述

    ( 1 )  是什么

    ( 2 )  作用

    二、工作流程

    ( 1 )  流程

    ( 2 )  步骤

    三、入门实例

    ( 1 )  入门实例 

    ( 2 )  静态资源处理

    给我们带来的收获


    一、概述

    ( 1 )  是什么

    SpringMVC是一个基于Java的Web应用开发框架,它是Spring Framework的一部分。它提供了一种模型(Model)-视图(View)-控制器(Controller)(MVC)的架构模式,用于构建灵活、可扩展的Web应用程序。SpringMVC通过将应用程序分解为模型(数据)、视图(用户界面)和控制器(处理请求和响应)三个组件,实现了松耦合和高度可测试的开发方式。它还提供了许多功能,如请求映射、数据绑定、表单处理、验证、国际化等,以简化Web开发过程。SpringMVC还支持各种视图技术,如JSP、Thymeleaf、Freemarker等,使开发人员能够选择适合自己的视图模板。总的来说,SpringMVC是一个强大而灵活的框架,把复杂的web应用分成逻辑清晰的几部分,简化开发,减少出错,方便组内开发人员之间的配合,广泛用于构建Java Web应用程序。

    ( 2 )  作用

    SpringMVC具有以下几个主要作用:

    • 1. 分离关注点:SpringMVC通过将应用程序分解为模型、视图和控制器三个组件,实现了关注点的分离。模型负责处理数据,视图负责展示用户界面,控制器负责处理请求和响应。这种分离使得开发人员可以专注于各自的领域,提高了代码的可读性和可维护性。
    • 2. 灵活可扩展:SpringMVC采用了松耦合的设计,使得开发人员可以根据需求选择合适的组件和技术进行开发。它支持各种视图技术,如JSP、Thymeleaf、Freemarker等,使开发人员能够选择适合自己的视图模板。同时,SpringMVC还提供了丰富的功能和特性,如拦截器、数据绑定、表单处理、验证、异常处理等,以满足不同场景下的需求。
    • 3. 易于测试:由于SpringMVC采用了MVC架构模式,使得应用程序的各个组件可以独立测试。开发人员可以针对模型、视图和控制器编写单元测试,验证其功能和逻辑的正确性。这种可测试性有助于提高代码质量和开发效率。
    • 4. 提高开发效率:SpringMVC提供了一套简洁而强大的API和工具,使开发人员能够快速构建Web应用程序。它通过注解和约定大于配置的方式,简化了开发过程,减少了样板代码的编写。同时,SpringMVC还提供了丰富的文档和社区支持,使开发人员能够快速解决问题和获取帮助。

    总的来说,SpringMVC作为一个Web应用开发框架,具有分离关注点、灵活可扩展、易于测试和提高开发效率等作用。它帮助开发人员构建高效、易于维护的Web应用程序,并提供了丰富的功能和特性,以满足不同场景下的需求。

    二、工作流程

    ( 1 )  流程

    当客户端发送请求到SpringMVC应用程序时,请求将由前端控制器(Front Controller)DispatcherServlet接收。DispatcherServlet是SpringMVC的核心组件,负责协调和管理请求的处理流程。

    DispatcherServlet根据请求的URL找到对应的处理器(Handler),Handler是一个带有注解的方法或类,用于处理请求并生成响应。处理器可以根据请求的特征,如URL路径、请求方法、请求参数等进行匹配。

    在执行处理器之前,SpringMVC通过处理器适配器(HandlerAdapter)对处理器进行封装和适配,使其符合统一的处理器接口(HandlerInterface)。这样就可以支持不同类型的处理器,如注解控制器(Annotation Controller)、Controller接口实现类、REST控制器等。

    处理器执行过程中可以通过模型(Model)对象传递数据,模型是一个数据容器,用于保存处理结果并传递给视图(View)。处理器还可以返回一个逻辑视图名,告诉DispatcherServlet选择哪个视图来渲染响应。

    DispatcherServlet根据逻辑视图名选择合适的视图解析器(ViewResolver)来解析视图,并生成最终的响应。视图解析器负责将逻辑视图名解析为具体的视图,如JSP、Thymeleaf模板等。视图负责生成最终的HTML、XML、JSON等响应内容。

    最后,DispatcherServlet将响应发送给客户端进行展示。整个请求-响应过程通过中央调度器DispatcherServlet进行协调和控制,使开发者能够集中精力在业务逻辑的处理上,提高开发效率。

    SpringMVC还提供了许多功能和特性,如拦截器(Interceptor)用于对请求进行预处理和后处理、数据绑定和类型转换、表单验证、异常处理、RESTful支持等,以满足不同场景下的需求。

    总结而言,SpringMVC是一个基于Java的Web应用开发框架,通过MVC架构模式实现了灵活、可扩展的Web应用程序开发。它提供了一套全面的特性和组件,使开发人员能够快速构建高效、易于维护的Web应用程序。

    ( 2 )  步骤

    当客户端发送请求到SpringMVC应用程序时,请求会经过以下详细的流程:

    • 1. 客户端发送请求:客户端通过浏览器发送HTTP请求,其中包含请求的URL、请求方法、请求头、请求参数等信息。
    • 2. 前端控制器接收请求:请求到达应用程序后,被前端控制器DispatcherServlet接收。DispatcherServlet是一个Servlet,是整个SpringMVC应用的入口点。
    • 3. 处理器映射器进行处理器匹配:DispatcherServlet通过处理器映射器(HandlerMapping)来确定请求对应的处理器(Handler)。处理器映射器根据配置的URL映射规则,将请求URL映射到相应的处理器。
    • 4. 处理器适配器处理处理器:处理器适配器(HandlerAdapter)根据处理器的类型调用相应的处理方法。处理器可以是注解控制器(如@Controller、@RequestMapping)、实现了Controller接口的类、RESTful控制器等。
    • 5. 处理器执行:处理器执行具体的业务逻辑,处理请求并生成一个Model(模型)对象。Model对象可以携带处理结果和数据,供视图渲染使用。
    • 6. 处理器拦截器的调用:在处理器执行前后,可以定义拦截器对请求进行拦截和处理。拦截器可以在请求前进行预处理,也可以在请求后进行后处理。拦截器的执行顺序可以通过配置进行控制。
    • 7. 处理器返回视图名或视图对象:处理器执行完毕后,会返回一个逻辑视图名或直接返回一个具体的视图对象。逻辑视图名是一个表示视图的逻辑名称,视图对象则代表具体的视图实现。
    • 8. 视图解析器进行视图解析:DispatcherServlet通过视图解析器(ViewResolver)将逻辑视图名解析为具体的视图实现。视图解析器根据配置的规则来查找对应的视图,如JSP、Thymeleaf等。
    • 9. 视图渲染:视图负责生成最终的响应内容,根据模型数据渲染视图模板,并生成最终的HTML、XML、JSON等响应。
    • 10. 视图返回响应:渲染完成后,视图将生成的响应返回给前端控制器DispatcherServlet。
    • 11. 处理器拦截器的后处理:在视图返回响应后,可以继续执行拦截器的后处理逻辑。拦截器可以对响应进行进一步的处理,如日志记录、跳转等。
    • 12. 响应发送给客户端:DispatcherServlet将响应发送给客户端,客户端根据响应类型进行展示,如在浏览器中渲染HTML页面或解析JSON数据。

    整个SpringMVC的工作流程是一个基于Servlet的请求-响应模型,通过前端控制器、处理器映射器、处理器适配器、视图解析器和视图等组件的协作,实现了灵活、可扩展并且易于开发的Web应用框架。DispatcherServlet充当了中央调度器的角色,协调和控制请求的处理流程。通过这种流程,SpringMVC实现了松耦合、可扩展和易于测试的Web应用开发。

    三、入门实例

    这里是根据我博客中的文章进行了一个扩展增加代码 : 认识Mybatis的关联关系映射

    ( 1 ) 入门实例 

    在项目中的pom.xml文件中添加依赖,增加后的所有引用配置如下 : 

    1. "1.0" encoding="UTF-8"?>
    2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    4. <modelVersion>4.0.0modelVersion>
    5. <groupId>org.examplegroupId>
    6. <artifactId>indexartifactId>
    7. <version>1.0-SNAPSHOTversion>
    8. <packaging>warpackaging>
    9. <name>index Maven Webappname>
    10. <url>http://www.example.comurl>
    11. <properties>
    12. <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
    13. <maven.compiler.source>1.8maven.compiler.source>
    14. <maven.compiler.target>1.8maven.compiler.target>
    15. <maven.compiler.plugin.version>3.7.0maven.compiler.plugin.version>
    16. <spring.version>5.0.2.RELEASEspring.version>
    17. <mybatis.version>3.4.5mybatis.version>
    18. <mysql.version>5.1.44mysql.version>
    19. <pagehelper.version>5.1.2pagehelper.version>
    20. <mybatis.spring.version>1.3.1mybatis.spring.version>
    21. <commons.dbcp2.version>2.1.1commons.dbcp2.version>
    22. <commons.pool2.version>2.4.3commons.pool2.version>
    23. <log4j2.version>2.9.1log4j2.version>
    24. <junit.version>4.12junit.version>
    25. <servlet.version>4.0.0servlet.version>
    26. <lombok.version>1.18.2lombok.version>
    27. <jstl.version>1.2jstl.version>
    28. <standard.version>1.1.2standard.version>
    29. <spring.version>5.0.2.RELEASEspring.version>
    30. properties>
    31. <dependencies>
    32. <dependency>
    33. <groupId>org.springframeworkgroupId>
    34. <artifactId>spring-contextartifactId>
    35. <version>${spring.version}version>
    36. dependency>
    37. <dependency>
    38. <groupId>org.springframeworkgroupId>
    39. <artifactId>spring-ormartifactId>
    40. <version>${spring.version}version>
    41. dependency>
    42. <dependency>
    43. <groupId>org.springframeworkgroupId>
    44. <artifactId>spring-txartifactId>
    45. <version>${spring.version}version>
    46. dependency>
    47. <dependency>
    48. <groupId>org.springframeworkgroupId>
    49. <artifactId>spring-aspectsartifactId>
    50. <version>${spring.version}version>
    51. dependency>
    52. <dependency>
    53. <groupId>org.springframeworkgroupId>
    54. <artifactId>spring-webartifactId>
    55. <version>${spring.version}version>
    56. dependency>
    57. <dependency>
    58. <groupId>org.springframeworkgroupId>
    59. <artifactId>spring-testartifactId>
    60. <version>${spring.version}version>
    61. dependency>
    62. <dependency>
    63. <groupId>org.mybatisgroupId>
    64. <artifactId>mybatisartifactId>
    65. <version>${mybatis.version}version>
    66. dependency>
    67. <dependency>
    68. <groupId>mysqlgroupId>
    69. <artifactId>mysql-connector-javaartifactId>
    70. <version>${mysql.version}version>
    71. dependency>
    72. <dependency>
    73. <groupId>com.github.pagehelpergroupId>
    74. <artifactId>pagehelperartifactId>
    75. <version>${pagehelper.version}version>
    76. dependency>
    77. <dependency>
    78. <groupId>org.mybatisgroupId>
    79. <artifactId>mybatis-springartifactId>
    80. <version>${mybatis.spring.version}version>
    81. dependency>
    82. <dependency>
    83. <groupId>org.apache.commonsgroupId>
    84. <artifactId>commons-dbcp2artifactId>
    85. <version>${commons.dbcp2.version}version>
    86. dependency>
    87. <dependency>
    88. <groupId>org.apache.commonsgroupId>
    89. <artifactId>commons-pool2artifactId>
    90. <version>${commons.pool2.version}version>
    91. dependency>
    92. <dependency>
    93. <groupId>org.apache.logging.log4jgroupId>
    94. <artifactId>log4j-coreartifactId>
    95. <version>${log4j2.version}version>
    96. dependency>
    97. <dependency>
    98. <groupId>org.apache.logging.log4jgroupId>
    99. <artifactId>log4j-apiartifactId>
    100. <version>${log4j2.version}version>
    101. dependency>
    102. <dependency>
    103. <groupId>org.apache.logging.log4jgroupId>
    104. <artifactId>log4j-webartifactId>
    105. <version>${log4j2.version}version>
    106. dependency>
    107. <dependency>
    108. <groupId>junitgroupId>
    109. <artifactId>junitartifactId>
    110. <version>${junit.version}version>
    111. dependency>
    112. <dependency>
    113. <groupId>javax.servletgroupId>
    114. <artifactId>javax.servlet-apiartifactId>
    115. <version>${servlet.version}version>
    116. <scope>providedscope>
    117. dependency>
    118. <dependency>
    119. <groupId>org.projectlombokgroupId>
    120. <artifactId>lombokartifactId>
    121. <version>${lombok.version}version>
    122. <scope>providedscope>
    123. dependency>
    124. <dependency>
    125. <groupId>org.springframeworkgroupId>
    126. <artifactId>spring-webmvcartifactId>
    127. <version>${spring.version}version>
    128. dependency>
    129. <dependency>
    130. <groupId>jstlgroupId>
    131. <artifactId>jstlartifactId>
    132. <version>${jstl.version}version>
    133. dependency>
    134. <dependency>
    135. <groupId>taglibsgroupId>
    136. <artifactId>standardartifactId>
    137. <version>${standard.version}version>
    138. dependency>
    139. dependencies>
    140. <build>
    141. <finalName>indexfinalName>
    142. <resources>
    143. <resource>
    144. <directory>src/main/javadirectory>
    145. <includes>
    146. <include>**/*.xmlinclude>
    147. includes>
    148. resource>
    149. <resource>
    150. <directory>src/main/resourcesdirectory>
    151. <includes>
    152. <include>jdbc.propertiesinclude>
    153. <include>*.xmlinclude>
    154. includes>
    155. resource>
    156. resources>
    157. <plugins>
    158. <plugin>
    159. <groupId>org.apache.maven.pluginsgroupId>
    160. <artifactId>maven-compiler-pluginartifactId>
    161. <version>${maven.compiler.plugin.version}version>
    162. <configuration>
    163. <source>${maven.compiler.source}source>
    164. <target>${maven.compiler.target}target>
    165. <encoding>${project.build.sourceEncoding}encoding>
    166. configuration>
    167. plugin>
    168. <plugin>
    169. <groupId>org.mybatis.generatorgroupId>
    170. <artifactId>mybatis-generator-maven-pluginartifactId>
    171. <version>1.3.2version>
    172. <dependencies>
    173. <dependency>
    174. <groupId>mysqlgroupId>
    175. <artifactId>mysql-connector-javaartifactId>
    176. <version>${mysql.version}version>
    177. dependency>
    178. dependencies>
    179. <configuration>
    180. <overwrite>trueoverwrite>
    181. configuration>
    182. plugin>
    183. <plugin>
    184. <artifactId>maven-clean-pluginartifactId>
    185. <version>3.1.0version>
    186. plugin>
    187. <plugin>
    188. <artifactId>maven-resources-pluginartifactId>
    189. <version>3.0.2version>
    190. plugin>
    191. <plugin>
    192. <artifactId>maven-compiler-pluginartifactId>
    193. <version>3.8.0version>
    194. plugin>
    195. <plugin>
    196. <artifactId>maven-surefire-pluginartifactId>
    197. <version>2.22.1version>
    198. plugin>
    199. <plugin>
    200. <artifactId>maven-war-pluginartifactId>
    201. <version>3.2.2version>
    202. plugin>
    203. <plugin>
    204. <artifactId>maven-install-pluginartifactId>
    205. <version>2.5.2version>
    206. plugin>
    207. <plugin>
    208. <artifactId>maven-deploy-pluginartifactId>
    209. <version>2.8.2version>
    210. plugin>
    211. plugins>
    212. build>
    213. project>

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

    创建 spring-mvc.xml,这里又在spring-mvc.xml中配置了一次全局扫描,导致多次扫描装配问题。(防止重复扫描装配

    1. "1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xmlns:context="http://www.springframework.org/schema/context"
    5. xmlns:mvc="http://www.springframework.org/schema/mvc"
    6. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    7. 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">
    8. <context:component-scan base-package="com.CloudJun"/>
    9. <mvc:annotation-driven />
    10. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    11. <property name="viewClass"
    12. value="org.springframework.web.servlet.view.JstlView">property>
    13. <property name="prefix" value="/WEB-INF/jsp/"/>
    14. <property name="suffix" value=".jsp"/>
    15. bean>
    16. <mvc:resources location="/static/" mapping="/static/**"/>
    17. beans>
    配置web.xml

    配置步骤:

    1. 配置Spring与Web项目集成

    2. 配置中文乱码过滤器

    3. 配置SpringMVC核心控制器DispatcherServlet

    1. "1.0" encoding="UTF-8"?>
    2. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
    5. version="3.1">
    6. <display-name>Archetype Created Web Applicationdisplay-name>
    7. <context-param>
    8. <param-name>contextConfigLocationparam-name>
    9. <param-value>classpath:spring-context.xmlparam-value>
    10. context-param>
    11. <listener>
    12. <listener-class>org.springframework.web.context.ContextLoaderListenerlistener-class>
    13. listener>
    14. <filter>
    15. <filter-name>encodingFilterfilter-name>
    16. <filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
    17. <async-supported>trueasync-supported>
    18. <init-param>
    19. <param-name>encodingparam-name>
    20. <param-value>UTF-8param-value>
    21. init-param>
    22. filter>
    23. <filter-mapping>
    24. <filter-name>encodingFilterfilter-name>
    25. <url-pattern>/*url-pattern>
    26. filter-mapping>
    27. <servlet>
    28. <servlet-name>SpringMVCservlet-name>
    29. <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
    30. <init-param>
    31. <param-name>contextConfigLocationparam-name>
    32. <param-value>classpath:spring-mvc.xmlparam-value>
    33. init-param>
    34. <load-on-startup>1load-on-startup>
    35. <async-supported>trueasync-supported>
    36. servlet>
    37. <servlet-mapping>
    38. <servlet-name>SpringMVCservlet-name>
    39. <url-pattern>/url-pattern>
    40. servlet-mapping>
    41. web-app>

    创建一个 IndexController 

    1. package com.CloudJun.web;
    2. import org.springframework.stereotype.Controller;
    3. import org.springframework.web.bind.annotation.RequestMapping;
    4. /**
    5. * @author CloudJun
    6. * @create  2023-09-04 16:19
    7. */
    8. @Controller
    9. @RequestMapping("/Cloud")
    10. public class IndexController {
    11. @RequestMapping("/Jun")
    12. public String primary(){
    13. System.out.println("SpringMVC 使用。。。。。");
    14. return "hello";
    15. }
    16. }

    之后我们开启服务器,在浏览器中发送这个请求测试 :  http://localhost:8080/index/Cloud/Jun

                                         ( 根据自己的配置进行请求访问才可以 )

    测试结果 : 

    ( 2 )  静态资源处理

    首先先将随便一个静态资源放进项目的静态资源包中

    这里我们以以下图片为例

    然后在 spring-mvc.xml 配置文件中增加以下代码 

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

            ( 这里是会处理所有的静态资源,也就是处理static包里的所有静态资源 )

    开启服务器,在浏览器中发送这个请求测试,请求根据所在的资源目录结构来输入。

    如我的图片资源目录结构如图 : 

    所有我需要发送的请求为 : http://localhost:8080/index/static/images/preview.jpg

    测试结果如图

    给我们带来的收获

    学习了SpringMVC的工作流程和静态资源处理,我们可以获得以下收获:

    • 1. 理解了SpringMVC的整体工作流程:学习了请求的流程,包括DispatcherServlet的作用、HandlerMapping的匹配过程、HandlerAdapter的处理过程以及ViewResolver的视图解析过程等。这使我们能够更好地理解SpringMVC框架的工作原理,从而更好地进行开发和调试。
    • 2. 掌握了静态资源处理的方法:学习了如何配置SpringMVC来处理静态资源,包括图片、样式表、脚本等。这使我们可以将静态资源与动态内容分离,提高网站的性能和可维护性。
    • 3. 学会了如何配置静态资源的映射:学习了如何配置SpringMVC来映射静态资源的URL路径,以及如何配置静态资源的存放位置。这使我们可以自定义静态资源的URL路径,更好地组织和管理静态资源。
    • 4. 了解了静态资源的缓存机制:学习了如何配置SpringMVC来启用静态资源的缓存,以减少网络请求和提高网站的加载速度。这使我们可以更好地优化网站的性能,提升用户体验。

    总之,学习了SpringMVC的工作流程和静态资源处理,我们可以更好地理解和使用SpringMVC框架,提高开发效率和网站性能。

     

  • 相关阅读:
    C语言 字符数组
    如何修改 node_modules 里的文件
    浅谈测试需求分析
    JZ85 连续子数组的最大和(二)
    谷歌、AMD、英特尔加入挑战,英伟达AI解决方案还能继续“遥遥领先”吗?
    基于AVDTP信令分析蓝牙音频启动流程
    SSO单点登录
    极简示例揭示 SwiftUI 中 @ObservedObject 与 @StateObject 状态的关键区别
    关于Android Studio 同步Gradle失败的解决方案
    QTableView通过setColumnWidth设置了列宽无效的问题
  • 原文地址:https://blog.csdn.net/SAME_LOVE/article/details/132676629