【SpringMVC】02 流程分析

首先是web.xml配置SpringMVC最核心的东西,DispatcherServlet

也称为【请求分发器】【前端控制器】【分发Servlet】

<!--1.注册DispatcherServlet-->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--关联一个springmvc的配置文件:【servlet-name】-servlet.xml-->
        <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) 不要写这个,所有都访问不了-->
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

这个Servlet必须是第一个加载出来的,因为这个DispatcherServlet是一个统一的调配分发中心

所以才要设置启动级别为最高级 

<!--启动级别-1-->
        <load-on-startup>1</load-on-startup>

映射配置不要写/*是因为,我们在Bean容器配置了一个视图解析器【ViewResolver】

写/只会匹配请求,不会触发视图解析处理

写上/*将会把所有的请求都会触发视图解析器处理

<servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

服务启动的同时需要加载Spring容器文件

参数名称必须是容器配置坐标

【classpath:】表示工程内当前路径

这个路径指向了我们的容器位置,因为Maven是直接放在resources的

生成工程目录直接在当前目录下,

【SpringMVC】02 流程分析

所以这里就能直接写容器文件的名称即可

<!--关联一个springmvc的配置文件:【servlet-name】-servlet.xml-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:SpringMVC-Servlet.xml</param-value>
        </init-param>

这个容器里面注册了我们的

【视图解析器】【BeanID处理器映射】【简易控制层适配器】

和我们自己编写的【控制器实现类】

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

    <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="/hello" class="cn.dai.controller.HelloController"/>
</beans>

然后我们就像写Servlet一样去编写Controller

起初我们需要继承httpServlet重写GET&POST方法

现在我们只需实现Controller重写handleRequest方法

ModelAndView对象同时处理数据携带和转发视图

addObject() 添加数据

setViewName设置要转发的视图名,

然后视图解析器来处理视图名,拼接URL并转发

package cn.dai.controller;

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

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

/**
 * @author ArkD42
 * @file SpringMVC
 * @create 2020 - 05 - 06 - 18:13
 */
public class HelloController implements Controller {

    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;
    }
}

最后在容器中注册这个Controller,要注意的一点是

这个BeanID直接就是我们这个访问路径的设置

<!--Handler-->
    <bean id="/hello" class="cn.dai.controller.HelloController"/>

【SpringMVC】02 流程分析

相关推荐