SpringMVC工作原理

在了解SpringMVC的工作原理之前,首先认识一些常用组件:

DispatcherServlet前端控制器:接收请求,响应结果,相当于转发器,是整个流程控制的中心,由它调用其它组件处理用户的请求,因此也可称为中央处理器。有了它之后,可以很大程度上减少其它组件之间的耦合度。

HandlerMapping处理映射器:主要负责根据请求路径查找Handler处理器,也就是根据用户的请求路径找到具体的Java方法,具体是如何找到的呢?是根据映射关系查找的,SpringMVC提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。

HandlerAdapter处理适配器:就是一个用于执行Handler处理器的组件,会根据客户端不同的请求方式(get/post/...),执行对应的Handler。说人话就是前面的组件定位到具体Java方法后,用来执行Java方法的组件。

Handler处理器:其实这也就是包含具体业务操作的Java方法,在SpringMVC中会被包装成一个Handler对象。

ViewResolver视图解析器::对业务代码执行完成之后的结果进行视图解析,根据逻辑视图名解析成真正的视图,比如controller方法执行完成之后,return的值是index,那么会对这个结果进行解析,将结果生成例如index.jsp这类的View视图。
ViewResolver工作时,会首先根据逻辑视图名解析成物理视图名,即具体的页面地址,然后再生成View视图对象,最后对视图进行渲染,将处理结果通过页面展示给用户。
SpringMVC提供了很多的View视图类型,如:jstlView、freemarkerView、pdfView等,前面我们配置的JSP视图解析器则是JstlView,这里也可以根据模板引擎的不同,选择不同的解析器。

View视图ViewSpringMVC中是一个接口,实现类支持不同的类型,例如jsp、freemarker、ftl...,不过现在一般都是前后端分离的项目,因此也很少再用到这块内容,视图一般都成了html页面,数据结果的渲染工作也交给了前端完成。

自己也是初学就用网上的图了,比较简洁明了

(1)、 用户发送请求至前端控制器DispatcherServlet。

(2)、 DispatcherServlet(前端控制器)收到请求调用HandlerMapping处理器映射器

(3)、 处理器映射器(HandlerMapping)找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet(前端控制器)。 (4)、 DispatcherServlet(前端控制器)调用HandlerAdapter处理器适配器。

(5)、 HandlerAdapter(处理器适配器)经过适配调用具体的处理器(Controller,也叫后端控制器)。

(6)、 Controller(后端控制器)执行完成返回ModelAndView(模型和视图)。

(7)、 HandlerAdapter(处理器映射器)将controller执行结果ModelAndView返回给DispatcherServlet(前端控制器)。

(8)、 DispatcherServlet(前端控制器)将ModelAndView(模型和视图传给ViewReslover视图解析器。

(9)、 ViewReslover(视图解析器)解析后返回具体View。

(10)、 DispatcherServlet(前端控制器)根据View进行渲染视图(即将模型数据填充至视图中)。

(11)、 DispatcherServlet(前端控制器)响应用户。

项目结构

spring-mvc-example
│
├── src
│   ├── main
│   │   ├── java
│   │   │   └── com
│   │   │       └── example
│   │   │           └── controller
│   │   │               └── HelloController.java
│   │   ├── resources
│   │   │   └── application.properties
│   │   └── webapp
│   │       ├── WEB-INF
│   │       │   ├── views
│   │       │   │   └── helloPage.jsp
│   │       │   └── web.xml
│   └── test
├── pom.xml
└── README.md

1. 控制器(HelloController.java)

package com.example.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class HelloController {

    @RequestMapping(value = "/hello", method = RequestMethod.GET)
    public String hello(Model model) {
        model.addAttribute("message", "Hello, Spring MVC!");
        return "helloPage";
    }
}

2. 视图(helloPage.jsp)

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Hello Page</title>
</head>
<body>
    <h1>${message}</h1>
</body>
</html>

3. 配置文件(application.properties)

# Spring MVC Configuration
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp

4. 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>dispatcher</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>dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

5. Spring MVC配置文件(dispatcher-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"
       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>

6. 项目依赖(pom.xml)

<dependencies>
    <!-- Spring MVC -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.3.10.RELEASE</version>
    </dependency>

    <!-- JSP and JSTL -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>4.0.1</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>javax.servlet.jsp</groupId>
        <artifactId>javax.servlet.jsp-api</artifactId>
        <version>2.3.3</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>javax.servlet.jsp.jstl</groupId>
        <artifactId>javax.servlet.jsp.jstl-api</artifactId>
        <version>1.2.1</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.web</groupId>
        <artifactId>javax.servlet.jsp.jstl</artifactId>
        <version>1.2.6</version>
    </dependency>
</dependencies>

这个示例中,我们创建了一个基本的Spring MVC应用程序,包括控制器、视图、配置文件和依赖项。当客户端访问/hello时,Spring MVC会调用HelloControllerhello方法,该方法返回helloPage.jsp视图,并将message属性插入HTML中。

我们也可以使用Maven构建此项目,然后部署到您选择的Servlet容器中(如Tomcat)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

师范大学通信大怨总

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值