“深入探究SpringMVC的工作原理与入门实践“

news2024/12/23 23:07:08

目录

  • 引言
    • 1. 什么是SpringMVC?
      • 1.1. 模型
      • 1.2. 视图
      • 1.3. 控制器
    • 2. SpringMVC的工作流程
      • 2.1. 客户端发送请求
      • 2.2. DispatcherServlet的处理
      • 2.3. 处理器映射器的使用
      • 2.4. 处理器的执行
      • 2.5. 视图解析器的使用
      • 2.6. 视图的渲染
    • 3. SpringMVC的核心组件
    • 4. 弹簧MVC
    • 总结

在这里插入图片描述

引言

SpringMVC是一个流行的Java Web开发框架,它提供了一种优雅的方式来构建灵活、可扩展的Web应用程序。本文将介绍SpringMVC的基本概念,深入探讨其工作流程和核心组件,并提供一个入门程序来帮助读者快速上手。

1. 什么是SpringMVC?

SpringMVC是基于Java的MVC(Model-View-Controller)设计模式的Web框架。它通过将应用程序分为模型、视图和控制器三个部分,实现了松耦合和高内聚的架构。SpringMVC提供了丰富的功能和灵活的配置选项,使得开发者能够快速构建可维护和可扩展的Web应用程序。

1.1. 模型

模型代表应用程序的数据和业务逻辑。它可以是一个POJO(Plain Old Java Object)或一个持久化实体类。模型负责处理数据的读取、存储和验证,并提供给视图和控制器使用。

1.2. 视图

视图负责展示模型的数据给用户。它可以是一个JSP页面、HTML模板或其他类型的视图技术。视图通常是被动的,只负责展示数据,不处理业务逻辑。

1.3. 控制器

控制器接收用户的请求并根据请求的内容选择合适的处理逻辑。它负责处理用户输入、调用模型的方法来处理数据,并将处理结果传递给视图进行展示。

2. SpringMVC的工作流程

SpringMVC的工作流程可以分为以下几个步骤:

2.1. 客户端发送请求

  1. 用户发来一个请求,首先进入的是前端控制器DispatcherServlet

2.2. DispatcherServlet的处理

  1. 前端控制器(DispacherServlet)将用户发来的请求发送给处理器映射器(HandlerMapping)
  2. 处理器映射器根据前端控制器发来的用户的请求找到对应符合的控制器(Handler),并且将其封装成处理器执行链,返回给前端控制器。

2.3. 处理器映射器的使用

  1. 处理器适配器 (HandlerAdaptoer) 会调用对应的具体的 Controller(处理业务逻辑)
  2. 处理器适配器接收到来自前端控制器的执行链后,找到对应执行此执行链的处理器适配器(HandlerAdapter)来调用的具体的控制器(就是说其对应的方法或者逻辑)

2.4. 处理器的执行

  1. 控制器执行完成后,会返回一个ModelAndView对象给处理器适配器
  2. 处理器适配器将返回来的ModelAndView对象返回给前端控制器(到这里所有的业务处理过程就要完了,接下就是将结果以页面的的形式响应给用户)

2.5. 视图解析器的使用

  1. 前端控制器将返回回来的ModelAndView对象交给视图解析器(ViewResolver),视图解析器根据传过来的View对象解析成对应的页面对象
  2. ViewResolver 将封装好的将页面对象和Model对象返回给 DIspatcherServlet

2.6. 视图的渲染

  1. 前端控制器再将返回回来的对象交给视图(View)
  2. 视图根据传过来的Model对象再一次的对页面进行渲染(将模型数据填充至视图中),然后在返回给前端控制器。
  3. 前端控制器将完成的结果响应给浏览器,然后浏览器在展现给用户。

3. SpringMVC的核心组件

SpringMVC的核心组件包括:

  • 3.1. 调度程序服务版
    DispatcherServlet是SpringMVC的前端控制器,负责接收和分发请求。
  • 3.2. 处理器映射器(处理程序映射)
    处理器映射器负责将请求映射到合适的处理器(Controller)。
  • 3.3. 处理器适配器(处理程序适配器)
    处理器适配器负责调用处理器的方法来处理请求。
  • 3.4. 视图解析器(View Resolver)
    视图解析器负责将逻辑视图名解析为真正的视图对象。
  • 3.5. 视图(视图)
    视图负责展示处理结果给用户。

4. 弹簧MVC

下面是一个简单的SpringMVC入门程序的示例:
4.1. 创建Maven项目
首先,我们需要创建一个Maven项目,并添加SpringMVC的依赖。
pom.xml依赖

<!-- jstl+standard -->
<jstl.version>1.2</jstl.version>
<standard.version>1.1.2</standard.version>
<!-- spring -->
<spring.version>5.0.2.RELEASE</spring.version>
...
<!-- 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>

