SpringMVC入门

奋斗吧
奋斗吧
擅长邻域:未填写

标签: SpringMVC入门

2023-04-16 18:23:23 211浏览

SpringMVC入门

一、SpringMVC简介

看到SpringMVC这个名字我们会发现其中包含Spring,那么SpringMVC和Spring之间的会有关系么?
答案是肯定有,SpringMVC隶属于Spring,是Spring技术中的一部分。
那么SpringMVC到底是用来做什么的呢?

  • SpringMVC技术与Servlet技术功能等同,均属于web层开发技术
  • SPringMVC是一种基于Java实现MVC模型的轻量级web框架
  • 优点
    • 使用简单,开发便捷(相比于Servlet)
    • 灵活性强

在这里插入图片描述

当前WEB程序的工作流程:

  • web程序通过浏览器访问前端页面,发送异步请求到后端服务器

  • 后台服务器采用三层架构进行功能开发

    • 表现层负责接收请求和数据然后将数据转交给业务层
    • 业务层负责调用数据层完成数据库表的增删改查,并将结果返给表现层
    • 表现层将数据转换成json格式返回给前端
  • 前端页面将数据进行解析最终展示给用户。

二、SpringMVC入门案例

2.1、SpringMVC程序开发的流程

在这里插入图片描述

1.浏览器发送请求到Tomcat服务器
2.Tomcat服务器接收到请求后,会将请求交给SpringMVC中的DispatcherServlet[前端控制器]来处理请求
3.DispatcherServlet不真正处理请求,只是按照对应的规则将请求分发到对应的Bean对象
4.Bean对象是由我们自己编写来处理不同的请求,每个Bean中可以处理一个或多个不同的请求url
5.DispatcherServlet和Bean对象都需要交给Spring容器来进行管理

具体的实现步骤如下:

  • 1.创建web工程(Maven结构)并在工程的pom.xml添加SpringMVCServlet坐标

  • 2.创建SpringMVC控制器类(等同于Servlet功能)

  • 3.初始化SpringMVC环境(同Spring环境),设定SpringMVC加载对应的bean

  • 4.初始化Servlet容器,加载SpringMVC环境,并设置SpringMVC技术处理的请求

2.2、案例制作

步骤1:创建Maven项目,并导入对应的依赖

<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>day04_springmvc</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <spring.version>5.2.10.RELEASE</spring.version>
    </properties>

    <dependencies>
        <!--servlet-->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
            <scope>provided</scope>
        </dependency>
        <!--springmvc-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
        </dependency>
    </dependencies>


    <build>
        <plugins>
            <!--tomcat服务器-->
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.2</version>
                <configuration>
                    <port>80</port><!--tomcat端口号-->
                    <path>/</path><!--虚拟目录-->
                    <uriEncoding>UTF-8</uriEncoding><!--访问路径编解码字符集-->
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

步骤2:创建控制器类

package com.liming.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

//2.制作控制器类,等同于Servlet
//2.1必须是一个spring管理的bean
//2.2定义具体处理请求的方法
//2.3设置当前方法的访问路径
//2.4设置响应结果为json数据
@Controller
public class UserController {
    @RequestMapping("/save")
    @ResponseBody
    public String save(){
        System.out.println("user save ...");
        return "{ 'module':'springmvc'}";
    }
}

步骤3:创建配置类

package com.liming.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

//3.定义配置类加载Controller对应的bean
@Configuration
@ComponentScan("com.liming.controller")
public class SpringMvcConfig {
}

步骤4:创建Tomcat的Servlet容器配置类

//4.定义servlet容器的配置类
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
    //加载springMVC配置
    protected WebApplicationContext createServletApplicationContext() {
        //初始化WebApplicationContext对象
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        //加载指定配置类
        ctx.register(SpringMvcConfig.class);
        return ctx;
    }

    //设置Tomcat接收的请求哪些归SpringMVC处理
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }

    //设置spring相关配置
    protected WebApplicationContext createRootApplicationContext() {
        return null;
    }
}

步骤5:配置Tomcat环境

在这里插入图片描述

步骤6:启动运行项目,浏览器访问

在这里插入图片描述

至此SpringMVC的入门案例就已经完成

知识点1:@Controller

名称 @Controller
类型 类注解
位置 SpringMVC控制器类定义上方
作用 设定SpringMVC的核心控制器bean

知识点2:@RequestMapping

名称 @RequestMapping
类型 类注解或方法注解
位置 SpringMVC控制器类或方法定义上方
作用 设置当前控制器方法请求访问路径
相关属性 value(默认),请求访问路径

