2019-07-16 SpringMVC框架简介(一)

1.MVC框架简介

MVC设计模式:
M:model层,模型数据,业务处理
C:controller,控制层,负责接受并处理请求,响应客户端
V:view视图层,呈现模型与用户进行交互。


image.png

2.SpringMVC

SpringMVC框架是目前实现MVC设计模式的最好框架

一.Spring MVC的核心组件

1.DispatcherServlet:前置控制器,是整个流程控制的核心,用来控制其他组件的执行,进行统一的调度,降低各个组件之间的耦合性,相当与一个总指挥的地位
2.Handler:处理器,完成具体的业务逻辑,DispatcherServlet接收到用户请求之后,将请求转发给Handler
3.HandlerMapping:Handler的具体实现是通过HandlerMapping来实现的,他会将请求URL映射到具体的Handler。将请求映射到具体的Handler,这就是HandlerMapping的具体工作。
4.HandlerInterceptor:处理器拦截器,这是一个接口,如果我们需要做一些拦截处理,可以实现此接口来实现这个功能。
5.HandlerExecutionChain:处理器执行链
6.HandlerAdapter:处理器适配器,Handler在执行业务方法之前,会进行一些列的操作,包括对表单数据验证,表单数据类型的转换,将表单数据封装到JavaBean当中,这些都是通过HandlerAdapter来完成的,DispatchServlet通过HandlerAdapter来执行不同的Handler。
7.ModelAndView:装载模型数据和视图信息(逻辑视图,是handler的处理结果,返回给DIspatcherServlet的),DispatchServlet拿到ModelAndView之后,借助ViewResolver视图解析器来解析ModelAndView
8.ViewResolver:视图解析器会将逻辑视图解析为物理视图,最终将结果渲染给客户端

二.SpringMVC的实现流程

1.客户端请求被DispatcherServlet接收
2.DispatcherServlet节后到请求后通过HandlerMapping将请求映射到具体的Handler,同时还包括了一个HandlerInterceptor,并且Handler与HandlerInterceptor是结合起来的,以一个HandlerExecutionChain的结果返回给DispatcherServlet
3.生成Handler与HandlerInterceptor
4.HandlerExecutionChain(Handler+HandlerInterceptor)
5.DispatcherServlet拿到Handler之后,通过HandlerAdaptor执行Handler
6.Handler的业务方法执行完之后,会返回一个结果ModelAndView结果给DispatchServlet,
7.DispatchServlet拿到ModelAndView之后,通过ViewResolver来进行视图解析,视图解析器会将逻辑视图解析为物理视图,并且会进行模型数据的封装,最终将填充了模型数据的view响应给客户端
8.将填充了模型数据的view响应给DispatchServlet
9.DispatchServlet将view渲染后给用户

image.png

3.基于xml的配置方式

1.SpringMVC基础配置
2.XML配置Controller(即Handler),HandlerMapping组件映射,这一步主要就是把一个请求与一个具体的Handler关联起来,让这个Handler去处理请求
3.XML配置ViewReslover组件映射
*****************************自己写的Handler******************************
package com.imooc.handler;

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

/**
 * MyHandler作为一个Handler控制器需要实现一个接口Controller
 * 此时提示参数javax.servlet.http.HttpServletRequest httpServletRequest出错
 * 这是因为servletjar包未导入,导入即可
 */
public class MyHandler implements Controller {
    @Override
    public ModelAndView handleRequest(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse) throws Exception {

        /**
         * 装载模型数据和逻辑视图
         */
        ModelAndView modelAndView=new ModelAndView();
        /**
         * 添加模型数据,SpringMVC会自动将模型数据放到request域当中。
         */
        modelAndView.addObject("name","Tom");
        /**
         * 指定添加逻辑视图
         * DispatcherServlet获得ModelAndView之后,调用我们自己在springmvc.xml当中配置的视图解析器解析他
         * 此处在经过视图解析器的解析之后,变成了/show.jsp
         */
        modelAndView.setViewName("show");

        return modelAndView;
    }
}
*****************************自己写的View**********************************
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page isELIgnored="false" %>


    Title


    
    ${name}



***********在Spring的配置文件当中配置Handler和HandlerMapping************



    
    

        
        
            
                
                testHandler
            
        
    


    
    

    
    
        
        
        
    


***************在web.xml当中配置DispatcherServlet******************



  Archetype Created Web Application
  
  
    SpringMVC
    org.springframework.web.servlet.DispatcherServlet
    
    
      contextConfigLocation
      classpath:springmvc.xml
    
  
  
    SpringMVC
    /
  

************************************流程***********************************
当用户发出请求时,首先被web.xml当中的DispatcherServlet俘获,然后DispatcherServlet按照springmvc.xml当中当中的配置根据HandlerMapping找
到对应的Handler,Handler处理的结果是返回一个ModelAndView组件,然后DispatcherServlet根据springmvc.xml当中配置的ViewResolver来解析出ModelAndView,然后返回给客户端。

4.基于注解方式的使用

1.SpringMVC基础配置
2.Controller,HandlerMapping通过注解进行映射配置
3.XML配置ViewResovler
***************************************springmvc.xml****************************



    
    

    
    
        
        
        
    

************************************自定义的Handler*******************************
package com.imooc.handler;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import java.util.Map;

/**
 * 注意基于注解的Handler不需要实现Controller接口
 * 此时我们可以自己写一个方法来处理业务逻辑
 */
@Controller
public class AnnotationHandler {

    /**
     * 使用注解的方式的时候,可以不用实现Controller接口,然后自己写一个业务方法
     * @return ModelAndView
     *
     * 将业务方法与请求对应起来(modelAndViewTest)
     * 告诉控制器modelAndViewTest这个业务方法是处理/modelAndViewTest这个请求的
     */
    @RequestMapping("/modelAndViewTest")
    public ModelAndView modelAndViewTest(){

        /**
         * 创建ModelAndView对象
         */
        ModelAndView modelAndView=new ModelAndView();
        /**
         * 封装数据
         */
        modelAndView.addObject("name","Tom");
        /**
         * 指定逻辑视图
         */
        modelAndView.setViewName("show");

        return modelAndView;
    }

    /**
     * 业务方法:model来传值,string进行视图解析
     * 此方法相当于把ModelAndView分成2部分
     */
    @RequestMapping("/modelTest")
    public String ModelTest(Model model){

        /**
         * 填充模型数据
         */
        model.addAttribute("name","catalina");
        /**
         * 返回模型视图
         */
        return "show";
    }

    /**
     * 业务方法:Map集合传值,string进行视图解析
     */
    @RequestMapping("/mapTest")
    public String Maptest(Map map){

        /**
         * 填充数据模型
         */
        map.put("name","cat");
        /**
         * 返回模型视图
         */
        return "show";
    }


}

基于注解的方式和基于xml的方式的区别只在第二步,即一个是要值springmvc.xml当中配置(HandlerMapping,和Handler),一个追需要在类里面配置(HandlerMapping,和Handler).

5.SpringMVC的标签详解

在实际开发当中通常都是要加这个标签的

会自动册
RequestMappingHandlerMapping、RequestMappingHandlerAdapter 、ExceptionHandlerExceptionResolver三个bean。

还将提供以下支持:
  支持使用 Conversion service实例对表单参数进行类型转换
  支持使用@ Number Formatannotation、@ DateTime Format注解完成数据类型的格式化
  支持使用@vaid注解对 Java Bean实例进行JsR303验证
  支持使用@ RequestBody和@ Response Body注解

你可能感兴趣的:(2019-07-16 SpringMVC框架简介(一))