SpringMVC初级:入门概述

96 阅读5分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第34天,点击查看活动详

image.png

官方文档:docs.spring.io/spring/docs…

一、概述

Spring MVC是包含在spring中的一个基于MVC设计思想的Web应用程序框架,目的是简化开发工作,提高开发效率。

什么是MVC ?

  • MVC是模型(Model)、视图(View)、控制器(Controller)的简写,是一种软件设计规范。
  • 是将业务逻辑、数据、显示分离的方法来组织代码。
  • MVC主要作用是降低了视图与业务逻辑间的双向偶合
  • MVC不是一种设计模式,MVC是一种架构模式。当然不同的MVC存在差异。

Model(模型): 数据模型,提供要展示的数据,因此包含数据和行为,可以认为是领域模型或JavaBean组件(包含数据和行为),不过现在一般都分离开来:Value Object(数据Dao) 和 服务层(行为Service)。也就是模型提供了模型数据查询和模型数据的状态更新等功能,包括数据和业务。

View(视图): 负责进行模型的展示,一般就是我们见到的用户界面,客户想看到的东西。

Controller(控制器): 接收用户请求,委托给模型进行处理(状态改变),处理完毕后把返回的模型数据返回给视图,由视图负责展示。也就是说控制器做了个调度员的工作。

优点:

  • 和Spring框架无缝集成,能直接使用Spring的IoC容器、AOP支持;

  • 提供了多种将请求URL映射到控制器的机制;并支持参数的类型转换,自动装载,校验功能;

  • 具有强大的扩展性,可根据需要方便的扩展框架的功能。

Spring MVC的特点:

  1. 轻量级,简单易学
  2. 高效 , 基于请求响应的MVC框架
  3. 与Spring兼容性好,无缝结合
  4. 约定优于配置
  5. 功能强大:RESTful、数据验证、格式化、本地化、主题等
  6. 简洁灵活

工作原理分析

  • Springmvc中的基本概念

      前端(核心)控制器类DispatcherServlet:作用:接收请求,响应结果,中央处理器。
    
      处理器映射器HandlerMapping:作用:根据某些特定要求查找Handler
    
      处理器适配器HandlerAdapter:作用:按照特定规则去执行Handler
    
      处理器Handler(需要程序员开发):编写Handler时按照HandlerAdapter的要求去做。
    
      视图解析器ViewResolver:作用:进行视图解析,根据逻辑视图名解析成真正的视图。
    
      视图View(需要程序员开发):是一个接口,实现类支持不同的View类型。
    
  • 执行过程分析,Spring MVC框架是围绕着DispatcherServlet(请求分发器)设计的。

     1.  DispatcherServlet表示前置控制器,是整个SpringMVC的控制中心。用户发出请求,DispatcherServlet接收请求并拦截请求。
    
         我们假设请求的url为 : http://localhost:8080/SpringMVC/hello
    
         **如上url拆分成三部分:**
    
         http://localhost:8080服务器域名
    
         SpringMVC部署在服务器上的web站点
    
         hello表示控制器
    
         通过分析,如上url表示为:请求位于服务器localhost:8080上的SpringMVC站点的hello控制器。
    
     2.  HandlerMapping为处理器映射。DispatcherServlet调用HandlerMapping,HandlerMapping根据请求url查找Handler。
    
     3.  HandlerExecution表示具体的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.  DispatcherServlet根据视图解析器解析的视图结果,调用具体的视图。
    
     12.  最终视图呈现给用户。
    

image.png

总结:

DispatcherServlet(前端控制器)接收来自客户端的URL请求。请求分发器借助处理器映射器(HandlerMapping)来查找对应的处理器Handler(控制器),分发本次请求。请求分发器利用处理器适配器(HandlerAdapter)来执行对应的处理器(控制器)。处理器调用方法处理本次请求,返回模型视图对象(ModelAndView)。请求分发器借助视图解析器(ViewResolver)解析模型视图,得到对应的视图(View)。请求分发器调用视图中的方法,同时将数据模型交给视图对象,完成给客户端的应答。

二、第一个SpringMVC程序

创建Maven项目,导入相关依赖

<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.1.9.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>2.5</version>
    </dependency>
    <dependency>
        <groupId>javax.servlet.jsp</groupId>
        <artifactId>jsp-api</artifactId>
        <version>2.2</version>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
    </dependency>
</dependencies>

配置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">
    <!--配置DispatchServlet 是SpringMVC的核心 前端控制器 or 请求分发器-->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--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>
    <!--
    springmvc / 与 /* 的区别?
        /:只匹配所有的请求,不会匹配jsp
        /*:匹配所有的请求,包括jsp
    -->
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

写SpringMVC 的 配置文件springmvc-servlet.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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd">

</beans>

添加处理映射器

<!--处理器映射器-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>

添加处理器适配器

<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>

添加视图解析器

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

编写业务Controller

public class HelloController implements Controller {
    @Override
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        ModelAndView mv=new ModelAndView();
        //业务代码
        String result="helloSpringMVC!";
        mv.addObject("msg",result);

        //视图跳转
        mv.setViewName("test");

        return mv;
    }
}

注册bean到SpringIOC容器

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

编写要跳转的jsp页面,显示ModelandView存放的数据

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    ${msg}
</body>
</html>

配置Tomcat 启动测试!

image.png

测试成功!本次内容分享到这里就结束了,谢谢!