首页 > 其他分享 >SpringMVC基础详解(包含示例)

SpringMVC基础详解(包含示例)

时间:2023-06-16 10:44:54浏览次数:40  
标签:RequestMapping 示例 SpringMVC res get ResponseBody 详解 user public

SpringMVC

简介

  • SpringMVC 是一种基于 Java 的实现 MVC 设计模型的请求驱动类型的轻量级 Web 框架,跟Spring,Mybatis框架并称为SSM。是由Spring官方提供的基于MVC设计理念的web框架也是基于Servlet封装的用于实现MVC控制的框架,实现前端和服务端的交互

  • 与Servlet技术功能相同,均是基于web层开发,但是比servlet更简洁简便

  • web流程:前端页面使用异步提交的方式发送请求到后端服务器,后端服务器采用表现层、业务层、数据层三层架构形式进行开发,页面发送的请求由表现层接收后传给业务层,业务层访问数据层后处理后返回给表现层,表现层将数据转换成 json 格式发送给前端页面

    image-20230609185319993

入门

例子

  1. 导包

    <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>
    
  2. 配置类

    继承并实现 AbstractDispatcherServletInitializer 类即可

    @Configuration
    @ComponentScan("SpringMVC")
    public class SpringMvcConfig{
        
    }
    
    public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
        //让tomcat容器加载springMVC配置
        protected WebApplicationContext createServletApplicationContext() {
    		AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
            ctx.register(SpringMvcConfig.class);
            return ctx;
        }
    
        //当请求发过来之后哪些交由SpringMVC处理,"/"表示所有请求都是
        protected String[] getServletMappings() {
            return new String[]{"/"};
        }
    
        protected WebApplicationContext createRootApplicationContext() {
            AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
            ctx.register(SpringConfig.class);//spring容器,只使用mvc的话可以不加载
            return ctx;
        }
    }
    
  3. 创建SpringMVC控制类

    • @Controller:在SpringMVC中使用此注解开发表现层的Bean
    • @RequestMapping():定义访问路径,在类上使用用于定义前缀
    • @ResponseBody:设置返回值类型
    //定义bean
    @Controller
    //设置请求路径前缀,可以不设置
    @RequestMapping("/C1")
    public class C1 {
        //设置访问路径
        @RequestMapping("/save")
        //设置返回值类型
        @ResponseBody
        public String save(){
            System.out.println("c1 save");
            return "{'info':'c1 save'}";
        }
    }
    
  4. 启动程序(启动先需先配置)

    <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>
    
    image-20230609195440997

工作流程

启动服务器初始化过程

  1. 服务器启动,执行ServletContainersInitConfig类,初始化web容器
  2. 执行createServletApplicationContext方法,创建了WebApplicationContext对象
  3. 加载SpringMvcConfig
  4. 执行@ComponentScan加载对应的bean
  5. 加载UserController,每个@RequestMappingl的名称对应一个具体的方法
  6. 执行getServletMappings方法,定义所有的请求都通过SpringMVC

其他操作

bean加载控制

  • 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设定扫描范围为精准范围,例如servicet包、dao包等
  • 方式三:不区分Spring与SpringMVC的环境,加载到同一个环境中

过滤

@ComponentScan(value = "包名",
        excludeFilters = @ComponentScan.Filter(
                //过滤规则
        )
)
  • 按注解过滤

    @ComponentScan(value = "com.controller",
            excludeFilters = @ComponentScan.Filter(
                type = FilterType.ANNOTATION,
                    classes = Controller.class	//过滤掉Controller注解
            )
    )
    

PostMan工具

  • Postman:是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件
    • 作用:常用于进行接口测试
    • 特征:简单、实用、美观、大方

中文乱码处理

处理方式:设置过滤器

ServletContainersInitConfig.java中新增过滤器

@Override
    protected Filter[] getServletFilters() {
        CharacterEncodingFilter filter = new CharacterEncodingFilter();
        filter.setEncoding("UTF-8");
        return new Filter[]{filter};
    }

传参和响应

传参