4.2. 配置网页.xml
在web.xml文件中,我们需要配置DispatcherServlet和Spring容器。
4.3. 创建控制器
创建一个spring-mvc.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"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
      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">
    <!--1) 扫描com.zking.zf及子子孙孙包下的控制器(扫描范围过大,耗时)-->
    <context:component-scan base-package="com.yuan"/>

    <!--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>

demo1Controller.java

package com.yuan.web;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * @author 叶秋
 * @site
 * @company 卓京公司
 * @create 2023-09-04 17:01
 */
@Controller
@RequestMapping("/main")
public class demo1Controller {

    @RequestMapping("/index")
    public String demo1(){
        System.out.println("hello  spring");
        return "index";
    }
}

4.4. 配置SpringMVC
在Spring的配置文件中,我们需要配置处理器映射器、视图解析器等。
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_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>

4.5. 编写JSP视图
创建一个JSP视图来展示处理结果。

<%--
  Created by IntelliJ IDEA.
  User: yuanh
  Date: 2023/9/4
  Time: 17:04
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
hello word

</body>
</html>

4.6. 运行程序
最后,我们可以运行程序并在浏览器中访问相应的URL来查看结果。
在这里插入图片描述

总结

本文深入探讨了SpringMVC的工作原理和核心组件,并提供了一个入门程序来帮助读者快速上手。通过理解SpringMVC的工作流程和组件的作用,开发者可以更好地使用该框架来构建高效、可靠的Web应用程序。希望本文对您有所帮助,谢谢阅读!

补充:访问资源绕过解析器不被拦截代码

 <!--4) 单独处理图片、样式、js等资源 -->
    <!-- <mvc:resources location="/css/" mapping="/css/**"/>
     <mvc:resources location="/js/" mapping="/js/**"/>
     <mvc:resources location="WEB-INF/images/" mapping="/images/**"/>-->
    <mvc:resources location="/static/" mapping="/static/**"/>

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

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

相关文章

Java 多线程系列Ⅳ(单例模式+阻塞式队列+定时器+线程池)

多线程案例 一、设计模式&#xff08;单例模式工厂模式&#xff09;1、单例模式2、工厂模式 二、阻塞式队列1、生产者消费者模型2、阻塞对列在生产者消费者之间的作用3、用标准库阻塞队列实现生产者消费者模型4、模拟实现阻塞队列 三、定时器1、标准库中的定时器2、模拟实现定时…

WinXP 蓝屏死机,并报代码0x0000007B的错误

蓝屏死机&#xff0c;并报代码0x0000007B的错误&#xff0c;通常情况都是硬盘的存储控制器驱动加载错误导致故障。导致驱动加载错误的情况&#xff0c;可能有以下三种情况&#xff1a; 1、无法自动识别硬盘控制器 使用非正版的操作系统光盘&#xff08;进过修改或者加强的Wind…

doris多租户资源隔离及权限管理

Doris 的多租户和资源隔离方案&#xff0c;主要目的是为了多用户在同一 Doris 集群内进行数据操作时&#xff0c;减少相互之间的干扰&#xff0c;能够将集群资源更合理的分配给各用户。 该方案主要分为两部分&#xff0c;一是集群内节点级别的资源组划分&#xff0c;二是针对单…

明星录制祝福视频:传递温情与关怀的独特方式

在当今社交媒体和数字化时代&#xff0c;明星录制祝福视频已经成为一种新颖而独特的方式&#xff0c;用来表达温馨祝福、分享喜悦&#xff0c;或者为特殊的时刻增添一份特别的意义。无论是生日、结婚、毕业&#xff0c;还是节日、活动等&#xff0c;明星录制的祝福视频能够让人…

VUVLO电压监测器的工作原理、应用及性能分析 | 百能云芯

在现代电子设备中&#xff0c;电压监测是确保稳定性和可靠性的关键。VUVLO电压监测器是一种重要的电子元件&#xff0c;它的作用是监测电源电压&#xff0c;并在电压低于或高于设定值时触发相应的操作。在本文中&#xff0c;我们将深入探讨VUVLO电压监测器的工作原理、应用领域…

Windows下搭建MavLink通信协议环境,并用C++程序测试

搭建环境 git克隆 git clone https://github.com/mavlink/mavlink.git --recursive安装python的future库 pip install future使用可视化工具生成mavlink库 XML是选择消息格式&#xff0c;也可以自定义Out是输出路径Language是生成的语言&#xff0c;我这里是CProtocol是协议…

Linux--I/O复用之select

