SpringMVC的基本概念及其入门程序

3.1 SpringMVC的基本概念

mark

​ MVC全名时Model View Controller,是模型(mode)-视图(view)-控制器(controller)的缩写,是一种用于设计创建Web应用程序表现层的模式。MVC中每个部分各司其职:
​ Model(模型):
​ 通常指的就是我们的数据模型。作用一般情况下用于封装数据。
​ View(视图):
​ 通常指的就是我们的jsp或者html。作用一般就是展示数据的
​ 通常视图是依据模型数据创建的
​ Controller(控制器):
​ 是应用程序中处理用户交互的部分。用作一般就是处理程序逻辑的
​ 它相对于前两个不是很好理解,这里举个例子:
​ 例如:
​ 我们要保存一个用户的信息,该用户信息中包含了姓名,性别,年龄等等。
​ 这时候表单输入要求年龄必须是1~100之间的整数。姓名和性别不能为空。并且把数据填充到模型之中
​ 此时除了js的校验之外,服务器端也应该有数据准确性的校验,那么校验就是控制器该做的。
​ 当校验失败后,由控制器负责把错误页面展示给使用者
​ 如果校验成功,也是控制器负责把数据填充到模型,并且调用业务层实现完整的业务需求。

markmarkmarkmark

3.2 入门程序

编写一个入门程序,期望提高对SpringMVC的理解,以下为入门程序的需求:

mark

