【SSM详细教程】-12-一篇文章了解SpringMVC

ops/2024/10/30 11:08:30/

 精品专题:

01.《C语言从不挂科到高绩点》课程详细笔记

https://blog.csdn.net/yueyehuguang/category_12753294.html?spm=1001.2014.3001.5482

02. 《SpringBoot详细教程》课程详细笔记

https://blog.csdn.net/yueyehuguang/category_12789841.html?spm=1001.2014.3001.5482

03.《SpringBoot电脑商城项目》课程详细笔记

https://blog.csdn.net/yueyehuguang/category_12752883.html?spm=1001.2014.3001.5482

04.《VUE3.0 核心教程》课程详细笔记

https://blog.csdn.net/yueyehuguang/category_12769996.html?spm=1001.2014.3001.5482

================================

||     持续分享系列教程,关注一下不迷路 ||

||                视频教程:墨轩大楼               ||

================================

1. Spring Web MVC 简介

1.1. 什么是MVC

MVC是一种软件架构的思想,将软件按照模型、视图、控制器来划分

M:Model,模型层,指工程中的JavaBean,作用是处理数据 。

V:View,视图层,指工程中的html或jsp等页面,作用是与用户进行交互,展示数据。

C:Controller,控制层,指工程中的servlet,作用是接收请求和响应浏览器

JavaBean分为两类:

  • 一类称为实体类Bean:专门存储业务数据的,如 Student、User 等 。
  • 一类称为业务处理 Bean:指 Service 或 Dao 对象,专门用于处理业务逻辑和数据访问。

MVC的工作流程:

  1. 用户通过视图层发送请求到服务器,在服务器中请求被Controller接收,Controller 。
  2. 调用相应的Model层处理请求,处理完毕将结果返回到Controller,Controller再根据请求处理的结果 。
  3. 找到相应的View视图,渲染数据后最终响应给浏览器。

1.2. 什么是Spring web MVC

Spring Web MVC 是Spring框架一个非常重要的功能模块,实现了MVC结构,便于简单、快速开发MVC结构的Web程序。Spring Web MVC 提供的API封装了Web开发中常用的功能,简化了Web过程。

SpringMVC的特点:

  1. Spring 家族原生产品,与IOC 容器等基础设施无缝对接
  2. 基于原生的Servlet,通过了功能强大的前端控制器DispatcherServlet,对请求和响应进行统一处理 .
  3. 表述层各细分领域需要解决的问题全方位覆盖,提供全面解决方案
  4. 代码清新简洁,大幅度提升开发效率
  5. 内部组件化程度高,可插拔式组件即插即用,想要什么功能配置相应组件即可
  6. 性能卓著,尤其适合现代大型、超大型互联网项目要求

1.3. Spring MVC 入门

首先我们先来搭一个简单的SpringMVC应用,来研究一下它的运行原理。

》》首先基于IDEA创建一个web应用,在pom.xml中添加Springmvc的依赖

 <dependencies><!-- JSTL --><dependency><groupId>javax.servlet</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency><!-- JSTL实现包 --><dependency><groupId>org.apache.taglibs</groupId><artifactId>taglibs-standard-impl</artifactId><version>1.2.5</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.2.6.RELEASE</version></dependency><!-- 必须添加servlet依赖 --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version><scope>provided</scope></dependency><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version><scope>provided</scope></dependency><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><version>${junit.version}</version><scope>test</scope></dependency><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-engine</artifactId><version>${junit.version}</version><scope>test</scope></dependency>
</dependencies>

》》 配置前端控制器

前端控制器(DispactcherServlet)是用来集中处理请求的,它负责接收所有的请求,再将对应的请求转发到其他程序处理,然后再接收处理后的结果。最终将处理好的结果返回给浏览器,其实他就是一个中央处理器,每次请求都需要经过它。

前端控制器需要配置在web.xml中,具体代码如下:

<?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_4_0.xsd"version="4.0"><servlet><servlet-name>dispatcherServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><!--前端控制器将所有的请求都交给springmvc.xml 去处理--><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc.xml</param-value></init-param></servlet><servlet-mapping><servlet-name>dispatcherServlet</servlet-name><!--配置接收所有的请求--><url-pattern>/</url-pattern></servlet-mapping>
</web-app>

》》 创建springMVC的配置文件

SpringMVC 配置管理文件,主要用来根据不同的请求转发到对应的业务逻辑类去处理,并获取处理结果返回给前端控制器,主要配置自动扫描注解以及视图解析器,其内容如下:

<?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.moxuan.study"></context:component-scan><mvc:annotation-driven/><!--    配置视图解析器--><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><!--        在/WEB-INF/view/ 目录下,寻找后缀为.jsp的文件--><property name="prefix" value="/WEB-INF/view/"></property><property name="suffix" value=".jsp"></property></bean></beans>

》》编写控制器

控制器主要作用是为了可以根据不同的URL请求进行相应的业务逻辑处理,控制器类需要创建在springmvc.xml配置的Controller包扫描路径内,这样才能被容器扫描到。