目录 一&#xff1a;概念 二&#xff1a;使用 三&#xff1a;参数介绍&#xff1a; 1.ndfs&#xff1a; 2.fd_set类型&#xff1a; 3.readfds&#xff1a; 4.writefds&#xff1a; 5.exceptfds&#xff1a; 6.timeout&#xff1a; 7.返回值&#xff1a; 四&#xff1…

1.2 互联网概述

思维导图&#xff1a; 主要内容 &#xff1a; 这段话描述了“互联网”的基本概念和组成。首先&#xff0c;强调了该段文本主要是关于计算机网络的讨论&#xff0c;而不是关于电信网络或有线电视网络。 接下来&#xff0c;描述了计算机网络的基本构成&#xff0c;由结点&…

23062网络编程day8

将dict.txt导入到数据库中&#xff08;单词一列&#xff0c;意思一列&#xff09; #include <myhead.h> int main(int argc, const char *argv[]) {//打开数据库sqlite3 *db;if(sqlite3_open("./dict.db",&db) ! SQLITE_OK){fprintf(stderr,"sqlite3…

零代码编程:用ChatGPT批量整理excel表格数据

有这样一个表格&#xff0c;里面内容从pdf复制而来&#xff0c;只想保留专精特新示范企业名单&#xff0c;删除其他无关内容。 可以在ChatGPT中输入如下提示词&#xff1a; 你是一个Python编程专家&#xff0c;写一段代码&#xff0c;实现批量删除excel表格中特定单元格内容的…

【Element】Vue+Element表单校验详解

Element表单校验 作为一个后端开发&#xff0c;总结一下实际工作中表单校验的场景和用法。 Element官网&#xff1a;https://element.eleme.cn/#/zh-CN/component/form 代码地址&#xff1a;https://gitee.com/kkmy/kw-microservices/tree/master/kw-ui/kwsphere 常用表单校验场…

小程序中如何查看会员的余额和变更记录

​通过查看会员的余额和变更记录&#xff0c;可以帮助商家更好地管理会员资金&#xff0c;提供更好的服务和用户体验。下面将介绍小程序中如何查看会员的余额以及余额的变更记录。 1. 找到指定的会员卡。在管理员后台->会员管理处&#xff0c;找到需要查看余额和记录的会员…

【系统设计系列】 回顾可扩展性

系统设计系列初衷 System Design Primer&#xff1a; 英文文档 GitHub - donnemartin/system-design-primer: Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. 中文版&#xff1a; https://github.com/donnemart…

猫头虎博主赠书二期:《Go黑帽子 渗透测试编程之道(安全技术经典译丛) 》

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

volatile+SIGCHLD信号+可重入函数(了解)

索引 volatile1.gcc -O含义及其作用2.证明其内存可见性 深入理解SIGCHLD信号SIGCHLD总结 可重入函数 volatile 保存内存的可见性&#xff0c;告知编译器&#xff0c;该关键字修饰的变量不允许被优化&#xff0c;对该变量的任何操作都必须在内存中操作。 1.gcc -O含义及其作用…

JVM垃圾回收机制和常用算法(简洁版)

垃圾收集 (Garbage Collection,GC) 垃圾收集主要是针对堆和方法区进行。程序计数器、虚拟机栈和本地方法栈这三个区域属于线程私有的&#xff0c;只存在于线程的生命周期内&#xff0c;线程结束之后就会消失&#xff0c;因此不需要对这三个区域进行垃圾回收。 判断一个对象是…

QTday5作业

Tcp服务器 源文件 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//给服务器指针实例化对象server new QTcpServer(this); //此时就创建了一个服务器}Widg…

Android数据结构和算法总结-字符串相关高频面试题算法

前言 周末闲来无事&#xff0c;在七月在线上看了看字符串相关算法的讲解视频&#xff0c;收货颇丰&#xff0c;跟着视频讲解简单做了一下笔记&#xff0c;方便以后翻阅复习同时也很乐意分享给大家。什么字符串在算法中有多重要之类的大路边上的客套话就不多说了&#xff0c;直…

linux删除了业务进程正在使用的文件,又不能停止进程,如何释放文件占用的磁盘空间

一台linux分区使用率告警&#xff0c;同事为了清理空间&#xff0c;通过du -sh *查到应用的日志文件占用很高&#xff0c;他直接rm删除了日志文件。但df -h看分区空间并没有释放。 执行lsof | grep delete可以看到刚刚删除的文件因为被正在运行的进程调用所以并没有释放磁盘空间…

优维产品最佳实践:如何设计流水线?

前言&#xff1a;我们上期介绍了什么是CI以及CI的重要性&#xff0c;本期目标就是学习如何设计流水线&#xff0c;流水线是一种用于自动化软件开发和部署的工具链&#xff0c;它可以将软件开发过程中的各个步骤组织成一个连续的流程&#xff0c;从而提高开发效率和软件质量。在…