SpringMvc介绍。,SpringMvc框架简介

马肤

温馨提示:这篇文章已超过398天没有更新,请注意相关的内容是否还可用!

SpringMvc是一个基于Java的开源Web框架,用于构建企业级Web应用程序。它采用MVC(模型-视图-控制器)设计模式,简化了Web应用程序的开发过程。SpringMvc通过依赖注入和注解驱动的编程方式,使得开发者能够轻松地处理HTTP请求和响应,管理数据模型和业务逻辑。它还提供了丰富的功能和灵活的扩展性,支持多种视图技术,如JSP、Velocity等。SpringMvc是一个强大的框架,能够帮助开发者构建高效、可维护的Web应用程序。

目录

1、SpringMvc概述

1、基本介绍

2、工作流程 

3、bean加载控制

 二、请求

1、请求映射路径

2、请求方式

3、请求参数

4、请求参数(传递json数据)

5、日期类型参数传递

三、响应

四、REST风格

1、REST简介

2、RESTful入门案例

3、RESTful快速开发

五、拦截器

1、拦截器概念

2、拦截器开发

3、拦截器参数

4、拦截器链配置


1、SpringMvc概述

1、基本介绍

▶ 基本概念

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

▷ 优点

  ● 使用简单、开发便捷(相比于Servlet)

  ● 灵活性强

SpringMvc介绍。,SpringMvc框架简介 第1张

▷ 当前WEB程序的工作流程:

● 三层架构

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

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

 ○表现层负责接收请求和数据然后将数据转交给业务层

 ○ 业务层负责调用数据层完成数据库表的增删改查,并将结果返给表现层

 ○ 表现层将数据转换成json格式返回给前端

 ○前端页面将数据进行解析最终展示给用户。

▷ 表现层与数据层的技术选型:

● 数据层采用Mybatis框架

● 变现层采用SpringMVC框架,SpringMVC主要负责的内容有:

  ○controller如何接收请求和数据

  ○ 如何将请求和数据转发给业务层

  ○ 如何将响应数据转换成json发回到前端

▶ 程序流程

SpringMvc介绍。,SpringMvc框架简介 第2张

1.浏览器发送请求到Tomcat服务器

2.Tomcat服务器接收到请求后,会将请求交给SpringMVC中的DispatcherServlet[前端控制器]来处理请求

3.DispatcherServlet不真正处理请求,只是按照对应的规则将请求分发到对应的Bean对象

4.Bean对象是有我们自己编写来处理不同的请求,每个Bean中可以处理一个或多个不同的请求url

5.DispatcherServlet和Bean对象都需要交给Spring容器来进行管理

▶ 知识点

@Controller

SpringMvc介绍。,SpringMvc框架简介 第3张

@RequestMapping

SpringMvc介绍。,SpringMvc框架简介 第4张

@ResponseBody

SpringMvc介绍。,SpringMvc框架简介 第5张

▶ 入门案例

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

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

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

protected WebApplicationContext createServletApplicationContext() {        
    AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();  
    ctx.register(SpringMvcConfig.class);     
    return ctx; 
}

  ○ createRootApplicationContext()方法,如果创建Servlet容器时需要加载非SpringMVC对的bean,使用当前方法进行,使用方式同createServletApplicationContext()

protected WebApplicationContext createRootApplicationContext() {     
    return null; 
}

○ getServletMappings()方法,设定SpringMVC对应的请求映射路径,设置为/表示拦截所请求,任意请求都将转入到SpringMVC进行处理

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

2、工作流程 

▶ 启动服务器初始化过程

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

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

   ● 该方法加载SpringMVC的配置类SpringMvcConfig来初始化SpringMVC的容器

3. 加载SpringMvcConfig配置类

SpringMvc介绍。,SpringMvc框架简介 第6张

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

   ● 扫描指定包下所有类上的注解,如Controller类上的@Controller注解

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

SpringMvc介绍。,SpringMvc框架简介 第7张

   ● 此时就建立了 `/save` 和 save方法的对应关系

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

SpringMvc介绍。,SpringMvc框架简介 第8张

   ● `/`代表所拦截请求的路径规则,只有被拦截后才能交给SpringMVC来处理请求

▶ 单次请求过程

