探讨SpringMVC的工作原理

news/2024/7/8 3:47:27 标签: java

SpringMVC是Spring框架的一部分,是用于构建Web应用程序的一个模块。SpringMVC遵循Model-View-Controller(MVC)设计模式,帮助开发者将应用程序的业务逻辑、控制逻辑和表示层分离。以下是SpringMVC的工作原理及其核心组件的详细介绍。

工作原理

SpringMVC的工作流程如下:

  1. 客户端请求

    • 客户端(如浏览器)发送HTTP请求到服务器。
  2. 前端控制器(DispatcherServlet)

    • 请求首先到达DispatcherServlet(前端控制器),这是SpringMVC的核心组件,用于协调不同的组件处理请求。
    • DispatcherServlet配置在web.xml或Spring Boot的自动配置中。
  3. 请求映射(HandlerMapping)

    • DispatcherServlet通过HandlerMapping查找处理请求的合适的处理器(Handler)。
    • HandlerMapping会依据请求的URL、HTTP方法等信息匹配合适的处理器。
  4. 处理器(Handler)

    • 处理器通常是一个@Controller注解标识的类的方法。
    • 处理器执行具体的业务逻辑,并返回一个ModelAndView对象,包含视图名称和模型数据。
  5. 视图解析器(ViewResolver)

    • DispatcherServlet通过ViewResolver解析视图名称,确定实际的视图(通常是JSP、Thymeleaf模板等)。
  6. 视图渲染

    • 解析后的视图会结合模型数据进行渲染,生成最终的HTML响应。
  7. 响应返回

    • 生成的HTML响应返回给客户端,完成整个请求-响应过程。

核心组件

DispatcherServlet
  • 作用:前端控制器,负责接收请求,协调不同组件处理请求。
  • 职责
    • 初始化并加载Spring上下文。
    • 将请求分发给合适的处理器。
    • 将处理结果协调给视图进行渲染。
HandlerMapping
  • 作用:根据请求URL和其他属性找到合适的处理器。
  • 常用实现
    • RequestMappingHandlerMapping:基于注解的映射机制,例如@RequestMapping。
HandlerAdapter
  • 作用:负责调用处理器的方法。
  • 职责
    • 通过反射调用处理器方法,传递请求参数。
    • 处理器返回ModelAndView对象后,HandlerAdapter负责协调视图解析和渲染。
Controller
  • 作用:处理具体的业务逻辑。
  • 实现
    • 使用@Controller注解标识的类。
    • 使用@RequestMapping等注解定义请求映射。
ViewResolver
  • 作用:解析视图名称,确定实际视图。
  • 常用实现
    • InternalResourceViewResolver:解析JSP视图。
    • ThymeleafViewResolver:解析Thymeleaf模板视图。
View
  • 作用:视图用于渲染最终的HTML响应。
  • 职责
    • 结合模型数据生成HTML响应。
    • 常用视图技术包括JSP、Thymeleaf、Freemarker等。

示例代码

Controller
 

java复制代码

@Controller public class HelloController { @RequestMapping("/hello") public ModelAndView hello() { ModelAndView mav = new ModelAndView(); mav.setViewName("hello"); mav.addObject("message", "Hello, SpringMVC!"); return mav; } }

配置DispatcherServlet

web.xml配置

 

xml复制代码

<web-app> <servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring-servlet.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>

Spring配置文件(spring-servlet.xml)

 

xml复制代码

<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.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <context:component-scan base-package="com.example.controller"/> <mvc:annotation-driven/> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/"/> <property name="suffix" value=".jsp"/> </bean> </beans>

视图文件(hello.jsp)

 

jsp复制代码

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <!DOCTYPE html> <html> <head> <title>Hello</title> </head> <body> <h1>${message}</h1> </body> </html>

总结

SpringMVC通过DispatcherServlet作为前端控制器,协调请求处理过程中的各个组件,包括HandlerMapping、HandlerAdapter、Controller、ViewResolver和View等。它依据MVC设计模式,将业务逻辑、控制逻辑和表示层分离,从而提高代码的可维护性和扩展性。通过SpringMVC,开发者可以方便地构建灵活且高效的Web应用程序。


http://www.niftyadmin.cn/n/5536448.html

相关文章

大量数据渲染怎么优化速度

1. 分页加载 将数据分成若干份&#xff0c;每次请求当前页数据&#xff0c;在触底加载更多或者点击分页时加载下一页数据。 2. 虚拟列表 只渲染当前视口的数据&#xff0c;当用户滚动时动态更新视口里的内容&#xff0c;并不是一次渲染整个列表&#xff0c;这个方法比较适用…

dolphinscheduler-笔记1

后端搭建开发环境 一. 基础插件 maven&#xff08;3.9.7&#xff09; maven必须升级到3.9.x版本&#xff0c;不然打包会异常jdk&#xff08;1.8&#xff09;zookeeper&#xff08;3.8.4&#xff09;mysql或者pg&#xff08;使用mysql&#xff09; 二. 代码修改点 链接&…

RKNN3588——YOLOv8的PT模型转RKNN模型

一&#xff1a;PT转ONNX 1. 首先克隆rknn修改后的ultralytics版本项目到本地 https://github.com/airockchip/ultralytics_yolov8 cd ultralytics-main pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple pip install -e . 主要是修改了源码的ul…

记一次kafka使用不当导致的服务器异常

一、背景 1.运维反馈服务器cpu高&#xff0c;且高达80% 2.经过排查发现kafka出现消息积压情况 3.使用的是springboot kafka框架 dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactId> </dependency…

AI会取代人力?

前言 AI是在帮助开发者还是取代他们&#xff1f; AI&#xff08;人工智能&#xff09;在软件开发和更广泛的科技领域中&#xff0c;既是一个强大的辅助工具&#xff0c;也是一个推动行业变革的力量。关于AI是否在帮助开发者还是取代他们&#xff0c;这个问题其实涉及到了多个…

k8s-第十一节-Job和CronJob

Job Kubernetes jobs主要是针对短时和批量的工作负载。它是为了结束而运行的,而不是像deployment、replicasets、replication controllers和DaemonSets等其他对象那样持续运行。 Kubernetes Jobs会一直运行到Job中指定的任务完成。也就是说,如果pods给出退出代码0,那么Job…

五.核心动画 - 图层的变换(平移,缩放,旋转,3D变化)

引言 在上一篇博客中&#xff0c;我们研究了一些视觉效果&#xff0c;在本篇博客中我们将要来讨论一下图层的旋转&#xff0c;平移&#xff0c;缩放&#xff0c;以及可以将扁平物体转换成三维空间对象的CATransform3D。 图层变换 图层的仿射变换 在视图中有一个transform属…

TYPE-C转DC转接头方案,ECP5701支持5V、9V、12V、15V、20V电压输出

如今随着这几年的USB-C PD适配器的普及&#xff0c;消费者手上的PD适配器越来越普遍&#xff0c;如何让以前的电源适配器也可以用上PD适配器呢&#xff1f;如此一来以前的电源适配器坏了&#xff0c;就不需要费心费力的寻找相同的适配器进行更换&#xff0c;甚至于只能将整个设…