1.SpringMVC简介

1.1 SpringMVC是一个基于java的轻量级的web框架

1.2 开发模式

  • 版本1:Servlet开发,浏览器发送请求到Servlet,Servlet调用Service,Service调用Dao,得到数据返回到Servlet,Servlet将数据组织成用户看的页面,最终发给用户(JSP)

  • 版本2:MVC阶段,C控制器,用来处理用户请求分发,确认走哪一个操作。View用来做视图,对应最终的数据展示,Model模型层,对应所有数据的产生整体过程(包含Service,Dao,Domain,……)

  • 版本3:基于现有的前后端分离的模式开发。专用的前端服务器负责处理用户的请求,然后再发请求到后端服务器,得到数据后,由前端服务器组织页面,最终页面响应给用户

    • 异步调用:SpringMVC可以承载的工作:1.处理请求业务,得到最终的业务数据,2.业务数据转换成前端可以读取的数据(json格式)

1.3 入门案例

  1. 导坐标(spring-webmvc,servlet)

  2. 创建SpringMVC容器(2个注解,配置类,扫描)

  3. 创建一个控制器类

    • 创建一个方法,返回值是String

    • 将控制器类定义为bean,必须使用@Controller

    • 为每一个控制器方法设置一个访问路径,使用@RequestMapping

    • 设置返回值,使用@ResponseBody

  4. 核心:web容器启动时必须加载springmvc环境/容器

    public class ServletInitConfig extends AbstractDispatcherServletInitializer {
        //启动tomcat时加载springmvc配置
        @Override
        protected WebApplicationContext createServletApplicationContext() {
            //1.先创建一个配置的空壳,里面不加载配置类
            AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
            //2.将配置类注册到空壳中
            ctx.register(SpringMVCConfig.class);
            return ctx;
        }
        //设定哪些操作归属springmvc处理
        @Override
        protected String[] getServletMappings() {
            //所有的请求都归属springmvc处理
            return new String[]{"/"};
        }
        //启动tomcat时候加载spring配置
        @Override
        protected WebApplicationContext createRootApplicationContext() {
            return null;
        }
    }
    ​
    ----简化版----
        
        
    public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
        protected Class<?>[] getRootConfigClasses() {
            return new Class[0];
        }
    ​
        protected Class<?>[] getServletConfigClasses() {
            return new Class[]{SpringMvcConfig.class};
        }
    ​
        protected String[] getServletMappings() {
            return new String[]{"/"};
        }
    }

    实际开发(1+N过程)

    1:一次性开发,导入坐标,配置springmvc容器,配置web容器

    N:制作控制器类或控制器方法

1.4 入门案例执行过程

  • 服务器启动阶段

    启动web服务器,基于加载了Springmvc的容器,将mvc容器加载到了web服务器/web容器,放在web容器的ServletContext范围。

    加载所有的控制器类(@Controller),读取其中的@RequestMapping修饰的操作,使用映射地址与对应的方法做了映射关系。所有的映射关系构成了一个集合,这个集合就决定了当前mvc容器对外可以提供的所有功能

  • 单次请求过程

    浏览器发出请求,使用请求路径与@RequestMapping对应的地址进行匹配,匹配成功执行对应的方法,返回信息(字符串)

1.5 PostMan

(略)

2.请求

2.1 请求映射路径

@RequestMapping:设置请求控制器中的调用路径

  • 定义在控制器方法上,对应的名称就是访问路径

  • 定义在控制器类上,设置了所有控制器方法的访问前缀,还要结合控制器方法上的设定

2.2 请求方式(get,post)

springmvc是可以控制一个方法接收get还是post请求(还未讲),如果不设置,都可以接收

get请求/post请求

2.3 请求参数

  • 普通参数

    直接定义要接收的参数作为控制器方法的形参即可,如果未传递对应的数据,对应参数值为null

  • 名称不匹配

    使用@RequestParam("请求属性名")绑定形参之间的关系
    
    @RequestMapping("/commonParamDifferentName")
    @ResponseBody
    public String commonParamDifferentName(@RequestParam("name") String userName , @RequestParam("age") int age){
        System.out.println("普通参数传递 userName ==> "+userName);
        System.out.println("普通参数传递 age ==> "+age);
        return "{'module':'common param different name'}";
    }

  • pojo参数

    直接定义要接收的pojo对象作为控制器方法的形参即可,请求中的参数将于pojo中的属性进行一一对应,如果无法对应,则赋值为null

  • 嵌套pojo参数

    直接定义要接收的pojo对象作为控制器方法的形参即可,嵌套的属性在传递时名称使用类层次结构图来描述,例如user中包含address属性,address中包含citry属性,描述属性address.city

  • 数组参数

    可以接收多个相同的值,要求请求路径参数必须有多个相同的名称,在控制器方法的形参中定义对应类型的数组即可,通常String[]

    即可,如果未传递对应的数据,对应参数值为null

  • 集合参数(保存简单类型)

    集合参数设定使用形参定义即可,由于外部传递的数据不是为集合对象的属性赋值,因此需要告诉集合参数读取请求中的参数

    //集合参数:
    @RequestMapping("/listParam")
    @ResponseBody
    //默认:报错java.util.List.<init>(),找不到构造方法,List接口,怎么会找构造方法?springmvc认为引用类型必须先创建对象,然后设置属性
    //解决方案:告诉springmvc,这个List仅仅是用来接收数据
    ​
    //使用@RequestParam告诉集合,你接收请求中的参数
    public String listParam(@RequestParam("likes") List<String> likes){
        System.out.println("集合参数传递 likes ==> "+ likes);
        return "{'module':'list param'}";
    }