1. 发送请求localhost/save

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

   ● 因为符合上面第六步设置的请求路径,所以该请求会交给SpringMVC来处理

3. 解析请求路径/save

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

   ● 上面的第五步已经将请求路径和方法建立了对应关系,通过/save就能找到对应的save方法

5. 执行save()

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

3、bean加载控制

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

SpringMvc介绍。,SpringMvc框架简介 第9张

● SpringMVC相关bean(表现层bean)

● Spring控制的bean

  ○ 业务bean(Service)

  ○ 功能bean(DataSource等)

●SpringMVC相关bean加载控制

  ○ SpringMVC加载的bean对应的包均在com.itheima.controller包内

● Spring相关bean加载控制

  ○ 方式一:Spring加载的bean设定扫描范围为com.itheima,排除掉controller包内的bean

  ○ 方式二:Spring加载的bean设定扫描范围为精准范围,例如service包、dao包等

  ○ 方式三:不区分Spring与SpringMVC的环境,加载到同一个环境中

▶ 知识点

SpringMvc介绍。,SpringMvc框架简介 第10张

▶ bean的加载格式

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

▶ 简化开发

public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer{    
        protected Class[] getServletConfigClasses() {        
               return new Class[]{SpringMvcConfig.class};    
        }    
        protected String[] getServletMappings() {        
                return new String[]{"/"};    
        }    
        protected Class[] getRootConfigClasses() {        
                return new Class[]{SpringConfig.class};    
        }
}

 二、请求

1、请求映射路径

SpringMvc介绍。,SpringMvc框架简介 第11张

2、请求方式

▶ Get请求

  ● 普通参数:url地址传参,地址参数名与形参变量名相同,定义形参即可接收参数

SpringMvc介绍。,SpringMvc框架简介 第12张

@RequestMapping("/commonParam")
@ResponseBody
public String commonParam(String name ,int age){    
    System.out.println("普通参数传递 name ==> "+name);    
    System.out.println("普通参数传递 age ==> "+age);    
    return "{'module':'common param'}";
}

▶ post请求

 ● 普通参数:form表单post请求传参,表单参数名与形参变量名相同,定义形参即可接收参数

SpringMvc介绍。,SpringMvc框架简介 第13张

@RequestMapping("/commonParam")
@ResponseBody
public String commonParam(String name ,int age){    
    System.out.println("普通参数传递 name ==> "+name);    
    System.out.println("普通参数传递 age ==> "+age);    
    return "{'module':'common param'}";
}

▶ Post请求中文乱码处理

 ● 为web容器添加过滤器并指定字符集,Spring-web包中提供了专用的字符过滤器

public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer{    
    // 配字符编码过滤器    
    protected Filter[] getServletFilters() {        
        CharacterEncodingFilter filter = new CharacterEncodingFilter();        
        filter.setEncoding("utf-8");        
        return new Filter[]{filter};    
    }
}

3、请求参数

▶ 普通参数:url地址传参,地址参数名与形参变量名相同,定义形参即可接收参数

SpringMvc介绍。,SpringMvc框架简介 第14张

@RequestMapping("/commonParam")
@ResponseBody 
public String commonParam(String name ,int age){     
    System.out.println("普通参数传递 name ==> "+name);    
    System.out.println("普通参数传递 age ==> "+age);    
    return "{'module':'common param'}";
}

▶ 普通参数:请求参数名与形参变量名不同,使用@RequestParam绑定参数关系

SpringMvc介绍。,SpringMvc框架简介 第15张

@RequestMapping("/commonParamDifferentName")
@ResponseBody
public String commonParamDifferentName(@RequestParam("name")String userName , int age){    
    System.out.println("普通参数传递 userName ==> "+userName);    
    System.out.println("普通参数传递 age ==> "+age);    
    return "{'module':'common param different name'}";
}

▶ @RequestParam

SpringMvc介绍。,SpringMvc框架简介 第16张

▶ POJO参数:请求参数名与形参对象属性名相同,定义POJO类型形参即可接收参数

SpringMvc介绍。,SpringMvc框架简介 第17张

@RequestMapping("/pojoParam")
@ResponseBody
public String pojoParam(User user){    
    System.out.println("pojo参数传递 user ==> "+user);    
    return "{'module':'pojo param'}";
}

