【SpringMVC】工作流程及入门案例
目录
前言
回顾MVC三层架构
1. SpringMVC简介
1.1 SpringMVC的特点
1.2 SpringMVC核心组件
1.3 SpringMVC工作流程
2. SpringMVC入门案例
2.1 添加pom.xml依赖
2.2 创建spring-mvc.xml
2.3 配置web.xml
2.4 编写处理器类
2.5 编写hello.jsp
2.6 运行测试
2.7 静态资源处理
前言
Spring MVC(Model-View-Controller)是一个基于Java的Web应用程序框架,它是Spring框架的一部分。主要是用来进行Web开发,是对Servlet进行了封装,也可以理解为是Servlet的加强版。
回顾MVC三层架构
学习SpringMVC之前我们先来回顾下自定义MVC框架思想:
一个自定义MVC框架的基本工作流程如下:
- 用户通过视图与应用程序交互,视图将用户的请求传递给控制器。
- 控制器接收用户请求,根据请求的类型和内容决定调用哪个模型处理请求,并根据处理结果决定需要更新哪个视图。
- 模型处理请求的过程中可能需要与数据库或其他数据源进行交互,获取所需数据并进行相应的处理。处理完成后,将结果返回给控制器。
- 控制器根据模型的处理结果,决定更新哪个视图以展示结果给用户。
- 视图接收到控制器的指令后,根据要展示的内容进行相应的处理和渲染,最终将结果呈现给用户。
在自定义MVC中每个请求都需要写一个Servlet,显然是不方便了。SpringMVC的工作流程与此差不多,controller可以处理多个请求,并对请求进行分发,执行不同的业务操作,对它进行了加强让开发更加便捷。
SpringMVC简介
Spring MVC(Model-View-Controller)是一个基于Java的Web应用程序框架,它是Spring框架的一部分。Spring MVC提供了一个简单、灵活且强大的模型,用于构建Web应用程序,它遵循MVC设计模式。这个模式有助于将应用程序的表示层、业务逻辑层和数据访问层分离,使得开发更加模块化和易于维护。
SpringMVC的特点
Spring MVC的核心原则是分离关注点,将应用程序的不同方面分离开来,以便更好地管理和维护代码。它通过将应用程序分为模型(Model)、视图(View)和控制器(Controller)三个部分来实现这一目标。
-
模型(Model):模型代表应用程序的数据和业务逻辑。它可以是一个POJO(Plain Old Java Object)或一个持久化实体类。模型负责处理数据的读取、存储和验证,并提供数据给视图进行展示。
-
视图(View):视图负责展示模型中的数据给用户。它可以是一个JSP(JavaServer Pages)、HTML页面或其他模板引擎生成的页面。视图通常是根据模型的数据来动态生成的,以便将数据呈现给用户。
-
控制器(Controller):控制器负责处理用户请求并协调模型和视图之间的交互。它接收用户的请求,调用适当的模型处理数据,并选择合适的视图来展示结果。控制器还可以处理表单验证、异常处理和其他与请求相关的逻辑。
SpringMVC核心组件
Spring MVC框架提供了一组核心组件来实现这种模型-视图-控制器的架构。其中包括:
-
DispatcherServlet:它是Spring MVC的前端控制器,负责接收所有的HTTP请求并将其分发给适当的处理程序。
-
HandlerMapping:它负责将请求映射到适当的处理程序(控制器)。
-
Controller:它是处理程序的接口,负责处理用户请求并返回适当的模型和视图。
-
ViewResolver:它负责将逻辑视图名称解析为实际的视图对象。
-
View:它负责将模型数据渲染为最终的响应结果,可以是JSP、HTML页面或其他类型的视图。
除了这些核心组件,Spring MVC还提供了许多其他功能,如数据绑定、表单处理、文件上传、拦截器、国际化支持等,以帮助开发人员更轻松地构建Web应用程序。
SpringMVC工作流程
- 用户发来一个请求,首先进入的是前端控制器DispatcherServlet
- 前端控制器(DispacherServlet)将用户发来的请求发送给处理器映射器(HandlerMapping)
- 处理器映射器根据前端控制器发来的用户的请求找到对应符合的控制器(Handler),并且将其封装成处理器执行链,返回给前端控制器。
- 处理器适配器接收到来自前端控制器的执行链后,找到对应执行此执行链的处理器适配器(HandlerAdapter)来调用的具体的控制器(就是说其对应的方法或者逻辑)
- 处理器适配器 (HandlerAdaptoer) 会调用对应的具体的 Controller(处理业务逻辑)
- 控制器执行完成后,会返回一个ModelAndView对象给处理器适配器
- 处理器适配器将返回来的ModelAndView对象返回给前端控制器(到这里所有的业务处理过程就要完了,接下就是将结果以页面的的形式响应给用户)
- 前端控制器将返回回来的ModelAndView对象交给视图解析器(ViewResolver),视图解析器根据传过来的View对象解析成对应的页面对象
- ViewResolver 将封装好的将页面对象和Model对象返回给 DIspatcherServlet
- 前端控制器再将返回回来的对象交给视图(View)
- 视图根据传过来的Model对象再一次的对页面进行渲染(将模型数据填充至视图中),然后在返回给前端控制器。
- 前端控制器将完成的结果响应给浏览器,然后浏览器在展现给用户。
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.xsdhttp://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的一些基本设置,包括组件扫描、注解驱动、视图解析器和静态资源处理。下面是对这段代码的逐行解释:
<context:component-scan base-package="com.ycxw"/>
:启用组件扫描,让Spring自动扫描指定包(在这里是com.ycxw
)及其子包中的所有类,识别并注册带有特定注解(如@Controller
、@Service
等)的类为Spring容器中的bean。
<mvc:annotation-driven/>
:启用Spring MVC的注解驱动功能,让Spring MVC自动注册默认的处理器映射(DefaultAnnotationHandlerMapping
)和处理器适配器(AnnotationMethodHandlerAdapter
),以支持基于注解的控制器方法。
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
:定义一个视图解析器(InternalResourceViewResolver
)的bean,用于将控制器返回的逻辑视图名解析为实际的视图资源(如JSP文件)。
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView">
:设置视图解析器的viewClass
属性,指定使用JstlView
类来处理JSTL标签。
<property name="prefix" value="/WEB-INF/jsp/"/>
:设置视图解析器的prefix
属性,指定视图资源(如JSP文件)的前缀路径。
<property name="suffix" value=".jsp"/>
:设置视图解析器的suffix
属性,指定视图资源(如JSP文件)的后缀。
<!--4) 单独处理图片、样式、js等资源 -->
:这是一个注释,说明接下来的配置是用于处理静态资源。
<!-- <mvc:resources location="/css/" mapping="/css/**"/>
:这是一个注释掉的配置,如果启用,它会将请求路径以/css/
开头的请求映射到/css/
目录下的静态资源(如CSS文件)。
<!-- <mvc:resources location="/js/" mapping="/js/**"/>
:这是一个注释掉的配置,如果启用,它会将请求路径以/js/
开头的请求映射到/js/
目录下的静态资源(如JavaScript文件)。
<!-- <mvc:resources location="WEB-INF/images/" mapping="/images/**"/>
:这是一个注释掉的配置,如果启用,它会将请求路径以/images/
开头的请求映射到WEB-INF/images/
目录下的静态资源(如图片文件)。总之,这段代码配置了一个基本的Spring MVC应用程序,包括组件扫描、注解驱动、视图解析器和静态资源处理。
配置web.xml
配置步骤:
- 配置Spring与Web项目集成
- 配置中文乱码过滤器
- 配置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;}
}
-
@Controller
:使用@Controller
注解标记这个类是一个Spring MVC控制器。这个注解告诉Spring框架,这个类将处理HTTP请求。 -
@RequestMapping(value="/hello")
:使用@RequestMapping
注解映射一个HTTP请求路径(在这里是/hello
)到控制器的一个方法(在这里是hello()
方法)。当用户访问/hello
路径时,hello()
方法将被调用。
编写hello.jsp
在spring-mvc.xml文件已配置ViewResolver视图解析器
运行测试
静态资源处理
所有文件都会被spring-mvc.xml配置文件进行拦截,所以要添加配置,让处理器扫描扫该资源
<mvc:resources location="/static/" mapping="/static/**"/>
如路径:
运行测试:
相关文章:

