SpringMVC简介

SpringMVC简介

1、特点(为什么要学)

​ 它是一个典型的教科书式的mvc构架,而不像struts等都是变种或者不是完全基于mvc系统的框架,对于初学者或者想了解mvc的人来说我觉得 spring是最好的,它的实现就是教科书!第二它和tapestry一样是一个纯正的servlet系统,这也是它和tapestry相比 struts所具有的优势。而且框架本身有代码,看起来容易理解。

  • 轻量级、简洁灵活,简单易学
  • 高效,基于请求响应的MVC框架
  • 与Spring兼容性好
  • 功能强大,如RESTful、数据验证、格式化、本地化等
  • 约定高于配置

2、DispatcherServlet(中心控制器)

​ Spring的Web框架围绕DispatcherServlet设计。DispatcherServlet的作用是将请求分发到不同的处理器。DispatcherServlet是整个SpringMVC的控制中心

image-20200723204010689

3、原理图

下图中绿色的部分表示需要自己实现的部分,其他属于框架自动实现的。数字表示接收请求时调用的顺序

image-20200723210041182

4、核心文件(初期学习)

web.xml

项目内路径:web\WEB-INF\web.xml

<!--    注册DispatcherServlet-->
    <servlet>
        <servlet-name>springmvc</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>    
<!--    / 匹配所有请求(不包括.jsp)-->
<!--    /* 匹配所有请求(包括.jsp)-->
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

springmvc-servlet.xml

项目内路径:src\main\resources\springmvc-servlet.xml

<!--    配置HandlerMapping和HandlerAdapter-->
	<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>

<!--    视图解析器:DispatcherServlet提供的ModelAndView-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
<!--        前缀-->
        <property name="prefix" value="/WEB-INF/jsp/"/>
<!--        后缀-->
        <property name="suffix" value=".jsp"/>
    </bean>

<!--    Handler-->
    <bean id="/template" class="com.wjr.controller.TemplateController"/>

Controller

项目内路径:src\main\java\com\wjr\controller\TemplateController.class

public class TemplateController implements Controller {
    public ModelAndView handleRequest(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse) throws Exception {
        //ModelAndView 模型和视图
        ModelAndView mv = new ModelAndView();
        //封装对象,放在ModelAndView中,Model
        mv.addObject("msg","Hello,SpringMVC!I am the template");
        //封装要跳转的视图,放在ModelAndView中
        mv.setViewName("template");//WEB-INF/jsp/template.jsp
        return mv;
    }
}

5、运行流程

  1. 用户发出请求,DispatcherServlet接收请求并拦截;

    • DispatcherServletweb.xml配置文件中进行注册

      <!--    注册DispatcherServlet-->
          <servlet>
              <servlet-name>springmvc</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>    
      <!--    / 匹配所有请求(不包括.jsp)-->
      <!--    /* 匹配所有请求(包括.jsp)-->
          <servlet-mapping>
              <servlet-name>springmvc</servlet-name>
              <url-pattern>/</url-pattern>
          </servlet-mapping>
      
    • 假设用户请求的url为: http://localhost:8080/SpringMVC/template

    • 该url会被拆分成三块(请求位于服务器localhost:8080上的SpringMVC站点的template控制器)

      • http://localhost:8080(服务器域名)
      • SpringMVC(部署在服务器上的web站点)
      • template(控制器)
  2. DispatcherServlet会自动调用HandlerMapping进行处理器映射,根据请求url中的template查找对应的Handler;

    • HandlerMappingspringmvc-servl;et.xml配置文件中进行注册

      <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
      
  3. HandlerExecution表示具体的Handler,其主要的作用为根据url查找控制器,如TemplateController;

    • TemplateControllerspringmvc-servlet.xml配置文件中进行注册

      <bean id="/template" class="com.wjr.controller.TemplateController"/>
      
  4. HandlerExecution将查找到的控制器等信息传递给DispatcherServlet;

  5. DispatcherServlet再自动调用HandlerAdapterHandlerAdapter表示处理器适配器,按照特定的规则执行Handler;

    • HandlerAdapterspringmvc-servlet.xml配置文件中进行注册

      <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
      
  6. Handler再让具体的Controller执行;

  7. Controller将具体的执行信息返回给HandlerAdapter,如ModelAndView

    • Controller接口的方法,返回值为ModelAndView

      public interface Controller {
          @Nullable
          ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse resp) throws Exception;
      }
      
  8. HandlerAdapter将视图逻辑名或模型(ModelAndView)传给DispatcherServlet

  9. DispatcherServlet调用ViewResolver(视图解析器)来解析视图逻辑名;

    • ViewResolverspringmvc-servlet.cml配置文件中注册

      <!--    视图解析器:DispatcherServlet提供的ModelAndView-->
      <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
      <!--        前缀-->
              <property name="prefix" value="/WEB-INF/jsp/"/>
      <!--        后缀-->
              <property name="suffix" value=".jsp"/>
          </bean>
      
  10. ViewResolver将解析的视图逻辑名返回给DispatcherServlet

  11. DispatcherServlet根据视图逻辑名调用具体的View(视图)

  12. 最终结果呈现给用户

posted @ 2020-07-24 10:38  画鸡蛋的达芬奇  阅读(99)  评论(0编辑  收藏  举报