package com.moxuan.study.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;@Controller
public class MainController {/*** @ReuqestMapping  用于绑定客户端请求地址* 下面的配置,当客户端发送http://127.0.0.1:8080/hello时会执行此hello方法* @return*/@RequestMapping("/hello")public ModelAndView hello(){System.out.println("hello,you listen to me! 攀哥 is very 帅");// 创建数据模型ModelAndView mv = new ModelAndView();// 向数据模型中绑定数据,mv.addObject("msg","攀哥 show");// 设置视图名字,用于响应用户请求mv.setViewName("hello");// 由于在springmvc.xml中配置了前缀和后缀// 视图解析器会将数据发向/WEB-INF/view/hello.jsp中// 将数据返回给视图解析器return mv;}
}

》》 编写视图页面

前面一步,我们将数据发送到了/WEB-INF/view/hello.jsp中,接下来我们需要编写这个hello.jsp

<%@taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>hello,攀哥真帅<c:forEach begin="0" end="100"><h2 style="color:red">${msg}</h2></c:forEach></body>
</html>

》》 运行效果:

2. SpringMVC的运行流程:

2.1. 流程图

2.2. 流程描述

  1. 浏览器向Spring发出请求,请求交给前端控制器DispatcherServlet处理。

  1. 控制器通过HandlerMapping找到相应的Controller组件处理请求。

  1. 执行Controller组件中约定的方法处理请求,在约定的方法中调用模型组件完成业务处理,约定方法可以返回一个ModelAndView对象,封装了处理结果数据和视图名称信息。

  1. 控制器接收ModelAndView之后,调用ViewResolver组件,定位view(例如:JSP)并传递数据信息,生成相应界面结果。

2.3. SpringMVC 核心组件

前端控制器DispatcherServlet

接收请求,响应结果,相当于转发器,中央处理器。有了dispatcherServlet减少了其它组件之间的耦合度。用户请求到达前端控制器,它就相当于mvc模式中的c,dispatcherServlet是整个流程控制的中心,由它调用其它组件处理用户的请求,dispatcherServlet的存在降低了组件之间的耦合性。

处理器映射器HandlerMapping

根据请求的url查找Handler,HandlerMapping负责根据用户请求找到Handler即处理器,springmvc提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。

处理器适配器HandlerAdapter

按照特定规则(HandlerAdapter要求的规则)去执行Handler通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,编写Handler时按照HandlerAdapter的要求去做,这样适配器才可以去正确执行Handler通过扩展适配器可以对更多类型的处理器进行执行。

处理器Handler

Handler 是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。由于Handler涉及到具体的用户业务请求,所以一般情况需要工程师根据业务需求开发Handler。

视图解析器ViewResolver

进行视图解析,根据逻辑视图名解析成真正的视图(view)。ViewResolver负责将处理结果生成View视图,ViewResolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。 springmvc框架提供了很多的View视图类型,包括:jstl View、freemarker View、pdf View等。


http://www.ppmy.cn/ops/129562.html

相关文章

(蓝桥杯C/C++)——常用库函数

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 一、 二分查找 1.二分查找的前提 2.binary_ search函数 3.lower_bound和upper_bound 二、排序 1.sort概念 2.sort的用法 3.自定义比较函数 三、全排列 1.next p…

四、Hadoop 命令高级用法深度剖析

Hadoop 命令高级用法深度剖析 在大数据处理领域&#xff0c;Hadoop 作为一个被广泛应用的框架&#xff0c;其所提供的一系列命令在数据操作与管理方面起着至关重要的作用。本文将对 Hadoop 命令的高级用法进行深入探讨&#xff0c;并结合具体实例进行详尽讲解&#xff0c;以助…

Codeforces Round 946 (Div. 3) G. Money Buys Less Happiness Now(反悔贪心)

题目链接 Codeforces Round 946 (Div. 3) G. Money Buys Less Happiness Now 思路 我们维护当前拥有的钱 s u m sum sum和一个大根堆&#xff0c;大根堆记录用了哪些 c i c_{i} ci​。 我们先尝试获得当前月的幸福&#xff0c; s u m s u m − c i sum sum - c_{i} sumsu…

【机器学习】Softmax 函数

Softmax 是机器学习中常用的函数&#xff0c;广泛用于多分类问题的输出层。它可以将一组实数转换为一个概率分布&#xff0c;使得结果满足“非负”和“总和为1”的要求。在分类问题中&#xff0c;Softmax 让模型预测的每个类别概率都易于解释。本文将详细讲解 Softmax 的原理、…

详解:单例模式中的饿汉式和懒汉式

单例模式是一种常用的设计模式&#xff0c;其目的是确保一个类只有一个实例&#xff08;对象&#xff09;&#xff0c;并提供一个全局访问点。单例模式有两种常见的实现方式&#xff1a;饿汉式和懒汉式。 一、饿汉式 饿汉式在类加载时就完成了实例化。因为类加载是线程安全的&…

设计模式06-结构型模式1(适配器/桥接/组合模式/Java)

#1024程序员节&#xff5c;征文# 4.1 适配器模式 结构型模式&#xff08;Structural Pattern&#xff09;的主要目的就是将不同的类和对象组合在一起&#xff0c;形成更大或者更复杂的结构体。结构性模式的分类&#xff1a; ​ 类结构型模式关心类的组合&#xff0c;由多个类…

C语言中的位操作

第一章 变量某位赋值与连续赋值 寄存器 | 值 //例如&#xff1a;a 1000 0011b a | (1<<2) //a 1000 0111 b 单独赋值 a | (3<<2*2) // 1011 0011b 连续赋值 第二章 变量某位清零与连续清零 寄存器 & ~&#xff08;&#xff09; 值 //例子&#xff1a;a …

MATLAB车道检测与跟踪

读了车道检测这个论文&#xff0c;我理解了利用matlab对车道识别算法进行仿真研究&#xff0c;从仿真的结果中提出具有一定实时性鲁棒性的识别方法。车道检测是智能车辆发展的智能因素。近年来对这项目的研究都是针对特定的环境和道路状况给出了不同的解决方案。近年来,自主驾驶…