基本概念
- 一种轻量级的、基于MVC的Web层应用框架。偏前端而不是基于业务逻辑层
- 是Spring框架的一个后续产品
- 天生与Spring框架集成,如:(IOC,AOP)
- 支持Restful风格
- 支持灵活的URL到页面控制器的映射
基本步骤
- 客户端请求提交到
DispatcherServlet
- 由
DispatcherServlet
控制器查询一个或多个HandlerMapping
,找到处理请求的Controller
DispatcherServlet
将请求提交到Controller
(也称为Handler
)Controller
调用业务逻辑处理后,返回ModelAndView
DispatcherServlet
查询一个或多个ViewResoler
视图解析器,找到ModelAndView指定的视图- 视图负责将结果显示到客户端
常用组件
- 将Web层进行了职责解耦,基于请求-响应模型
DispatcherServlet
:即前端控制器,用来接收所有客户端发来的请求(除jsp外),根据URL选择对应的处理器进行处理Controller
:处理器/页面控制器,做的是MVC中的C的事情,但控制逻辑转移到前端控制器了,用于对请求进行处理HandlerMapping
:请求映射到处理器,找谁来处理,如果映射成功返回一个HandlerExecutiongChain
对象(包含一个Handler
处理器(页面控制器)对象、多个HandlerInterceptor
拦截器对象)ViewResolver
: 视图解析器,找谁来处理返回的页面。把逻辑视图解析为具体的View
,进行这种策略模式,很容易更换其他视图技术- 如
InternalResourceViewResolver
将逻辑视图名映射为JSP视图
- 如
LocalResolver
:本地化、国际化MultipartResolver
:文件上传解析器HandlerExceptionResolver
:异常处理器
第一个 HelloWorld 程序
-
目录结构
-
第一步,导包
<dependencies> <!-- spring框架 --> <!-- https://mvnrepository.com/artifact/org.springframework/spring-core --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>5.2.2.RELEASE</version> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework/spring-aop --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>5.2.2.RELEASE</version> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework/spring-beans --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>5.2.2.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.2.2.RELEASE</version> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework/spring-web --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>5.2.2.RELEASE</version> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.2.2.RELEASE</version> </dependency> <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <!-- https://mvnrepository.com/artifact/javax.servlet.jsp/jsp-api --> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.2</version> <scope>provided</scope> </dependency> <!-- https://mvnrepository.com/artifact/commons-logging/commons-logging --> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> </dependency> </dependencies>
-
在 web.xml 中配置
DispatcherServlet
,用来接收所有请求<servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc-servlet.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
init-param
中的contextConfigLocation
用来确定Spring MVC的配置文件的位置;
load-on-startup
确保在开启服务器的时候,就载入DispatcherServlet
-
在
resources
文件夹中加入一个Spring MVC的配置文件<?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 http://www.springframework.org/schema/context/spring-context.xsd "> <!-- 开启组件扫描 --> <context:component-scan base-package="com.du.springmvc"/> <!--使用视图解析器,解析Controller的转发地址--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/"/> <property name="suffix" value=".jsp"/> </bean> </beans>
InternalResourceViewResolver
针对Controller
返回的String,拼凑出一个URL,作为跳转的地址。prefix
为该URL的开头,suffix
为该URL的结尾。 -
编写一个处理器
@Controller // 声明Bean对象,为一个控制器组件 public class HelloController { /** * RequestMapping 确定这是一个请求的处理方法,并确认请求URL的映射地址为 "http://localhost:8080/工程目录/" + "/helloworld" * 方法内部,为处理请求的内容 * @return 返回一个字符串,会到之前定义的视图解析器中,合成一个转发的地址 */ @RequestMapping("/helloworld") String helloWorld() { System.out.println("接受到了请求"); return "hello"; } }
-
视图
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>你好世界</title> </head> <body> 你好世界 </body> </html>