▶ 嵌套POJO参数:POJO对象中包含POJO对象

SpringMvc介绍。,SpringMvc框架简介 第18张

▶ 嵌套POJO参数:请求参数名与形参对象属性名相同,按照对象层次结构关系即可接收嵌套POJO属性参数

SpringMvc介绍。,SpringMvc框架简介 第19张

@RequestMapping("/pojoContainPojoParam")
@ResponseBody
public String pojoContainPojoParam(User user){    
    System.out.println("pojo嵌套pojo参数传递 user ==> "+user);    
    return "{'module':'pojo contain pojo param'}";
}

▶ 数组参数:请求参数名与形参对象属性名相同且请求参数为多个,定义数组类型形参即可接收参数

SpringMvc介绍。,SpringMvc框架简介 第20张

@RequestMapping("/arrayParam")
@ResponseBody
public String arrayParam(String[] likes){    
    System.out.println("数组参数传递 likes ==> "+ Arrays.toString(likes));    
    return "{'module':'array param'}";
}

▶ 集合保存普通参数:请求参数名与形参集合对象名相同且请求参数为多个,@RequestParam绑定参数关系

SpringMvc介绍。,SpringMvc框架简介 第21张

@RequestMapping("/listParam")
@ResponseBody
public String listParam(@RequestParam List likes){    
    System.out.println("集合参数传递 likes ==> "+ likes);    
    return "{'module':'list param'}";
}

4、请求参数(传递json数据)

▶ 接收请求中的json数据

▷ ①:添加json数据转换相关坐标

  
    com.fasterxml.jackson.core  
    jackson-databind  
    2.9.0

▷ ②:设置发送json数据(请求body中添加json数据)

SpringMvc介绍。,SpringMvc框架简介 第22张

▷ ③:开启自动转换json数据的支持 

@Configuration
@ComponentScan("com.itheima.controller")
@EnableWebMvc
public class SpringMvcConfig {
}

   注意事项:@EnableWebMvc注解功能强大,该注解整合了多个功能,此处仅使用其中一部分功能,即json数据进行自动类型转换。

▷ ④:设置接收json数据

@RequestMapping("/listParamForJson")
@ResponseBody
public String listParamForJson(@RequestBody List likes){                 
    System.out.println("list common(json)参数传递 list ==> "+likes);    
    return "{'module':'list common for json param'}";
}

▶ @EnableWebMvc

SpringMvc介绍。,SpringMvc框架简介 第23张

▶ @RequestBody

SpringMvc介绍。,SpringMvc框架简介 第24张

▶ POJO参数:json数据与形参对象属性名相同,定义POJO类型形参即可接收参数

SpringMvc介绍。,SpringMvc框架简介 第25张

@RequestMapping("/pojoParamForJson")
@ResponseBody
public String pojoParamForJson(@RequestBody User user){     
    System.out.println("pojo(json)参数传递 user ==> "+user);    
    return "{'module':'pojo for json param'}";
}

▶ POJO集合参数:json数组数据与集合泛型属性名相同,定义List类型形参即可接收参数

SpringMvc介绍。,SpringMvc框架简介 第26张

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

▶ @RequestBody与@RequestParam区别

● 区别

 ○ @RequestParam用于接收url地址传参,表单传参【application/x-www-form-urlencoded】

 ○ @RequestBody用于接收json数据【application/json】

● 应用

 ○ 后期开发中,发送json格式数据为主,@RequestBody应用较广

 ○ 如果发送非json格式数据,选用@RequestParam接收请求参数

5、日期类型参数传递

▶ 参数传递

 ● 日期类型数据基于系统不同格式也不尽相同

  ○ 2088-08-18

  ○ 2088/08/18

  ○ 08/18/2088

 ● 接收形参时,根据不同的日期格式设置不同的接收方式

@RequestMapping("/dataParam")
@ResponseBody
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("参数传递 date(yyyy-MM-dd) ==> "+date1);
        System.out.println("参数传递 date(yyyy/MM/dd HH:mm:ss) ==> "+date2);    
        return "{'module':'data param'}";
}
http://localhost/dataParam?date=2088/08/08&date1=2088-08-18&date2=2088/08/28 8:08:08

