SpringMVC(1)——入门程序+流程分析

MVC都是哪三层?在Spring里面分别对应什么?SpringMVC的架构是什么?

我们使用Spring开发JavaWeb项目,一般都是BS架构,也就是Browser(浏览器)-Server(服务器)架构

这种架构,

总体上的Spring,分为表现层,业务层和持久层三层;

表现层(Controller+ JSON+JSP/thymeleaf)

WEB层,用来和浏览器进行数据交互的。表现层一般会采用MVC的设计模型

业务层(Service+ServiceImpl)

处理公司具体的业务逻辑的

持久层(mybatis:mapper+mapper.xml)

用来操作数据库的

所以SpringMVC主要充当表现层

SpringMVC的架构

M:Model层,作为返回给浏览器的数据的载体,可以是基本类型,实体类对象,Vo对象,List等

V:View层,返回给客户端的视图,可以是JSP页面等

C:Controller层,控制层,充当浏览器与服务器交互的servlet路由的功能

SpringMVC实战

1. 创建maven java web项目,引入依赖

首先我们创建一个maven java web项目(或者叫动态web工程项目),然后导入以下依赖:

<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><spring.version>5.0.2.RELEASE</spring.version></properties><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</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-webmvc</artifactId><version>${spring.version}</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>2.5</version><scope>provided</scope></dependency><dependency><groupId>javax.servlet.jsp</groupId><artifactId>jsp-api</artifactId><version>2.0</version><scope>provided</scope></dependency></dependencies>

2. 创建jsp页面

在webapp包下直接创建index.jsp

在这里插入图片描述

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>入门程序</title>
</head>
<body>
​<%--超链接--%>
​<h3>入门</h3><a href="/hello/mvc" >入门程序</a></body>
</html>

在webapp下的WEB-INF下创建suc.jsp
在这里插入图片描述

jsp页面的浏览器访问性

在webapp/WEB-INF/外的jsp页面,tomcat启动之后可以直接输入jsp的名字访问

在webapp/WEB-INF/的jsp页面,不能直接访问,只能通过请求转发或者重定向访问

3. 配置web项目的web.xml配置文件

前端页面控制器+spring配置文件+启动加载

<!--配置前端控制器--><servlet><servlet-name>dispatcherServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!--加载springmvc.xml配置文件,配置的是Spring配置--><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匹配器--><servlet-mapping><servlet-name>dispatcherServlet</servlet-name><url-pattern>/</url-pattern></servlet-mapping>

4. 配置SpringMVC项目的springmvc.xml配置

  1. Spring创建bean工厂时要扫描的包进而导入的bean;

  2. 视图解析器:配置视图的路由,路由以/WEB-INF/pages/为路由前缀,以.jsp为路由后缀,这样我们在返回视图时只需要返回一个jsp文件名的字符串即可**(比如/WEB-INF/pages/suc.jsp只需要返回一个suc的字符串就够了)**

  3. 开启springmvc对于注解的支持,写不写都行,因为默认开启

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:context="http://www.springframework.org/schema/context"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><!-- 配置spring创建容器时要扫描的包 --><context:component-scan base-package="com.qcbyjy"></context:component-scan><!-- 配置视图解析器 --><bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/pages/"></property><property name="suffix" value=".jsp"></property></bean><!-- 配置spring开启注解mvc的支持 <mvc:annotation-driven></mvc:annotation-driven>-->
</beans>

5. 控制层代码

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;@Controller
@RequestMapping(path = "/hello")
public class HelloController {/*** 处理超链接发送出来的请求** @return*/// 配置映射的配置@RequestMapping(path = "/mvc")public String sayHello() {System.out.println("入门方法执行了...");// 跳转的JSP页面的路径,默认使用的是请求的转发// return "/WEB-INF/pages/suc.jsp";// 配置了视图解析器后,写法return "suc";}
}

测试

在这里插入图片描述

当我们点击链接之后

在这里插入图片描述
控制台
在这里插入图片描述

SpringMVC执行过程分析

1. load-on-startup标签

load-on-startup标签可以设置servlet的加载优先级别和容器是否在启动时加载该servlet,如下设置:

<load-on-startup>1</load-on-startup>

当值为0或者大于0时,代表容器启动时加载该servlet。
正数的值越小,启动时加载该servlet的优先级越高;

如果为负数,则容器启动时不会加载该servlet,只有该servlet被选择时才会加载(也就是懒加载)

当启动Tomcat服务器的时候,因为dispatcherServlet配置了load-on-startup标签,而且为1,所以容器启动时就会加载,而且最优先加载

    <!--配置前端控制器--><servlet><servlet-name>dispatcherServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!--加载springmvc.xml配置文件,配置的是Spring配置--><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc.xml</param-value></init-param><!--配置启动加载--><load-on-startup>1</load-on-startup></servlet>

dispatcherServlet的加载会创建DispatcherServlet对象进而就会加载springmvc.xml配置文件

2. springmvc.xml配置文件加载,bean的导入

