SpringMVC 简介及入门级的快速搭建详细步骤
MVC 回顾
MVC,即Model-View-Controller(模型-视图-控制器)设计模式,是一种广泛应用于软件工程中,特别是Web应用开发中的架构模式。它将应用程序分为三个核心组件:
- Model(模型): 模型层负责封装和管理应用程序的数据以及相关的业务逻辑。在MVC中,模型包含数据的获取、验证、处理和存储等功能。当模型的状态发生变化时,通常会通知关联的视图进行更新。
- View(视图): 视图层负责用户界面的呈现和与用户的交互。视图从模型获取数据,并以适合的方式展示给用户。视图是被动的,它只显示模型提供的信息,并不直接参与数据处理。
- Controller(控制器): 控制器负责处理用户的输入请求,协调模型和视图之间的交互。当接收到用户操作或请求后,控制器调用相应的模型方法来处理业务逻辑,并决定应该更新哪个视图来响应用户操作。
通过这种分离,MVC设计模式实现了以下优点:
- 降低了各部分之间的耦合度,提高了代码的可重用性和可维护性。
- 支持多视图表现同一份数据,便于开发和维护多个不同的用户界面。
- 更容易进行单元测试,因为各个组件的功能相对独立。
简单来说:
M: Model 模型
作用:处理业务、数据状态表示(业务层和DAO层及实体类)
V: View 视图
作用:数据显示、收集(注册)
C: Controller 控制器
作用:接收请求、根据请求调用业务、根据业务结果跳转
三层架构
Java 框架中的三层架构是一种经典的软件设计模式,它将应用程序划分为三个层次,以提高代码的可维护性、可扩展性和复用性。这三层分别是:
- 表现层(Presentation Layer): 也称为用户界面层或客户端层,是直接与用户交互的部分。在Java Web应用中,这一层通常包括JSP、JSF、Servlets、Spring MVC等技术来构建用户界面和处理HTTP请求。它的任务是收集用户的输入数据,并调用业务逻辑层进行处理,然后将结果以适当的形式展示给用户。
- 业务逻辑层(Business Logic Layer / Service Layer): 这一层包含了应用程序的核心业务逻辑,它定义了如何处理来自表现层的请求以及如何与数据访问层交互。在Java框架中,可以使用普通的Java类或者Spring框架的服务接口和服务实现来编写业务逻辑。业务逻辑层对上层屏蔽了底层的数据存储细节,实现了业务规则和流程的封装。
- 数据访问层(Data Access Layer): 又称持久化层,负责所有与数据库相关的操作,例如数据的增删改查(CRUD)。在Java框架中,常见的持久化框架有Hibernate、MyBatis等,它们提供了一种方便的方式来执行SQL语句并与数据库交互。数据访问层为业务逻辑层提供了统一的数据访问接口,使得业务逻辑不依赖于特定的数据库系统。
通过三层架构的设计,各层之间相对独立,能够降低模块间的耦合度,便于后期的维护升级,同时提高了开发效率和系统的灵活性。
MVC 框架
主流的 MVC 框架有:
Struts1.x -------- 核心控制器--- Servlet -- 耦合 Servlet
Struts2.x --------- 核心控制器--- 过滤器 ---控制器 SSH --- Struts+Spring+Hibernate
SpringMVC ------ 核心控制器---Servlet --- xml
一、SpringMVC 项目搭建
1. 创建 Maven Web 项目
创建Maven Web项目,新建 Module ,选择 Maven Archetype 模板
创建好之后的目录结构如下:
可以看出,默认缺少 java 目录的,下面手动新建 Java 目录
选中 main 右键 ,在下面弹出框中选择:
选中后会弹出下面选择框:
直接选中下面的 java 双击 即可,完成后的目录结构如图:
2. 添加依赖
在 pom.xml 中添加 spring-webmvc 依赖
<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.3.22</version></dependency>
</dependencies>
3. 配置 web.xml
配置 Servlet , DispatcherServlet 核心控制器(前端控制器)
注意:在servlet 配置中的 servlet-name 的取值,影响创建的 springmvc 配置文件的命名
命名规则:<servet-name>-servlet.xml
比如:下面的配置后,配置文件名只能是:springmvc-servlet.xml
<!DOCTYPE web-app PUBLIC"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN""http://java.sun.com/dtd/web-app_2_3.dtd" ><web-app><display-name>Archetype Created Web Application</display-name><servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class></servlet><servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>/</url-pattern></servlet-mapping><!--/ 拦截除了 jsp 之外的所有的请求/* 拦截所有请求,包括 jsp-->
</web-app>
4. 新建配置文件
新建 springmvc-servlet.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: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"><!--配置扫描--><context:component-scan base-package="com.wdzl"/><!--配置视图解析器 IRVR--><!--"index" 逻辑名== /WEB-INF/jsp/index.jsp--><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/jsp/"/><property name="suffix" value=".jsp"/></bean>
</beans>
5. 编写控制器
package com.wdzl.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;@Controller
public class HelloController {/** 返回值就是跳转的目标页面的逻辑名* */@RequestMapping("index")public String hello(){System.out.println("========hello()=========");return "index";}
}
6. 部署到tomcat 运行
7. 运行异常
当前部署完成,运行 tomcat 并访问控制器时,会抛出异常
java.lang.ClassNotFoundException: org.springframework.web.servlet.DispatcherServletorg.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1412)org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1220)org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.jav
解决办法:
原因:默认 maven 依赖的 jar 包,默认情况下,不会打包到部署的项目中去的。正常的情况下,应该在 /WEB-INF/lib 下部署所有的jar包
解决步骤:
-
File- Project Structs
然后选中所有的依赖后,右键,选中 Put into /:
选中完成后的效果如图:
再次运行,问题解决!!!
a. 新建dispatcher-servlet.xml文件
默认命名规则:-servlet.xml , servletname指的是 web.xml中Servlet配置的命名
b.如果不是默认规则,需要web.xml中配置初始化参数
<servlet><servlet-name>xxxx</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/dispatcher-servlet.xml</param-value></init-param><load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping><servlet-name>xxxx</servlet-name><url-pattern>/</url-pattern>
</servlet-mapping>
如果默认情况下,上面配置默认命名 xxxx-servlet.xml
c. 配置springmvc的配置文件
开启包扫描
<context:component-scan base-package="com.wdzl"></context:component-scan>
视图解析器配置
<!--视图解析器-->
<bean id="viewRelover" class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/"></property><property name="suffix" value=".jsp"></property>
</bean>
d. 新建控制器,输出 “Hello,World!”
@Controller
public class HelloControler {@RequestMapping("/hello")public String hell(){System.out.println("==========hello world!=====");return "index";}
}
e.发布到tomcat ,启动,浏览器访问
http://127.0.0.1:8080/springmvc/hello
8. Spring6的踩坑
1. Spring6 + JDK17 + Tomcat9
异常信息( Spring6 + JDK17 + Tomcat9):
java.lang.NoClassDefFoundError: jakarta/servlet/http/HttpServletjava.base/java.lang.ClassLoader.defineClass1(Native Method)java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1012)jakarta/servlet/http/HttpServlet
原因:
在Tomcat9和之前版本,不支持,支持的是 javax.servlet 从Tomat10开始,支持jakarta/servlet/http/HttpServlet
解决办法:
解决办法:Spring5+jdk11+tomcat9 通过降低版本来解决
2. Spring6 + JDK17 + Tomcat10
异常信息:
java.lang.NoClassDefFoundError: jakarta/servlet/jsp/jstl/core/LoopTagjava.base/java.lang.ClassLoader.defineClass1(Native Method)java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1012)java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:150)org.apache.catalina.loader.WebappClassLoaderBase.findClassInternal(WebappClassLoaderBase.java:2489)org.apache.catalina.loader.WebappClassLoaderBase.findClass(WebappClassLoaderBase.java:865)org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1401)
解决办法:
- 第一种方式:下载jakarta.servlet.jsp.jstl-api-3.0.0.jar 直接拷贝到 Tomcat10 中,部署到 Tomcat10 中的项目就可以正常运行了 但是,工作空间中源代码报编译错误,不能识别到关联的 jar
- 第二种方式:添加依赖
在 JSP 中就可以识别 JSTL 了,而且也可以部署到 Tomcat10 正常运行了<dependency><groupId>org.glassfish.web</groupId><artifactId>jakarta.servlet.jsp.jstl</artifactId><version>2.0.0</version></dependency>
相关文章:

SpringMVC 简介及入门级的快速搭建详细步骤
MVC 回顾 MVC,即Model-View-Controller(模型-视图-控制器)设计模式,是一种广泛应用于软件工程中,特别是Web应用开发中的架构模式。它将应用程序分为三个核心组件: Model(模型)&#…...
Flutter编译卡在Running Gradle task ‘assembleDebug
1、翻墙 2、修改国内镜像源(以下以Flutter 3.19.3版本为例) 找到Flutter SDK目录下的Flutter配置文件resolve_dependencies.gradle 路径:flutter/packages/flutter_tools/gradle/resolve_dependencies.gradle 1)、第一处修改: g…...

基于springboot的牙科就诊管理系统
技术:springbootmysqlvue 一、系统背景 当前社会各行业领域竞争压力非常大,随着当前时代的信息化,科学化发展,让社会各行业领域都争相使用新的信息技术,对行业内的各种相关数据进行科学化,规范化管理。这样…...

C语言 指针练习
一、 a、b是两个浮点型变量,给a、b赋值,建立两个指针分别指向a的地址和b的地址,输出两个指针的值。 #include<stdio.h> int main() {float a,b,*p1,*p2;a10.2;b2.3;p1&a;p2&b;printf("a%f,b%f\n",a,b);printf("…...