【SpringMVC】工作流程及入门案例
目录 前言 回顾MVC三层架构 1. SpringMVC简介 …...

【JVM】垃圾收集算法
文章目录 分代收集理论标记-清除算法标记-复制算法标记-整理算法 分代收集理论 当前商业虚拟机的垃圾收集器,大多数都遵循了“分代收集”(Generational Collection)[1]的理论进 行设计,分代收集名为理论,实质是一套符…...

K8s的Pod出现Init:ImagePullBackOff问题的解决(以calico为例)
对于这类问题的解决思路应该都差不多,本文以calico插件安装为例,发现有个Pod的镜像没有pull成功 第一步:查看这个pod的描述信息 kubectl describe pod calico-node-wmhrw -n kube-system 从上图发现是docker拉取"calico/cni:v3.15.1&q…...

数据结构 -作用及基本概念
为什么要使用数据结构 学习数据结构是计算机科学和软件工程领域中非常重要的一门课程。以下是学习数据结构的几个重要原因: 组织和管理数据:数据结构提供了一种组织和管理数据的方式。通过学习不同的数据结构,你可以了解如何有效地存储和操作…...

数学建模--时间序列预测模型的七种经典算法的Python实现
目录 1.开篇版权提示 2.时间序列介绍 3.项目数据处理 4.项目数据划分可视化 5.时间预测序列经典算法1:朴素法 6.时间预测序列经典算法2: 简单平均法 7.时间预测序列经典算法3:移动平均法 8.时间预测序列经典算法4:简单指…...