<!-- 配置spring创建容器时要扫描的包 --><context:component-scan base-package="com.qcby.mySpringMVC01"></context:component-scan><!-- 配置视图解析器 --><bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/pages/"></property><property name="suffix" value=".jsp"></property></bean><!--配置日期类型转换器,类型转换器的组件,把日期类型转换注入到组件对象中--><bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"><property name="converters"><set><bean class="com.qcby.mySpringMVC01.converter.StringToDate" /></set></property></bean><!--让映射器、适配器和处理器生效(默认不配置也是可以的)--><mvc:annotation-driven conversion-service="conversionService"/> <!--conversion-service="conversionService" --><!-- 配置spring开启注解mvc的支持--><mvc:annotation-driven></mvc:annotation-driven>

开启了注解扫描,所以就会将com.qcby.mySpringMVC01包内的自动将注解标注的bean导入bean容器中

HelloController对象就会被创建

还有视图解析器viewResolver等,都会导入bean容器

3. 浏览器发送请求给HelloController之后,web对请求的处理以及响应

3.1 web的组件

前端控制器(DispatcherServlet)
处理器映射器(HandlerMapping)
处理器(Handler)
处理器适配器(HandlAdapter)
视图解析器(View Resolver)
视图(View)

他们互相配合完成整个web的请求处理与响应
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  1. 从index.jsp发送请求,
  2. 请求先到达DispatcherServlet核心控制器
  3. DispatcherServlet请求HandlerMapping,返回需要执行的所有方法的链(本demo没有这些,一般就是一些过滤器,拦截器之类的)
  4. 将/hello/mvc/发送给处理器适配器(HandlAdapter),根据@RequestMapping的值匹配到HelloController的hello方法,然后执行此方法
  5. 由于没有@Response注解,所以默认返回ModelAndView,这里的返回字符串suc是是一种简写,本质上就是new 一个 ModelAndView对象,然后setView(“suc”)
  6. 将viewName为suc的ModelAndView对象返回给流程中心控制器DispatcherServlet,DispatcherServlet将suc取出,发送给spring的视图解析器viewResolver
  7. 视图解析器将对suc拼接前缀/WEB-INF/pages/+拼接后缀.jsp,然后查找是否在该路径下存在jsp视图,若存在,则返回
    该jsp视图给DispatcherServlet
  8. DispatcherServlet将model数据拼接到jsp视图的${}上,最后渲染成view视图,响应给服务器

上述八个步骤是三张图结合起来看最后得到的结论

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/38304.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于SpringBoot的超市进销存系统

你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot框架 工具&#xff1a;MyEclipse、Tomcat 系统展示 首页 首页界面图 个人中心 个人中心…

ESP32实现UDP连接——micropython版本

代码&#xff1a; import network import socket import timedef wifiInit(name, port):ap network.WLAN(network.AP_IF) # 创建一个热点ap.config(essidname, authmodenetwork.AUTH_OPEN) # 无需密码ap.active(True) # 激活热点ip ap.ifconfig()[0] # 获取ip地址print(…

【D3.js in Action 3 精译】1.1.2 D3.js 的适用场景

译注 上一节中我们了解了 D3 诞生的技术背景——为了满足 Web 可访问数据的可视化需求。本节再来看看 D3.js 的适用场景是怎样的、在什么时候会考虑使用 D3.js。 1.1.2 D3.js 的适用场景 数据可视化领域正蓬勃发展&#xff0c;且备受青睐。过去十年间用于生成数据驱动图形的工…

Linux—进程与计划管理

目录 一、程序 二、进程 1、什么是进程 2、进程的特点 3、进程、线程、携程 3.1、进程 3.2、线程 3.3、携程 三、查看进程信息 1、ps -aux 2、ps -elf 3、top ​3.2、输出内容详解 3.2.1、输出第一部分解释 3.2.2、输出第二部分解释 4、pgrep 5、pstree 四、进…

【项目】论坛系统项目自动化测试

论坛系统项目自动化测试 前述一、脑图二、代码编写1.公共类InitAndEnd1.登录页面测试ForumLoginTest正常登录&#xff1a;异常登录&#xff1a; 3.注册页面测试ForumRegisterTest注册成功&#xff1a;注册失败&#xff1a; 4论坛列表页面测试ForumListTest登录状态下&#xff1…

1.spring入门案例

Spring 介绍 Spring是轻量级的开源的JavaEE框架。 Spring有两个核心部分&#xff1a;IOC和AOP IOC 控制反转&#xff0c;把创建对象过程交给Spring进行管理。 AOP 面向切面&#xff0c;不修改源代码进行功能增强。 Spring特点 1.方便解耦&#xff0c;简化开发。 2.AOP编…

算法体系-25 第二十五节:窗口内最大值或最小值的更新结构

一 滑动窗口设计知识点 滑动窗口是什么&#xff1f; 滑动窗口是一种想象出来的数据结构&#xff1a; 滑动窗口有左边界L和有边界R 在数组或者字符串或者一个序列上&#xff0c;记为S&#xff0c;窗口就是S[L..R]这一部分 L往右滑意味着一个样本出了窗口&#xff0c;R往右滑意味…

