【Spring】(13)Spring MVC 案例 + 运行流程(实现接口)

【Spring】(13)Spring MVC 案例 + 运行流程(实现接口)

一、简单使用(实现接口)

该片文章使用实现接口。真实开发中不推荐使用这个,推荐使用注解。因为实现接口一个类就只能实现一个接口方法,而使用注解可以在一个类中定义多个方法,多个注解

这个简单使用,目的是为了了解Spring MVC 的运行流程。

使用Spring MVC需要的导入的maven依赖:

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

项目结构

在这里插入图片描述

创建jsp页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>test.jsp</title>
</head>
<body>
${msg}
</body>
</html>

配置web.xml文件

主要配置DispatcherServlet。

    <!--配置DispatcherServlet-->
    <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:springmvc-servlet.xml</param-value>
        </init-param>
        <!--服务器启动的时候就启动-->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>DispatcherServlet</servlet-name>
        <!--  "/"匹配所有的请求不包括.jsp。"/*"匹配所有的请求包括.jsp -->
        <url-pattern>/</url-pattern>
    </servlet-mapping>

创建HelloController类并实现Controller接口。

仅仅用于学习Spring的运行原理,后面会使用注解实现。

/** 实现Controller */
public class HelloController implements Controller {
    /** 处理请求 */
    @Override
    public ModelAndView handleRequest(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws Exception {
        // 业务代码...

        // 模型和视图
        ModelAndView mv = new ModelAndView();
        // 将模型放入ModelAndView中(处理好的模型)
        mv.addObject("msg", "hello Spring MVC");
        // 将视图放到ModelAndView中
        mv.setViewName("test");
        // return视图
        return mv;
    }
}

配置springmvc-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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- 处理器映射器(第2步,BeanNameUrlHandlerMapping实现了HandlerMapping接口) -->
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
    <!-- 处理器适配器(第5步,SimpleControllerHandlerAdapter实现了HandlerAdapter接口) -->
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
    <!--视图解析器(第9步,InternalResourceViewResolver实现了ViewResolver接口)-->
    <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--前缀-->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <!--后缀-->
        <property name="suffix" value=".jsp"/>
    </bean>
    <!-- id需要配置url,/开头(BeanNameUrlHandlerMapping这个处理器映射器仅学习原理时候用,还有很多别的处理器映射器,以后用别的) -->
    <bean id="/hello" class="com.shengjava.web.controller.HelloController"/>
</beans>

部署到tomcat,发布。浏览器输入url地址

页面输出:

hello Spring MVC

注意:如果IDEA出现404访问不到的情况,请到项目结构的Artifacts中查看该模块中是否添加了jar包!

在这里插入图片描述

二、Spring MVC 流程

1.大概流程

在这里插入图片描述

实线是Spring MVC自己完成的,虚线是我们自己的操作。

Spring MVC 配置文件中必须配置的三大件:处理器映射器、处理器适配器、视图解析器。

其中,如果使用注解开发,则仅仅需要再配置文件中配置视图解析器即可。另外两个自动被解决了。

1.流程

流程:

  • 1.用户发送请求至前端控制器DispatcherServlet。

  • 2.DispatcherServlet收到请求调用HandlerMapping处理器映射器。

  • 3、 处理器映射器找到具体的处理器(可以根据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响应用户。

参考:SpringMVC执行原理

2.组件说明

组件说明:
以下组件通常使用框架提供实现:

DispatcherServlet:作为前端控制器,整个流程控制的中心,控制其它组件执行,统一调度,降低组件之间的耦合性,提高每个组件的扩展性。

HandlerMapping:通过扩展处理器映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。

HandlAdapter:通过扩展处理器适配器,支持更多类型的处理器。

ViewResolver:通过扩展视图解析器,支持更多类型的视图解析,例如:jsp、freemarker、pdf、excel等。