▶ @DateTimeFormat

SpringMvc介绍。,SpringMvc框架简介 第27张

▶ 类型转换器

● Converter接口

public interface Converter {    
    @Nullable    
    T convert(S var1);
}

  ○ 请求参数年龄数据(String→Integer)

  ○ json数据转对象(json → POJO)

  ○ 日期格式转换(String → Date)

● @EnableWebMvc功能之一:根据类型匹配对应的类型转换器

三、响应

▶ 响应页面(了解)

@RequestMapping("/toPage")
public String toPage(){    
    return "page.jsp";
}

▶ 响应文本数据(了解)

@RequestMapping("/toText")
@ResponseBody
public String toText(){    
    return "response text";
}

▶ 响应json数据(对象转json)

@RequestMapping("/toJsonPOJO")
@ResponseBody
public User toJsonPOJO(){    
    User user = new User();    
    user.setName("赵云");    
    user.setAge(41);    
    return user;
}

▶ 响应json数据(对象集合转json数组)

@RequestMapping("/toJsonList")
@ResponseBody
public List toJsonList(){    
    User user1 = new User();    
    user1.setName("赵云");    
    user1.setAge(41);    
    User user2 = new User();    
    user2.setName("master 赵云");    
    user2.setAge(40);    
    List userList = new ArrayList();    
    userList.add(user1);    
    userList.add(user2);    
    return userList;
}

▶ @ResponseBody

SpringMvc介绍。,SpringMvc框架简介 第28张

▶ HttpMessageConverter接口

public interface HttpMessageConverter {    
    boolean canRead(Class clazz, @Nullable MediaType mediaType);    
    boolean canWrite(Class clazz, @Nullable MediaType mediaType);    
    List getSupportedMediaTypes();    
    T read(Class

0
收藏0
文章版权声明:除非注明,否则均为VPS857原创文章,转载或复制请以超链接形式并注明出处。

相关阅读

  • 【研发日记】Matlab/Simulink自动生成代码(二)——五种选择结构实现方法,Matlab/Simulink自动生成代码的五种选择结构实现方法(二),Matlab/Simulink自动生成代码的五种选择结构实现方法详解(二)
  • 超级好用的C++实用库之跨平台实用方法,跨平台实用方法的C++实用库超好用指南,C++跨平台实用库使用指南,超好用实用方法集合,C++跨平台实用库超好用指南,方法与技巧集合
  • 【动态规划】斐波那契数列模型(C++),斐波那契数列模型(C++实现与动态规划解析),斐波那契数列模型解析与C++实现(动态规划)
  • 【C++】,string类底层的模拟实现,C++中string类的模拟底层实现探究
  • uniapp 小程序实现微信授权登录(前端和后端),Uniapp小程序实现微信授权登录全流程(前端后端全攻略),Uniapp小程序微信授权登录全流程攻略,前端后端全指南
  • Vue脚手架的安装(保姆级教程),Vue脚手架保姆级安装教程,Vue脚手架保姆级安装指南,Vue脚手架保姆级安装指南,从零开始教你如何安装Vue脚手架
  • 如何在树莓派 Raspberry Pi中本地部署一个web站点并实现无公网IP远程访问,树莓派上本地部署Web站点及无公网IP远程访问指南,树莓派部署Web站点及无公网IP远程访问指南,本地部署与远程访问实践,树莓派部署Web站点及无公网IP远程访问实践指南,树莓派部署Web站点及无公网IP远程访问实践指南,本地部署与远程访问详解,树莓派部署Web站点及无公网IP远程访问实践详解,本地部署与远程访问指南,树莓派部署Web站点及无公网IP远程访问实践详解,本地部署与远程访问指南。
  • vue2技术栈实现AI问答机器人功能(流式与非流式两种接口方法),Vue2技术栈实现AI问答机器人功能,流式与非流式接口方法探究,Vue2技术栈实现AI问答机器人功能,流式与非流式接口方法详解
  • 发表评论

    快捷回复:表情:
    评论列表 (暂无评论,0人围观)

    还没有评论,来说两句吧...

    目录[+]

    取消
    微信二维码
    微信二维码
    支付宝二维码