环境搭建

  1. 创建一个maven工程,选择webapp的maven工程,为了解决创建时间长的问题(网上下载包),在properties添加一对键值对,键:archetypeCatalog 值:internal

  2. 由于新创建的maven工程包不齐全,在main包下创建一个java包

  3. 在pom.xml中导入坐标:

    <?xml version="1.0" encoding="UTF-8"?>
    <!--
      Licensed to the Apache Software Foundation (ASF) under one
      or more contributor license agreements.  See the NOTICE file
      distributed with this work for additional information
      regarding copyright ownership.  The ASF licenses this file
      to you under the Apache License, Version 2.0 (the
      "License"); you may not use this file except in compliance
      with the License.  You may obtain a copy of the License at
    
       http://www.apache.org/licenses/LICENSE-2.0
    
      Unless required by applicable law or agreed to in writing,
      software distributed under the License is distributed on an
      "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
      KIND, either express or implied.  See the License for the
      specific language governing permissions and limitations
      under the License.
    -->
    <!-- $Id: pom.xml 642118 2008-03-28 08:04:16Z reinhard $ -->
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    
      <modelVersion>4.0.0</modelVersion>
      <packaging>war</packaging>
    
      <name>SpringMVC_01_start</name>
      <groupId>org.example</groupId>
      <artifactId>SpringMVC_01_start</artifactId>
      <version>1.0-SNAPSHOT</version>
    
      <build>
        <plugins>
          <plugin>
            <groupId>org.mortbay.jetty</groupId>
            <artifactId>maven-jetty-plugin</artifactId>
            <version>6.1.7</version>
            <configuration>
              <connectors>
                <connector implementation="org.mortbay.jetty.nio.SelectChannelConnector">
                  <port>8888</port>
                  <maxIdleTime>30000</maxIdleTime>
                </connector>
              </connectors>
              <webAppSourceDirectory>${project.build.directory}/${pom.artifactId}-${pom.version}</webAppSourceDirectory>
              <contextPath>/</contextPath>
            </configuration>
          </plugin>
        </plugins>
      </build>
    	<!-- 版本锁定 下面可以直接引用	-->
      <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <spring.version>5.0.2.RELEASE</spring.version>
      </properties>
    
      <dependencies>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-context</artifactId>
          <version>${spring.version}</version>
        </dependency>
    
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-web</artifactId>
          <version>${spring.version}</version>
        </dependency>
    
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-webmvc</artifactId>
          <version>${spring.version}</version>
        </dependency>
    
        <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>servlet-api</artifactId>
          <version>2.5</version>
          <scope>provided</scope>
        </dependency>
    
        <dependency>
          <groupId>javax.servlet.jsp</groupId>
          <artifactId>jsp-api</artifactId>
          <version>2.0</version>
          <scope>provided</scope>
        </dependency>
    
      </dependencies>
    
    </project>
    
  4. 配置核心的控制器(配置DispatcherServlet)
    前端控制器

    在web.xml配置文件中核心控制器DispatcherServlet

        <!--配置前端控制器-->
    	<!-- SpringMVC的核心控制器 --> 
    	<!-- 配置Servlet --> 
        <servlet> 
    		<!-- 名字建议填写类的名字,首字母小写 --> 
            <servlet-name>dispatcherServlet</servlet-name> 
            <!-- 该class(DispatcherServlet)为Spring提供好的,我们直接引用即可 --> 
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
            <!-- 配置Servlet的全局初始化参数,读取springmvc的配置文件,创建spring容器 -->
            <init-param>
    			<param-name>contextConfigLocation</param-name> 
                <param-value>classpath:springmvc.xml</param-value> 
            </init-param> 
            <!-- 配置servlet启动时加载对象 --> 
            <load-on-startup>1</load-on-startup> 
    	 </servlet> 
    
    	 <servlet-mapping> 
             <servlet-name>dispatcherServlet</servlet-name> 
    		 <!-- 拦截写/,意思为任意请求都会被拦截 --> 
             <url-pattern>/</url-pattern> 
    	 </servlet-mapping>
    
  5. 编写springmvc.xml的配置文件

    <?xml version="1.0" encoding="UTF-8"?> 
    <beans xmlns="http://www.springframework.org/schema/beans" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" 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 
        http://www.springframework.org/schema/mvc 
        http://www.springframework.org/schema/mvc/spring-mvc.xsd 
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context.xsd">
    
    
        <!-- 配置spring创建容器时要扫描的包 --> 
    	<context:component-scan base-package="com"></context:component-scan> 
    	<!-- 配置视图解析器,视图解析器的类名固定(spring提供) 
    		 视图解析器可以帮你跳转到指定jsp页面
    	--> 
    	<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 			<!-- prefix(前缀)表示文件所在目录 -->
             <property name="prefix" value="/WEB-INF/pages/"></property> 
             <!-- suffix(后缀)表示文件后缀名 -->
    	     <property name="suffix" value=".jsp"></property> 
    	</bean> 
        
    	<!-- 配置spring开启注解mvc的支持 -->
    	<mvc:annotation-driven></mvc:annotation-driven>
    </beans>
    
  6. 编写index.jsp和HelloController控制类

    1. index.jsp

      <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      <html>
      <head>
          <title>Title</title>
      </head>
      <body>
          <h3>入门程序</h3>
          <a href="hello">入门程序</a>
      </body>
      </html>
      
    2. HelloController

      package com.controller;
      
      import org.springframework.stereotype.Controller;
      import org.springframework.web.bind.annotation.RequestMapping;
      
      /**
       * 入门程序
       * @author Holdonbei
       * @date 2020/12/721:01
       */
      @Controller
      public class HelloController {
          // RequestMapping请求映射
          @RequestMapping(path = "/hello")
          public String hello() {
              System.out.println("Hello SpringMVC");
              return "success";
          }
      }
      
  7. 在WEB-INF目录下创建pages文件夹,编写success.jsp的成功页面

  8. 启动Tomcat服务器,进行测试

深入分析以上步骤(帮助消化理解):

  1. 入门案例的执行流程
    mark

    1. 当启动Tomcat服务器的时候,因为配置了load-on-startup标签,所以会创建DispatcherServlet对象,就会加载springmvc.xml配置文件
    2. 开启了注解扫描,那么HelloController对象就会被创建
    3. 从index.jsp发送请求,请求会先到达DispatcherServlet核心控制器,根据配置@RequestMapping注解找到执行的具体方法
    4. 根据执行方法的返回值,再根据配置的视图解析器,去指定的目录下查找指定名称的JSP文件
    5. Tomcat服务器渲染页面,做出响应
  2. 图解
    mark
    详细图解

    mark