2.4 请求json数据

  • Postman发送json数据

  • 数组参数

  • pojo参数

  • 集合参数(保存pojo类型)

上述三种参数方式相同,仅仅是传递的数据不同,都是绑定请求体中的数据到对应形参即可,使用@RequestBody绑定请求中的json数据

//集合参数:json格式
@RequestMapping("/listPojoParamForJson")
@ResponseBody
public String listPojoParamForJson(@RequestBody List<User> list){
    System.out.println("list pojo(json)参数传递 list ==> "+list);
    return "{'module':'list pojo for json param'}";
}

2.5 日期类型参数(@DateTimeFormat)

//日期参数
@RequestMapping("/dataParam")
@ResponseBody
//2088/08/08  对应data
//2088-08-08  对应data1  @DateTimeFormat(pattern = "yyyy-MM-dd")
//2088/08/28 8:08:08    对应data2
public String dataParam(Date date,
                        @DateTimeFormat(pattern = "yyyy-MM-dd") Date date1,
                        @DateTimeFormat(pattern = "yyyy/MM/dd HH:mm:ss")Date date2){
    System.out.println("参数传递 date ==> "+date);
    System.out.println("2088-08-08 参数传递 date1 ==> "+date1);
    System.out.println("2088/08/28 8:08:08 参数传递 date2 ==> "+date2);
    return "{'module':'data param'}";
}

2.6 Converter

在程序执行过程中,如果遇到了类型不匹配,Spring会自动的启动类型转换(依赖@EnableWebMvc),此工作由Converter接口承担

Converter仅仅是一个接口,它具有非常多的实现类,进行类型转换时,由某一个类型可以匹配的实现类完成转换工程

3.响应

  • 响应页面

    返回值设置为String类型,具体返回页面名称字符串即可

  • 响应文本

    返回值设置为String类型,具体返回的文字将作为请求的结果返回到请求方,要求控制器方法使用@ResponseBody修饰

  • 响应json数据

    返回值设置为任意对象,具体返回的数据将直接转换成json格式的数据返回到请求方,要求控制器方法使用@ResponseBody修饰

今日目标

  • 能够知道SpringMVC的优点
  • 能够编写SpringMVC入门案例
  • 能够使用PostMan发送请求
  • 能够掌握普通类型参数传递
  • 能够掌握POJO类型参数传递
  • 能够掌握json数据参数传递
  • 能够掌握响应json数据
  • 能够掌握rest风格快速开发
  • 能够完成基于restful页面数据交互案例

一、SpringMVC简介

1 SpringMVC概述

问题导入

SpringMVC框架有什么优点?

1.1 SpringMVC概述

  1. SpringMVC是一种基于Java实现MVC模型的轻量级Web框架

  2. 优点

    1. 使用简单,开发便捷(相比于Servlet)

    2. 灵活性强

2 入门案例【重点】

问题导入

在Controller中如何定义访问路径,如何响应数据?

2.1 实现步骤

1 创建web工程(Maven结构)
2 设置tomcat服务器,加载web工程(tomcat插件)
3 导入坐标(SpringMVC+Servlet)
4 定义处理请求的功能类(UserController)
5 编写SpringMVC配置类,加载处理请求的Bean。
6 加载SpringMVC配置,并设置SpringMVC请求拦截的路径

2.2 代码实现

【第一步】创建web工程(Maven结构)

【第二步】设置tomcat服务器,加载web工程(tomcat插件)

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.tomcat.maven</groupId>
            <artifactId>tomcat7-maven-plugin</artifactId>
            <version>2.1</version>
            <configuration>
                <port>80</port>
                <path>/</path>
            </configuration>
        </plugin>
    </plugins>
</build>

【第三步】导入坐标(SpringMVC+Servlet)

<dependencies>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.1.0</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.2.10.RELEASE</version>
    </dependency>
</dependencies>

注意事项:

  1. 课程版本基于Spring主版本5.2.10.RELEASE制作

  2. 导入spring-webmvc坐标自动依赖spring相关坐标

【第四步】定义处理请求的功能类(UserController)

