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" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <!--获取request域当中的值-->
    ${name}
</body>
</html>

***********在Spring的配置文件当中配置Handler和HandlerMapping************
<?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">

    <!--配置HandlerMapping,将请求url映射到具体的Handler-->
    <bean id="handlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">

        <!--配置mapping-->
        <property name="mappings">
            <props>
                <!--配置test请求对应的Handler-->
                <prop key="/test">testHandler</prop>
            </props>
        </property>
    </bean>


    <!--配置Handler-->
    <bean id="testHandler" class="com.imooc.handler.MyHandler"></bean>

    <!--配置视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--配置视图解析器的前缀后缀-->
        <property name="prefix" value="/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

</beans>
***************在web.xml当中配置DispatcherServlet******************
<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>
  
  <servlet>
    <servlet-name>SpringMVC</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!--配置初始化参数:指定配置文件SpringMVC.xml文件的位置-->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springmvc.xml</param-value>
    </init-param>
  </servlet>
  <servlet-mapping>
    <servlet-name>SpringMVC</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>
************************************流程***********************************
当用户发出请求时,首先被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****************************
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:c="http://www.springframework.org/schema/c"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:util="http://www.springframework.org/schema/util"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                      http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
                      http://www.springframework.org/schema/context
                      http://www.springframework.org/schema/context/spring-context-4.0.xsd
                      ">

    <!--将AnnotationHandler这个类交给IOC容器去管理-->
    <context:component-scan base-package="com.imooc.handler"/>

    <!--配置视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--配置视图解析器的前缀后缀-->
        <property name="prefix" value="/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>
************************************自定义的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<String,String> map){

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


}

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

5.SpringMVC的<mvc:annotation-driver/>标签详解

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

<mvc:annotation- driven/>会自动册
RequestMappingHandlerMapping、RequestMappingHandlerAdapter 、ExceptionHandlerExceptionResolver三个bean。

还将提供以下支持:
  支持使用 Conversion service实例对表单参数进行类型转换
  支持使用@ Number Formatannotation、@ DateTime Format注解完成数据类型的格式化
  支持使用@vaid注解对 Java Bean实例进行JsR303验证
  支持使用@ RequestBody和@ Response Body注解
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容