nginx-反向代理缓存
反向代理缓存相当于自动化动静分离。 将上游服务器的资源缓存到nginx本地,当下次再有相同的资源请求时,直接讲nginx缓存的资源返回给客户端。 本地缓存资源有一个过期时间,当超过过期时间,则重新向上游服务器重新请求获取资源。…...

大模型重塑区域人才培养,飞桨(重庆)人工智能教育创新中心正式启动
2023年8月22日,重庆市高校人工智能产教融合院长研讨会暨飞桨(重庆)人工智能教育创新中心启动仪式在重庆大学成功召开。会上,由百度飞桨、重庆大学组织重庆市二十一所高校共建的飞桨(重庆)人工智能教育创新中…...

PAT 1164 Good in C 测试点3,4
个人学习记录,代码难免不尽人意。 When your interviewer asks you to write “Hello World” using C, can you do as the following figure shows? Input Specification: Each input file contains one test case. For each case, the first part gives the 26 …...

LabVIEW对EAST长脉冲等离子体运行的陀螺稳态运行控制
LabVIEW对EAST长脉冲等离子体运行的陀螺稳态运行控制 托卡马克是实现磁约束核聚变最有希望的解决方案之一。电子回旋共振加热(ECRH是一种对托卡马克有吸引力的等离子体加热方法,具有耦合效率高,功率沉积定位好等优点。陀螺加速器是ECRH系统中…...
Fragment
Fragment是Android开发中的一个重要组件,用于构建灵活且可重用的用户界面模块。它可以作为Activity的一部分来展示用户界面,并且可以嵌套在其他Fragment中,从而形成复杂的界面层级。 以下是一个简单的示例,展示了如何在Android中…...
哈希表-救赎金
Leetcode: https://leetcode.cn/problems/ransom-note/?envTypestudy-plan-v2&envIdtop-interview-150 给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。 如果可以,返回 true …...
vue3+vite+ts项目适配各种分辨率解决方案
现在的电脑屏幕和尺寸越来越多样化,对于前端开发来说,适配各种屏幕成了大难题,开发中一个实际例子:开发一个导航栏,ui给的是1920*60的尺寸,前端开发的时候,在自己电脑缩放比例中开发的ÿ…...

Python Opencv实践 - 矩形轮廓绘制(直边矩形,最小外接矩形)
import cv2 as cv import numpy as np import matplotlib.pyplot as pltimg cv.imread("../SampleImages/stars.png") plt.imshow(img[:,:,::-1])img_gray cv.cvtColor(img, cv.COLOR_BGR2GRAY) #通过cv.threshold转换为二值图 ret,thresh cv.threshold(img_gray,…...
大数据HBASE的详细使用
摘要:本文将深入探讨大数据HBASE的使用步骤,帮助读者了解和掌握这一强大的分布式数据库系统的基本概念和操作技巧。通过本文的阅读,读者将能够熟悉HBASE的基本设置,了解其核心概念,掌握基本的查询和管理操作࿰…...

Sentinel 流量控制框架
1. Sentinel 是什么? Sentinel是由阿里中间件团队开源的,面向分布式服务架构的轻量级高可用流量控制组件。 2. 主要优势和特性 轻量级,核心库无多余依赖,性能损耗小。 方便接入,开源生态广泛。 丰富的流量控制场景。 …...
leetcode原题: 跳水板
题目: 你正在使用一堆木板建造跳水板。有两种类型的木板,其中长度较短的木板长度为shorter,长度较长的木板长度为longer。你必须正好使用k块木板。编写一个方法,生成跳水板所有可能的长度。 返回的长度需要从小到大排列。 示例&…...

深度学习入门(Python)学习笔记1
第1章 Python入门 1.1python是什么 Python是一个简单、易读、易记的编程语言,而且是开源的,可以免费地自由使用。 使用Python不仅可以写出可读性高的代码,还可以写出性能高(处理速度快)的代码。 再者,在…...

苏州想要获得融资融券低利率账户的方法?怎么开融资融券账户?
想要获得融资融券低利率账户,可以通过以下几种方式: 选择低费率的券商:不同券商的费率不同,一些券商会提供低利率的融资融券账户,可以通过咨询券商或者比较不同券商的费率来找到最佳账户。 提升自身信用:获…...
【LeetCode周赛】LeetCode第359场周赛
LeetCode第359场周赛 判别首字母缩略词k-avoiding 数组的最小总和销售利润最大化找出最长等值子数组 判别首字母缩略词 给你一个字符串数组 words 和一个字符串 s ,请你判断 s 是不是 words 的 首字母缩略词 。 如果可以按顺序串联 words 中每个字符串的第一个字符…...

vue3+ts+tinynce在富文本编辑器菜单栏实现下拉框选择
实现效果 代码: <script lang"ts" setup> import Editor from tinymce/tinymce-vue import tinymce from tinymce; import { getIndicator } from /api/data-assets/data-dictoryimport {computed, ref} from "vue"; const props defin…...

利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...

Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...

接口自动化测试:HttpRunner基础
相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...

基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...
【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验
Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...

【版本控制】GitHub Desktop 入门教程与开源协作全流程解析
目录 0 引言1 GitHub Desktop 入门教程1.1 安装与基础配置1.2 核心功能使用指南仓库管理日常开发流程分支管理 2 GitHub 开源协作流程详解2.1 Fork & Pull Request 模型2.2 完整协作流程步骤步骤 1: Fork(创建个人副本)步骤 2: Clone(克隆…...