[SpringMVC]学习笔记02-SpringMVC执行原理

 

图为SpringMVC的一个较完整的流程图, 实线表示SpringMVC框架提供的技术,不需要开发者实现,虚线表示需要开发者实现。

简要分析执行流程

  1. DispatcherServlet表示前置控制器,是整个SpringMVC的控制中心,用户发出请求,DispatcherServlet接受请求并拦截请求。
    1. 我们假设请求的URL为:http://localhost:8080/SpringMVC/hello
    2. 如上URL差分为三部分
    3. http://locahost:8080为服务器域名
    4. SpringMVC部署在服务器上的we站点
    5. 通过分析,如上url表示为:请求位于服务器localhost:8080上的SpringMVC站点上的hello控制器
  2. HandlerMapping为处理器映射。DispatcherServlet调用HandlerMapping根据url查找Handler
  3. HandkerExecution表示具体的Handler,其主要作用是根据url查找控制器,如上url被查找控制器为:hello
  4. HandlerExecution将解析后的信息传递给DispatcherServlet,如解析控制器映射等
  5. HandlerAdapter表示处理器适配器,其按照特定的规则去执行Handler
  6. Handler让具体的Controller执行
  7. Controller将具体的执行信息返回给HandlerAdapter,如ModelAndView
  8. HandlerAdapter将视图逻辑名或模型传递给DispatcherServlet
  9. DispatcherServlet调用视图解析器(ViewResolver)来解析HandlerAdapter传递的逻辑视图名
  10. DispatcherServlet根据视图解析器解析的视图结果,调用具体的视图。
  11. 最终视图呈现给用户。

其中上述流程可以分为三大部分:

1.根据请求查找控制器(包含上述步骤1,2,3,4)

 

 2.控制器处理请求并返回处理结果(ModelAndView)(包含上述步骤5,6,7,8)

 

 3.根据Contolller返回的ModelAndView找到对应的页面渲染数据,返回给用户(包括上述步骤9,10,11,12)

 测试实例

项目结构

 

 1.在web.xml配置DispatcherServlet

<?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">
    <!--1.注册DispatcherServlet:这个睡觉哦SpringMVCd的核心:请求分发器,前端控制器-->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--关联一个springmvc的配置文件:【servlet-name】-servlet.xml-->
<!--        DispatcherServlet要绑定Spring的配置文件-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc-servlet.xml</param-value>
        </init-param>
        <!--启动级别-1-->
        <load-on-startup>1</load-on-startup>
    </servlet>

    <!--/ 匹配所有的请求;(不包括.jsp) 只匹配所有的请求,不会去匹配jsp页面-->
    <!--/* 匹配所有的请求;(包括.jsp)-->
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

2.在springmvc-servlet.xml配置试题解析器,urlMapping和ControllerHandler

<?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">

<!--    处理器:映射器 这里使用的是根据beanname匹配url的HandlerMapping-->
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<!--    处理器:适配器-->
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>


    <!--视图解析器:DispatcherServlet给他的ModelAndView
    1.获取了ModelAndView中的数据
    2.解析ModelAndView中的视图名字 hello
    3.拼接视图名字找到对应的视图 /WEB-INF/jsp/hello.jsp

    -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver">
        <!--前缀-->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <!--后缀-->
        <property name="suffix" value=".jsp"/>
    </bean>

    <bean id="/hello" class="com.wang.controller.HelloController"/>
</beans>

3.定义Controller,并在springmvc-content.xml中完成注册

package com.wang.controller;


import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class HelloController implements Controller {
    @Override
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        //ModelAndView 模型和视图
        ModelAndView mv=new ModelAndView();
        //调用业务层
        //封装对象,放到ModelAndView中。Model
        mv.addObject("msg","HelloSpringMVC!");
        //封装要跳转的视图,放在ModelAndView中
        mv.setViewName("hello");// /WEB-INF/jsp/hello.jsp

        return mv;
    }
}

 

posted @ 2022-07-09 17:24  王广元  阅读(11)  评论(0编辑  收藏  举报
分享到: