SpringMVC简介

95 阅读3分钟

一、SpringMVC概述

SpringMVC是一个基于Spring开发的MVC轻量级框架,Spring3.0后发布的组件,SpringMVC和Spring可以无 缝整合,使用DispatcherServlet作为前端控制器,且内部提供了处理器映射器、处理器适配器、视图解析器等组 件,可以简化JavaBean封装,Json转化、文件上传等操作。

image.png

1. SpringMVC快速入门

image.png

① 导入Spring整合SpringMVC的坐标

    <dependency>
    	<groupId>org.springframework</groupId>
    	<artifactId>spring-webmvc</artifactId>
    	<version>5.3.7</version>
    </dependency>

② 编写一个控制器Controller,配置映射信息

    public class UserController {
    	@RequestMapping("/show")
    		public String show(){
    		System.out.println("show 执行....");
    		//视图跳转到index.jsp
    		return "/index.jsp";
    	}
    }

③ 在web.xml中配置SpringMVC的前端控制器ServletDispatcher

    <servlet>
    	<servlet-name>DispatcherServlet</servlet-name>
    	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    	<!--指定springMVC配置文件位置-->
    	<init-param>
    		<param-name>contextConfigLocation</param-name>
    		<param-value>classpath:spring-mvc.xml</param-value>
    	</init-param>
    	<!--服务器启动就创建-->
    	<load-on-startup>2</load-on-startup>
    </servlet>
    <servlet-mapping>
    	<servlet-name>DispatcherServlet</servlet-name>
    	<url-pattern>/</url-pattern>
    </servlet-mapping>

④ 创建springMVC的核心配置文件 spring-mvc.xml,并配置组件扫描web层

    <?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:mvc="http://www.springframework.org/schema/mvc"
    	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
    	http://www.springframework.org/schema/mvc 
    	http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    	
    	<!-- 组件扫描web层 -->
    	<context:component-scan base-package="com.itheima.controller"/>
    	
    </beans>

2. Controller中访问Spring容器中的Bean

DispatcherServlet在进行初始化时,加载的spring-mvc.xml配置文件创建的SpringMVC容器,那么web层Controller被扫描进入到了容器中,而之前Spring容器中的Service是否可以获取到呢?下面搭建Spring的web环境进行验证

① 创建一个applicationContext.xml文件

    <!-- 组件扫描非web层 -->
    <context:component-scan base-package="com.lwk">
    	<!--排除com.lwk包下使用@Controller注解的类-->
    	<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

② 在web.xml中加入配置ContextLoaderListener

    <!--配置ContextLoaderListener-->
    <context-param>
    	<param-name>contextConfigLocation</param-name>
    	<param-value>classpath:applictionContext.xml</param-value>
    </context-param>
    <listener>
    	<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

③ 编写UserService和UserServiceImpl

    public interface UserService {
    	public void show();
    }

    @Service("userService")
    public class UserServiceImpl implements UserService {
    	@Override
    	public void show() {
    		System.out.println("UserServiceImpl show running ... ...");
    	}
    }

④ 修改UserController,从Spring容器中匹配Service进行注入

    @Controller
    public class UserController {

    	@Autowired
    	private UserService userService;
    	
    	@RequestMapping("/show")
    	public String show(){
    		System.out.println("show 执行....");
    		//调用userService的show方法
    		userService.show();
    		//视图跳转到index.jsp
    		return "/index.jsp";
    	}
    }

二、SpringMVC关键组件浅析

上面已经完成的快速入门的操作,也在不知不觉中完成的Spring和SpringMVC的整合,我们只需要按照规则去定义Controller和业务方法就可以。但是在这个过程中,肯定是很多核心功能类参与到其中,这些核心功能类,一般称为组件。当请求到达服务器时,是哪个组件接收的请求,是哪个组件帮我们找到的Controller,是哪个组件帮我们调用的方法,又是哪个组件最终解析的视图?

image.png

先简单了解一下以上三个重要组件的关系

image.png

SpringMVC的默认组件,SpringMVC 在前端控制器 DispatcherServlet加载时,就会进行初始化操作,在进行初始化时,就会加载SpringMVC默认指定的一些组件,这些默认组件配置在 DispatcherServlet.properties 文件中,该文件存在于spring-webmvc-5.3.7.jar包下的 org\springframework\web\servlet\DispatcherServlet.properties

image.png

这些默认的组件是在DispatcherServlet中进行初始化加载的,在DispatcherServlet中存在集合存储着这些组件,SpringMVC的默认组件会在 DispatcherServlet 中进行维护,但是并没有存储在SpringMVC的容器中

    public class DispatcherServlet extends FrameworkServlet {
    	//存储处理器映射器
    	private List<HandlerMapping> handlerMappings;
    	//存储处理器适配器
    	private List<HandlerAdapter> handlerAdapters;
    	//存储视图解析器
    	private List<ViewResolver> viewResolvers;
    	// ... 省略其他代码 ...
    }

配置组件代替默认组件,如果不想使用默认组件,可以将替代方案使用Spring Bean的方式进行配置,例如,在spring-mvc.xml中配置RequestMappingHandlerMapping

    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>

当我们在Spring容器中配置了HandlerMapping,则不会再加载默认的HandlerMapping策略了,原理比较简单,DispatcherServlet 在进行HandlerMapping初始化时,先从SpringMVC容器中找是否存在HandlerMapping,如果存在直接取出容器中的HandlerMapping,再存储到 DispatcherServlet 中的handlerMappings集合中去。