传参方式

  • GET传参

    http://localhost/user/get?res=1&name=wg
    
    @RequestMapping("/get")
    @ResponseBody
    public String get(int res,String name){	//可以获取多个参数
        System.out.println("/user/get -> "+res);
        System.out.println("/user/get -> "+name);
        return "{'module':'common param'}";
    }
    
    >>/user/get -> 1
    >>/user/get -> wg
    
  • POST传参

    方法和GET一样

    image-20230610141722570
  • 指定提交方式

    @RequestMapping()注解中修改method参数

    @RequestMapping(value = "/post",method = RequestMethod.POST)
    
    • 用处:同一个路径可以在不同的函数中指定不同的提交方式以作区分
  • 从路径中取值

    1. @RequestMapping()注解中value的后面使用{}来圈定元素

    2. 在函数形参中使用@PathVariable注解来获取圈定的元素

    @RequestMapping(value = "/user/{id}", method = RequestMethod.DELETE)
    @ResponseBody
    public void id(@PathVariable Integer id){
        System.out.println(id);
    }
    

参数传递

  • 普通参数

    默认直接传入参数名相同的形参,设置时使用@RequestParam()注解

    public String get(@RequestParam("res") String test){...}
    
  • 传POJO类型对象

    当传入的参数名和实体类中的元素名一样时,会自动生成一个实体类对象

    http://localhost/user/get?name=wg&id=1
    
    @RequestMapping("/get")
    @ResponseBody
    public void get(User user){
    	System.out.println("/user/get -> "+user);
    }
    
    /user/get -> User{name='null', id=0}
    
  • 嵌套P0]0类型参数

    当实体类中有别的实体类时,传入参数使用 类名.元素名

    http://localhost/user/get?name=wg&id=1&address.country=China
    
  • 数组类型参数

    http://localhost/user/test?res=1&res=2&res=3
    
    @RequestMapping("/test")
    @ResponseBody
    public void test(String[] res){
        System.out.println("/user/test -> "+ Arrays.toString(res));
    }
    
    >>/user/test -> [1, 2, 3]
    
  • 集合类型参数

    问题:传类时springMVC会自动使用构造函数,但是集合接口没有构造函数

    解决:使用 @RequestParam 注解在形参前

    http://localhost/user/test?res=1&res=2&res=3
    
    @RequestMapping("/test")
    @ResponseBody
    public void test(@RequestParam List<String> res){
        System.out.println("/user/test -> "+ res);
    }
    
    >>/user/test -> [1, 2, 3]
    
  • 传JSON数据

    1. 需要导入依赖
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.15.1</version>
    </dependency>
    
    1. 开启转换JSON的功能

      在SpringMvc配置中使用@EnableWebMvc注解

      @Configuration
      @ComponentScan(value = "com.controller")
      @EnableWebMvc
      public class SpringMvcConfig {}
      
    2. 接收函数的形参使用 @RequestBody 注解

      @RequestMapping("/json")
      @ResponseBody
      public void json(@RequestBody List<String> res){
          System.out.println("/user/test -> "+ res);
      }
      
    3. 如何用Postman网站传JSON数据

      image-20230610145604412
    • >>/user/test -> [aa, bb, cc]
      
    • JSON传类

      image-20230610150238292

响应

  • 响应页面 / 跳转页面

    直接返回页面文件名称的字符串即可

    @RequestMapping("/jumpPage")
    public String jumpPage(){
        return "page.jsp";
    }
    
  • 响应字符串

    使用@ResponseBody注解,然后直接返回字符串

    @RequestMapping("/jumpPage2")
    @ResponseBody
    public String text(){
        return "text";
    }
    
  • 响应POJO对象

    使用@ResponseBody注解,直接返回对象

    将对象转成json这件事是jackson包做的,所以需要导入jackson-databind依赖

    响应POJO集合对象时也是直接返回

    @RequestMapping("/jsonPOJO")
    @ResponseBody
    public User jsonPOJO(){
        return new User("Wg",1);
    }
    
  • @ResponseBody

    • 将controller的方法返回的对象通过适当的转换器转换成指定格式后写入response对象的body区
      • 即用来返回JSON数据或XML数据
    • 可以直接使用在类上,代表该类所有方法都使用此注解

REST风格