【MySQL】库的操作【创建和操纵】

文章目录 1.创建数据库1.1字符集和校验规则1.查看系统默认字符集以及校验规则2.查看数据库支持的字符集以及校验规则 1.2校验规则对数据库的影响1.创建一个数据库&#xff0c;校验规则使用utf8_ general_ ci[不区分大小写]2.创建一个数据库&#xff0c;校验规则使用utf8_ bin[区…

flask的基本使用2

上一篇我们介绍了基本使用方法 flask使用 【 1 】基本使用 from flask import Flask# 1 实例化得到对象 app Flask(__name__)# 2 注册路由--》写视图函数 app.route(/) def index():# 3 返回给前端字符串return hello worldif __name__ __main__:# 运行app&#xff0c;默认…

idea的代码提示插件使用记录

安装ai插件卸载之后&#xff0c;偶尔还是idea一直占用100%&#xff0c;将idea缓存全清理了&#xff0c;重新生成之后就正常了 idea官方插件 下面几个感觉…基本没有感觉 按行提示的偶尔有提示&#xff0c;&#xff08;cpu占用不小&#xff0c;提示不强&#xff09; 缺点&am…

Sentinel解决雪崩问题

我们或多或少都对雪崩问题有点了解&#xff0c;在微服务系统中&#xff0c;各个微服务互相调用&#xff0c;关系错综复杂&#xff0c;如果其中一个微服务挂了或者处理消息的速度大幅下降&#xff0c;需要被处理的消息越积越多&#xff0c;那么影响的不仅仅是本微服务的功能&…

C++ | Leetcode C++题解之第199题二叉树的右视图

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<int> rightSideView(TreeNode* root) {unordered_map<int, int> rightmostValueAtDepth;int max_depth -1;stack<TreeNode*> nodeStack;stack<int> depthStack;nodeStack.push(ro…

SCI二区|北极海鹦优化算法(APO)原理及实现【免费获取Matlab代码】

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献5.代码获取 1.背景 2024年&#xff0c;W Wang受到北极海鹦的生存和捕食行为启发&#xff0c;提出了北极海鹦优化算法&#xff08;Arctic Puffin Optimization, APO&#xff09;。 2.算法原理 2.1算法思想 …

Tcmalloc工具定位内存泄漏问题

内存泄漏问题定位 gperftools工具安装 执行如下操作&#xff1a; git clone https://github.com/gperftools/gperftools.git 注&#xff1a;如果网速较慢&#xff0c;可直接去下载压缩包。 如我下载的地址&#xff1a;https://github.com/gperftools/gperftools/releases/ta…

SA 注册流程

目录 1. UE开机后按照3GPP TS 38.104定义的Synchronization Raster搜索特定频点 2.UE尝试检测PSS/SSS&#xff0c;取得下行时钟同步&#xff0c;并获取小区的PCI&#xff1b;如果失败则转步骤1搜索下一个频点&#xff1b;否则继续后续步骤&#xff1b; 3.解析Mib&#xff0c;…

WDG看门狗

1 WDG 1.1 简介 WDG是看门狗定时器&#xff08;Watchdog Timer&#xff09;的缩写&#xff0c;它是一种用于计算机和嵌入式系统中的定时器&#xff0c;用来检测和恢复系统故障。 看门狗就像是一个忠诚的宠物狗&#xff0c;它时刻盯着你的程序&#xff0c;确保它们正常运行。…

SpringBoot启动出错:无法访问org.springframework.boot.autoconfigure.SpringBootApplication

无法访问org.springframework.boot.autoconfigure.SpringBootApplication类文件具有错误的版本 61.0&#xff0c;应为 52.0请删除该文件或确保该文件位于正确的类路径子目录中。 出现该问题是由于版本不兼容&#xff0c; 在pom.xml文件中&#xff0c;修改版本为2开头即可

一个用于Win的自动复制文本的工具:Auto_Copy

自动复制工具 这是一个用在 Windows 上的的小工具,会将你选中的任何文本保存下来,可以通过点击右键粘贴选中内容。 一、灵感来源: 在使用Mobaxterm时,我注意到其软件中具备选中即自动复制和右键直接粘贴的功能。但是,这种选中自动复制的功能仅在软件内部有效。由于这一功…

数字图像处理之【高斯金字塔】与【拉普拉斯金字塔】

数字图像处理之【高斯金字塔】与【拉普拉斯金字塔】 1.1 什么是高斯金字塔&#xff1f; 高斯金字塔&#xff08;Gaussian Pyramid&#xff09;是一种多分辨率图像表示方法&#xff0c;用于图像处理和计算机视觉领域。它通过对原始图像进行一系列的高斯平滑和下采样操作&#x…

RTMP推流到SRS流媒体服务器消息处理

RTMP推流到SRS流媒体服务器消息处理 SRS和客户端是怎么交换消息的&#xff1f;各个消息有什么作用&#xff1f;握手成功后&#xff0c;SRS和客户端进行消息交换&#xff0c;对应wiresharek这部分截图&#xff1a; 流程图&#xff08;之前画的&#xff0c;可能不够详细&#xf…