在了解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
视图:View
在SpringMVC
中是一个接口,实现类支持不同的类型,例如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会调用HelloController
的hello
方法,该方法返回helloPage.jsp
视图,并将message
属性插入HTML中。
我们也可以使用Maven构建此项目,然后部署到您选择的Servlet容器中(如Tomcat)