【力扣 TOP100】 无重复字符的最长子串
题目描述: 思路: 使用left和right表示子串的端点。每次判断新的right是否在之前的子串里,如果在,则将left更新为新字符在子串里的位置(因为在此之间,没有更长的子串了)。如果不在则right1&…...
K8S node磁盘清理
K8S磁盘清理 K8S的部署形式相比传统非容器部署,会消耗更多的磁盘,在运行时可能会把磁盘占满。 这里以使用containerd运行时的K8S node为例,说明磁盘会用到那里了和如何清理磁盘 通用处理 磁盘清理: du -h --max-depth6 / 2>/dev/nul…...
2024年上半年软考,现在开始学真的来得及吗?
24上软考报名进行时,如果从现在开始学习来得及吗?只为拿证,还没报名的选哪科通过率高一点呢? 01、现在开始学来得及吗? 还没开始备考的考生,现在开始抓紧时间学还来得及,但是要正视软考的试题…...
SfM——八点法计算F矩阵(基础矩阵)与三角测量
1 八点法计算F矩阵(基础矩阵) 基础矩阵用于描述两个视图之间的几何关系 基础矩阵:基础矩阵 F F F 是描述两个视图之间相机投影关系的矩阵。对于两个对应的图像坐标点 ( x , y , 1 ) (x, y, 1) (x,y,1) 和 ( u , v , 1 ) (u, v, 1) (u,v,1…...

分布式事务的解决方案--Seata架构
一、Seata的XA模式 二、AT模式原理 三、TCC模式原理 四、MQ分布式事务 异步,非实时,实现最终的一致性。 四、分布式事务的解决方案...
【 React 】React JSX 转换成真实DOM的过程?
1. 是什么 react通过将组件编写的JSX映射到屏幕,以及组件中的状态发生了变化之后React会将这些「变化」更新到屏幕上 在前面文章了解中,JSX通过babel最终转化成React.createElement这种形式,例如: <div>< img src"…...
[Open3d]: 知识记录
python api 官方手册:http://www.open3d.org/docs/release/ 可视化:http://www.open3d.org/docs/release/tutorial/visualization/visualization.html python-vis 参考代码:https://github.com/isl-org/Open3D/tree/master/examples/python/v…...

css面试题
1、css盒模型 a、标准盒模型---在标准盒模型中,width的宽度指的是content的宽度 b、怪异盒模型---在怪异盒模型中,width的宽度等于contentborderpadding 切换盒子模型的话,使用box-sizing。 2、link和import的区别 a、link是html标签&#x…...
vscode调试launch.json常用格式
1、简单的模版 定义一个简单的模版如下: {// 使用 IntelliSense 了解相关属性。 // 悬停以查看现有属性的描述。// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid830387"version": "0.2.0","configuration…...

巨细!Python爬虫详解
爬虫(又称为网页蜘蛛,网络机器人,在 FOAF 社区中间,更经常的称为网页追逐者);它是一种按照一定的规则,自动地抓取网络信息的程序或者脚本。 如果我们把互联网比作一张大的蜘蛛网,那…...

项目中如何进行限流(限流的算法、实现方法详解)
❤ 作者主页:李奕赫揍小邰的博客 ❀ 个人介绍:大家好,我是李奕赫!( ̄▽ ̄)~* 🍊 记得点赞、收藏、评论⭐️⭐️⭐️ 📣 认真学习!!!🎉🎉 文章目录 限流的算法漏…...
https在win7的环境下如何配置
https在win7的环境下如何配置?在Windows7环境下配置https,需要完成以下步骤: 1)安装Web服务器软件 可以选择安装常用的Web服务器软件,如Apache、Nginx或IIS,这些服务器软件都支持https。 2)获…...

Day69:WEB攻防-Java安全JWT攻防Swagger自动化算法签名密匙Druid泄漏
目录 Java安全-Druid监控-未授权访问&信息泄漏 黑盒发现 白盒发现 攻击点 Java安全-Swagger接口-导入&联动批量测试 黑盒发现 白盒发现 自动化发包测试 自动化漏洞测试 Java安全-JWT令牌-空算法&未签名&密匙提取 识别 JWT 方式一:人工识…...

Python Windows系统 虚拟环境使用
目录 1、安装 2、激活 3、停止 1、安装 1)为项目新建一个目录(比如:目录命名为learning_log) 2)在终端中切换到这个目录 3)执行命令:python -m venv ll_env,即可创建一个名为ll…...

栈和队列的学习
存储方式分两类:顺序存储和链式存储 栈:只允许从一端进行数据插入和删除的线性表:先进后出 FILO 队列:只允许从一端进行数据插入,另一端进行数据删除的线性表:先进先出 FIFO 栈 创建空栈,创建…...

【机器学习】基于机器学习的分类算法对比实验
摘要 基于机器学习的分类算法对比实验 本论文旨在对常见的分类算法进行综合比较和评估,并探索它们在机器学习分类领域的应用。实验结果显示,随机森林模型在CIFAR-10数据集上的精确度为0.4654,CatBoost模型为0.4916,XGBoost模型为…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...

MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...