//定义表现层控制器bean
@Controller
public class UserController {
    //设置映射路径为/save,即外部访问路径
    @RequestMapping("/save")
    //设置当前操作返回结果为指定json数据(本质上是一个字符串信息)
    @ResponseBody
    public String save(){
        System.out.println("user save ...");
        return "{'info':'springmvc'}";
    }
}

==注意事项:==

对于SpringMVC而言,Controller方法返回值默认表示要跳转的页面,没有对应的页面就会报错。如果不想跳转页面而是响应数据,那么就需要在方法上使用@ResponseBody注解。

【第五步】编写SpringMVC配置类,加载处理请求的Bean。

//springmvc配置类,本质上还是一个spring配置类
@Configuration
@ComponentScan("com.itheima.controller")
public class SpringMvcConfig {
}

【第六步】加载SpringMVC配置,并设置SpringMVC请求拦截的路径

//web容器配置类
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
    //加载springmvc配置类,产生springmvc容器(本质还是spring容器)
    protected WebApplicationContext createServletApplicationContext() {
        //初始化WebApplicationContext对象
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        //加载指定配置类
        ctx.register(SpringMvcConfig.class);
        return ctx;
    }
​
    //设置由springmvc控制器处理的请求映射路径
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
​
    //加载spring配置类
    protected WebApplicationContext createRootApplicationContext() {
        return null;
    }
}

2.3 运行结果

2.4 案例注解和类解析

2.4.1 @Controller注解

  • 名称:@Controller

  • 类型:类注解

  • 位置:SpringMVC控制器类定义上方

  • 作用:设定SpringMVC的核心控制器bean

  • 范例

@Controller
public class UserController {
}

2.4.2 @RequestMapping注解

  • 名称:@RequestMapping

  • 类型:方法注解

  • 位置:SpringMVC控制器方法定义上方

  • 作用:设置当前控制器方法请求访问路径

  • 范例

@RequestMapping("/save")
public void save(){
    System.out.println("user save ...");
}

注意:其实@RequestMapping注解还可以写到类上面,笔记后面会介绍到。

2.4.3 @ResponseBody注解

  • 名称:@ResponseBody

  • 类型:方法注解

  • 位置:SpringMVC控制器方法定义上方

  • 作用:设置当前控制器方法响应内容为当前返回值,无需解析

  • 范例

@RequestMapping("/save")
@ResponseBody
public String save(){
    System.out.println("user save ...");
    return "{'info':'springmvc'}";
}

2.4.4 AbstractDispatcherServletInitializer类

  • AbstractDispatcherServletInitializer类是SpringMVC提供的快速初始化Web3.0容器的抽象类

  • AbstractDispatcherServletInitializer提供三个接口方法供用户实现

    • createServletApplicationContext()方法,创建Servlet容器时,加载SpringMVC对应的bean并放入WebApplicationContext对象范围中,而WebApplicationContext的作用范围为ServletContext范围,即整个web容器范围。

    //加载springmvc配置类,产生springmvc容器(本质还是spring容器)
    protected WebApplicationContext createServletApplicationContext() {
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        ctx.register(SpringMvcConfig.class);
        return ctx;
    }
    • getServletMappings()方法,设定SpringMVC对应的请求映射路径,设置为/表示拦截所有请求,任意请求都将转入到SpringMVC进行处理。

    //设置由springmvc控制器处理的请求映射路径
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
    • createRootApplicationContext()方法,如果创建Servlet容器时需要加载非SpringMVC对应的bean,使用当前方法进行,使用方式同createServletApplicationContext()

    //加载spring配置类
    protected WebApplicationContext createRootApplicationContext() {
        return null;
    }

2.5 入门程序开发总结(1+N)

  • 一次性工作

    • 创建工程,设置服务器,加载工程

    • 导入坐标

    • 创建web容器启动类,加载SpringMVC配置,并设置SpringMVC请求拦截路径

    • SpringMVC核心配置类(设置配置类,扫描controller包,加载Controller控制器bean)

  • 多次工作

    • 定义处理请求的控制器类

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

3 入门案例工作流程分析【理解】

3.1 启动服务器初始化过程

  1. 服务器启动,执行ServletContainersInitConfig类,初始化web容器

  2. 执行createServletApplicationContext方法,创建了WebApplicationContext对象

  3. 加载SpringMvcConfig配置类

  4. 执行@ComponentScan加载对应的bean

  5. 加载UserController,每个@RequestMapping的名称对应一个具体的方法

  6. 执行getServletMappings方法,定义所有的请求都通过SpringMVC

3.2 单次请求过程

  1. 发送请求localhost/save

  2. web容器发现所有请求都经过SpringMVC,将请求交给SpringMVC处理

  3. 解析请求路径/save

  4. 由/save匹配执行对应的方法save()

  5. 执行save()

  6. 检测到有@ResponseBody直接将save()方法的返回值作为响应求体返回给请求方

4 Controller加载控制

问题导入

因为功能不同,如何避免Spring错误的加载到SpringMVC的bean?

4.1 Controller加载控制与业务bean加载控制

  • SpringMVC相关bean

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值