介绍

  • REST:表现形式状态转换

  • 例子

    • 传统风格资源描述形式:

      http://localhost/user/getById?id=1
      http://localhost/user/saveUser
      
    • REST风格描述形式

      http://localhost/user/1
      http://localhost/user
      
  • 优点:

    • 书写简化
    • 隐藏很多细节,更加安全,无法通过地址得知对资源是什么操作
  • 使用示例

  • image-20230611153902468

简化注解

  • 类注解
    • @RestController:相当于@Controller+@ResponseBody
  • 方法注解
    • @GetMapping
    • @PostMapping
    • @PutMapping
    • @DeleteMapping

标签:RequestMapping,示例,SpringMVC,res,get,ResponseBody,详解,user,public
From: https://www.cnblogs.com/WgBlogSpace/p/17484978.html

相关文章

  • iOS 单元测试之常用框架 OCMock 详解
    一、单元测试1.1单元测试的必要性测试驱动开发并不是一个很新鲜的概念了。在日常开发中,很多时候需要测试,但是这种输出是必须在点击一系列按钮之后才能在屏幕上显示出来的东西。测试的时候,往往是用模拟器一次一次的从头开始启动app,然后定位到自己所在模块的程序,做一系列的点击......
  • QString::section详解
    目录section()函数简介section()声明start,end含义flags参数示例section()函数简介网上有很多关于Qt中字符串工具函数QString::section的描述,但大多描述不够清晰、直接。本文从官方文档入手,详细讲解如何使用section。QString::section可用来分隔字符串,与QString::split区别是......
  • iptables规则示例之只允许本地访问特定端口
    一、背景说明Iptables指的是用来管理Linux防火墙的命令程序,通常位于/sbin/iptables,属于“用户态”(UserSpace,又称用户空间)的防火墙管理体系;IPtables是工作在用户空间中,定义规则的工具,本身并不算是防火墙。我们可以理解为一个客户端工具,用户通过ipatbles这个客户端,将用户......
  • log4j.xml示例
    <?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPElog4j:configurationSYSTEM"log4j.dtd"><log4j:configurationxmlns:log4j="http://jakarta.apache.org/log4j/"debug="false"><ap......
  • log4xx/log4j异步日志配置示例
    <?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPElog4j:configurationSYSTEM"log4j.dtd"><log4j:configurationxmlns:log4j='http://jakarta.apache.org/log4j/'debug="false"><append......
  • 协程示例
    协程(Coroutine)与线程类似,可看成用户线程,由用户调度,而不是系统调度。示例创建1W个协程对象(TestCoro),然后随机调度运行。1W个协程运行于同一个线程中。协程构造绑定到CoroFun(),与boost::thread的创建相同。#include<iostream>#include<vector>#include<boost/bind.hpp>#inclu......
  • WebP格式详解
    参考:https://zh.wikipedia.org/zh-sg/WebP实战:直播推荐封面使用webp格式部分机型不展示 在开发相亲cny的时候,直播推荐模块server下发的封面图是webp的格式,android展示没有问题,ios14以下不支持webp所以让server做了处理,低版本下发png格式  ......
  • Spring之SpEL表达式操作示例解析
    目录1SpEL1.1简介1.2简单示例2深入示例2.1运算2.1.1算术运算2.1.2逻辑运算2.1.3比较运算2.1.4使用字符代替符号2.1.5使用正则表达式2.1.6使用instanceof2.1.7三目运算(if..else..)2.1.8表达式模板TemplateParserContext2.2字符串2.2.1操作2.2.2调用字符串方法2.3使......
  • 【回调详解】内核回调的详细图解【未完成】
    1、进程回调进程回调是内核下的全局变量,存放到PspCreateProcessNotifyRoutine中,该变量是个数组;该数组中已经存放函数的具体个数,则存放到全局变量PspCreateProcessNotifyRoutineCount中。PspCreateProcessNotifyRoutine的最大值由一个宏决定:PSP_MAX_CREATE_PROCESS_NOTIFY。1.1......
  • 15 Spring核心注释示例
    我们经常将这些称为“Spring核心注释”,我们将在本文中对它们进行审核。这是所有已知的Spring核心注释的列表。@Autowired我们可以使用  @Autowired 注释  来标记Spring将要解析和注入的依赖关系。我们可以将这个注释与构造函数,setter或字段注入一起使用。构造函数注入:@RestCon......