知识点3:@ResponseBody

名称 @ResponseBody
类型 类注解或方法注解
位置 SpringMVC控制器类或方法定义上方
作用 设置当前控制器方法响应内容为当前返回值,无需解析

2.3、入门案例总结(1+N)

  • 一次性工作
    • 创建工程,设置服务器,加载工程
    • 导入坐标
    • 创建web容器启动类,加载SpringMVC配置,并设置SpringMVC请求拦截路径
    • SpringMVC核心配置类(设置配置类,扫描controller包,加载Controller控制器bean)
  • 多次工作
    • 定义处理请求的控制器类

    • 定义处理请求的控制器方法,并配置映射路径(@RequestMapping)与返回json数据(@ResponseBody)

最后针对本案例中出现的Tomcat的Servlet容器配置再来总结下:

  • AbstractDispatcherServletInitializer类是SpringMVC提供的快速初始化Web3.0容器的抽象类
  • AbstractDispatcherServletInitializer提供三个接口方法供用户实现
    • createRootApplicationContext()方法,如果创建Servlet容器时需要加载非SpringMVC对应的bean,使用当前方法进行,使用方式同createServletApplicationContext()
    • createServletApplicationContext()方法,创建Servlet容器时,加载SpringMVC对应的bean并放入WebApplicationContext对象范围中,而WebApplicationContext的作用范围为ServletContext范围,即整个web容器范围
    • getServletMappings()方法,设定SpringMVC对应的请求映射路径,设置为/表示拦截所有请求,任意请求都将转入到SpringMVC进行处理
    • createServletApplicationContext用来加载SpringMVC环境
    • createRootApplicationContext用来加载Spring环境

2.4、bean加载控制

入门案例的内容已经做完了,在入门案例中我们创建过一个SpringMvcConfig的配置类,再回想前面咱们学习Spring的时候也创建过一个配置类SpringConfig。这两个配置类都需要加载资源,那么它们分别都需要加载哪些内容?

  • SpringMVC加载其相关bean(表现层bean),也就是controller包下的类
  • Spring控制的bean:
    • 业务bean(Service)
    • 功能bean(DataSource,SqlSessionFactoryBean,MapperScannerConfigurer等)

概况的描述下咱们现在的问题就是因为功能不同,如何避免Spring错误加载到SpringMVC的bean?

思路分析:

针对上面的问题,解决方案也比较简单,就是:

  • 加载Spring控制的bean的时候排除掉SpringMVC控制的bean

具体该如何排除,有两种方式来解决:

  • 方式一:Spring加载的bean设定扫描范围为com.liming,排除掉controller包中的bean
  • excludeFilters属性:设置扫描加载bean时,排除的过滤规则
  • classes属性:设置排除的具体注解类,当前设置排除@Controller定义的bean
  • type属性:设置排除规则,当前使用按照bean定义时的注解类型进行排除
    • ANNOTATION:按照注解排除
    • ASSIGNABLE_TYPE:按照指定的类型过滤
    • ASPECTJ:按照Aspectj表达式排除,基本上不会用
    • REGEX:按照正则表达式排除
    • CUSTOM:按照自定义规则排除
@Configuration
@ComponentScan(value="com.liming",
    excludeFilters=@ComponentScan.Filter(
    	type = FilterType.ANNOTATION,
        classes = Controller.class
    )
)
public class SpringConfig {
}
  • 方式二:Spring加载的bean设定扫描范围为精准范围,例如service包、dao包等
@Configuration
@ComponentScan({"com.liming.service","com.liming.dao"})
public class SpringConfig {
}

最后一个问题,有了Spring的配置类,要想在tomcat服务器启动将其加载,我们需要修改ServletContainersInitConfig

public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
    protected WebApplicationContext createServletApplicationContext() {
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        ctx.register(SpringMvcConfig.class);
        return ctx;
    }
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
    protected WebApplicationContext createRootApplicationContext() {
      AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        ctx.register(SpringConfig.class);
        return ctx;
    }
}

对于上述的配置方式,Spring还提供了一种更简单的配置方式,可以不用再去创建AnnotationConfigWebApplicationContext对象,不用手动register对应的配置类,如何实现?

public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {

    protected Class<?>[] getRootConfigClasses() {
        return new Class[]{SpringConfig.class};
    }

    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{SpringMvcConfig.class};
    }

    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
}

好博客就要一起分享哦!分享海报

此处可发布评论

评论(0展开评论

暂无评论,快来写一下吧

展开评论

您可能感兴趣的博客

客服QQ 1913284695