mark

  1. 入门案例中的组件分析

    1. 前端控制器(DispatcherServlet)

      用户请求到达前端控制器,它就相当于mvc模式中的c,DispatcherServlet是整个流程控制的中心,由它调用其他组件处理用户的请求,DispatcherServlet的存在降低了组件之间的耦合性

    2. 处理器映射器(HandlerMapping)

      HandlerMapping负责根据用户请求找到Handler即处理器,SpringMVC提供了不同的映射器实现不同的映射方式,例如:配置文件方式、实现接口方式、注解方式等

    3. 处理器(Handler)

      它就是我们开发中要编写的具体业务控制器。由DispatcherServlet把用户请求转发到Handler。由Handler对具体的用户请求进行处理。

    4. 处理器适配器(HandlerAdapter)

      通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。

      mark

    5. 视图解析器(View Resolver)

      Vuew Resolver负责将处理结果生成View视图,View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。

    6. 视图(View)

      SpringMVC框架提供了很多的View视图类型的支持,包括:jstlView、freemarkerView、pdfView等。我们最常用的视图就是jsp。

      一般情况下需要通过页面标签或页面模板技术将模板数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面。

    7. <mvc:annotation-driven>说明

      在SpringMVC的各个组件中,处理器映射器、处理器适配器 、视图解析器称为SpringMVC的三大组件。

      使用用 <mvc:annotation-driven>自动加载 RequestMappingHandlerMapping (处理映射器) 和RequestMappingHandlerAdapter ( 处 理 适 配 器 ) , 可 用 在 SpringMVC.xml 配 置 文 件 中 使 用<mvc:annotation-driven>替代注解处理器和适配器的配置。

      它就相当于在 xml 中配置了:

      <!-- 上面的标签相当于 如下配置-->
      <!-- Begin -->
      <!-- HandlerMapping --> 
      	<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerM
      apping"></bean>
      	<bean
      class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
      	<!-- HandlerAdapter -->
      	<bean
      class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerA
      dapter"></bean>
      	<bean
      class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"></bean>
      	<bean
      class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
      	<!-- HadnlerExceptionResolvers -->
      	<bean
      class="org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExcept
      ionResolver"></bean>
      	<bean
      class="org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolv
      er"></bean>
      	<bean
      class="org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver"
      ></bean>
      	<!-- End -->
      	注意:
      一般开发中,我们都需要写上此标签(虽然从入门案例中看,我们不写也行,随着课程的深入,该标签还
      有具体的使用场景)。
      	明确:
      我们只需要编写处理具体业务的控制器以及视图。
      

RequestMapping注解

使用说明:

源码:
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping { }
  • 作用:

    • 用于建立请求URL和处理请求方法之间的对应关系。
  • 出现位置:

    • 类上:

      • 请求URL的第一级访问目录。此处不写的话,就相当于应用的根目录。写的话需要以/开头。它出现的目的是为了使我们的URL可以按照模块化管理:

      • 例如:

        • 账户模块

          /account/add

          /account/update

          /account/delete

        • 订单模块

          /order/add

          /order/update

          /order/delete

          红色的部分就是把RequestMapping写在类上,使我们的URL更加精细。

    • 方法上:

      • 请求URL的第二级访问目录。
  • 属性:

    • value:用于指定请求的URL。它和path属性的作用是一样的。

    • method:用于指定请求的方式。

    • params:用于指定限制请求参数的条件。它支持简单的表达式。要求请求参数的key和value必须和配置的一摸一样。

      • 例如:

        params = {“accountName”},表示请求参数必须有 accountName

        params = {“moeny!100”},表示请求参数中 money 不能是 100。

    • headers:用于指定限制请求消息头的条件。

    • 注意:

      • 以上四个属性只要出现2个或以上时,他们的关系是与的关系。

总结

  1. RequestMapping注解的作用是建立请求URL和处理方法之间的对应关系
  2. RequestMapping注解可以作用在方法和类上
    1. 作用在类上:第一级的访问目录
    2. 作用在方法上:第二级的访问目录
    3. 细节:路径可以不编写/表示应用的根目录开始
    4. 细节:${pageContext.request.contextPath}也可以省略不写,但是路径上不能写/
  3. RequestMapping的属性
    1. path 指定请求路径的url
    2. value value属性和path属性是一样的
    3. method 指定该方法的请求方式
    4. params 指定限制请求参数的条件
    5. headers 发送的请求中必须包含的请求头
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值