SpringMVC基础学习之Restful风格的简单使用

前言

小伙伴们,大家好,我是狂奔の蜗牛rz,当然你们可以叫我蜗牛君,我是一个学习Java半年多时间的小菜鸟,同时还有一个伟大的梦想,那就是有朝一日,成为一个优秀的Java架构师。

这个SpringMVC基础学习系列是用来记录我学习SpringMVC框架基础知识的全过程 (这个系列是参照B站狂神的SpringMVC最新教程来写的,由于是之前整理的,但当时没有发布出来,所以有些地方可能有错误,希望大家能够及时指正!)


之后我将尽量以两天一更的速度更新这个系列,还没有学习SpringMVC框架的小伙伴可以参照我的博客学习一下;当然学习过的小伙伴,也可以顺便跟我一起复习一下基础。最后,希望能够和大家一同进步吧,加油吧,编程人!

特别提醒:如果对SpringMVC基础学习系列感兴趣,可以阅读本系列往期博客:
第一篇SpringMVC基础学习之简单回顾MVC架构和Servlet的使用
第二篇SpringMVC基础学习之初识SpringMVC
第三篇SpringMVC基础学习之初识
第四篇SpringMVC基础学习之使用注解开发
第五篇SpringMVC基础学习之Controller的两种实现方式和RequstMapping注解的使用


今天我们来到了SpringMVC基础学习的第六站:Restful风格的简单使用 。废话不多说,让我们开始今天的学习内容吧。

6.Restful风格的简单使用

6.1 Restful风格基础知识

SpringMVC中实现RestFul风格之前,首先我们需要了解一下什么是RestFul风格以及RestFul风格的主要功能是什么

6.1.1 什么是Restful风格?

Restful就是一个==资源定位资源操作的风格==,不是标准也不是协议,只是一种风格;基于这个风格设计的软件可更加简洁更有层次更易于实现缓存等机制

6.1.2 Restful风格的主要功能

主要用于实现资源操作 (互联网所有的事物都可以被抽象为资源),即使用不同方法对资源进行操作。例如使用的请求方式POST、DELETE、PUT和GET,分别对应添加、删除、修改和查询操作

在了解了RestFul风格的基本概念后,我们再来对比一下使用传统方式和RestFul风格来操作资源的区别

6.1.3 使用传统方式操作资源

传统方式操作资源:通过不同的参数来实现不同的效果,方法单一,例如使用postget请求

  • http://localhost:8080/item/queryItem.action?id=1查询 (对应GET请求)
  • http://localhost:8080/item/saveItem.action新增 (对应POST请求)
  • http://localhost:8080/item/queryItem.action?id=1更新 (对应POST请求)
  • http://localhost:8080/item/deleteItem.action?id=1删除 ( (对应POST或者GET请求))

6.1.4 使用RestFul操作资源

使用RestFul操作资源:可以通过不同的请求方式来实现不同的效果

如下,请求地址一样,但功能可以不同!

  • http://localhost:8080/item/1:查询 (对应GET请求)
  • http://localhost:8080/item:新增 (对应POST请求)
  • http://localhost:8080/item:更新 (对应PUT请求)
  • http://localhost:8080/item/1:删除 (对应DELETE请求)

在了解了RestFul风格的基本概念后,我们开始学习ResultFul风格的具体使用

6.2 RestFul风格的具体使用

6.2.1 使用正常方式

1.编写RestfulController控制器类
package com.kuang.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

// 使用@Controller注解, 将该类注册为Controller层, 交由Spring的IOC容器统一管理
@Controller
public class RestfulController {
    
     /**
      * 使用默认方式的进行访问
      * 使用@RequestMapping注解, 设置请求映射的访问路径
      * 其真实访问路径为: http://localhost:8888/add?a=1&b=2 
      */
    @RequestMapping("/add")
    public String test(int a, int b, Model model) {
        // 设置一个结果
        int result = a + b;
        // 封装数据: 向模型中添加属性msg与其值,进行视图渲染
        model.addAttribute("msg","结果为"+result);
        // 返回视图逻辑名, 交由视图解析器进行处理
        return "user/hello";
    }
    
}
2.测试结果
2-1 未传递参数
  • 直接在默认URL链接添加/add,即URL链接为:localhost:8080/add

在这里插入图片描述

结果访问页面失败,报HTTP状态500错误!

分析

由于我们并未传递参数给后端,因此无法访问页面和得出结果

2-2 传递参数后
  • add后面传递a和b的参数值,即URL链接为:localhsot:8080/add?a=1&b=2

在这里插入图片描述

结果访问页面成功,并且在页面中显示结果!

6.2.2 使用RestFul风格

1.修改RestfulController控制类
1-1 计算整数和
package com.kuang.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

// 使用@Controller注解, 将该类注册为Controller层, 交由Spring的IOC容器统一管理
@Controller
public class RestfulController {
    
     /**
      * 使用RestFul风格进行访问
      * 使用@RequestMapping注解, 设置请求映射的访问路径
      * 其真实访问路径为: http://localhost:8888/add/a/b
      * 而使用默认方式的访问路径则为:http://localhost:8888/add?a=1&b=2
      */
    @RequestMapping("/add/{a}/{b}")
    // 使用@PathVariable注解,让方法参数的值对应绑定到一个URL模板变量上
    public String test(@PathVariable int a, @PathVariable int b, Model model) {
        // 设置一个结果
        int result = a + b;
        // 封装数据: 向模型中添加属性msg与其值,进行视图渲染
        model.addAttribute("msg","结果为"+result);
        // 返回视图逻辑名,交由视图解析器进行处理
        return "user/hello";
    }

}
1-2 拼接字符串
package com.kuang.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

// 使用@Controller注解, 将该类注册为Controller层, 交由Spring的IOC容器统一管理
@Controller
public class RestfulController {   
    
    /**
     * 使用@RequestMapping注解, 设置映射请求路径
     * 使用"{}"将参数a和b括起来, 参数之间使用"/"分开
     */
    @RequestMapping("/add/{a}/{b}")
    // 使用@PathVariable注解,将方法值对应绑定到URL模板变量上
    public String test2(@PathVariable String a, @PathVariable String b,Model model) {
        // 设置一个结果
        String result = a + b;
        // 封装数据: 向模型中添加属性msg与其值, 进行视图渲染
        model.addAttribute("msg","结果为"+result);
        // 返回视图逻辑名, 交由视图解析器进行处理
        return "user/hello";
    }
    
}
1-3 拼接整数和字符串
package com.kuang.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

// 使用@Controller注解, 将该类注册为Controller层, 交由Spring的IOC容器统一管理
@Controller
public class RestfulController {
    
    /**
     * 使用@RequestMapping注解, 设置映射请求路径
     * 使用{}将参数a和b括起来, 参数之间使用/分开
     */
    @RequestMapping("/add/{a}/{b}")
    // 使用@PathVariable注解,将方法值对应绑定到URL的模板变量上
    public String test3(@PathVariable int a, @PathVariable String b,Model model) {
        // 设置一个结果
        String result = a + b;
        //封装数据: 向模型中添加属性msg与其值, 进行视图渲染
        model.addAttribute("msg","结果为"+result);
        // 返回视图逻辑名,交由视图解析器进行处理
        return "user/hello";
    }
    
}
2.测试结果
2-1 计算整数和

在这里插入图片描述

结果访问页面成功,显示两个整数和的结果!

2-2 拼接字符串

在这里插入图片描述

结果访问页面成功,显示两字符串拼接的结果!

2-3 拼接整数和字符串

在这里插入图片描述

结果访问页面成功,显示一个整数和字符串拼接的结果!

3.使用总结
  • 使用默认方式访问地址为:http://localhost:8888/add?a=1&b=2,这种方式虽然看起来比较清楚,但容易暴露源代码中变量信息,安全性不够高
  • 使用RestFul风格访问地址为:http://localhost:8888/add/a/b,这种方式比较简洁高效,虽然只看URL链接不清楚在干嘛,但是安全性却相对较高

6.2.3 使用@RequstMapping注解

1.@RequestMapping注解源码浅析
1-1 查看@RequestMapping注解源码
package org.springframework.web.bind.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import org.springframework.core.annotation.AliasFor;

/**
 * 该注解用于将web请求映射到具有灵活方法签名的请求处理类中的方法
 *
 * 注意: 该注解可以使用在类和方法级别上. 
 * 在大多数情况, 在方法级别, 应用程序更喜欢使用特定于HTTP方法的变体之一: 
 * @GetMapping, @PostMapping, @PutMapping, @DeleteMapping, @PatchMapping.
 *
 * 注意: 若使用controller(控制器)接口(例如AOP动态代理), 确保持你所有的映射注解都是一致的: 
 * 例如 @RequestMapping(请求映射)和@SessionAttributes(会话属性)在控制器接口上, 而不是实现类上
 *
 * @author Juergen Hoeller
 * @author Arjen Poutsma
 * @author Sam Brannen
 * @since 2.5
 * @see GetMapping
 * @see PostMapping
 * @see PutMapping
 * @see DeleteMapping
 * @see PatchMapping
 */
// 使用@Target注解, 设置作用目标, 元素类型为类和方法上
@Target({ElementType.TYPE, ElementType.METHOD})
// 使用@Retention注解, 设置保留政策为运行时策略
@Retention(RetentionPolicy.RUNTIME)
// 使用@Documented注解, 该注解将由javadoc和类型工具记录, 并且成为注解元素公共API的一部分
@Documented
// 使用@Mapping注解, 表示该注解为Web映射注解
@Mapping
public @interface RequestMapping {

	/**
	 * 主要作用: 给这个映射分配一个名字, 它支持在类级别和方法级别使用
	 * 若使用两种级别, 派生的组合名将使用"#"分隔符连接
	 * @see org.springframework.web.servlet.mvc.method.annotation.MvcUriComponentsBuilder(Mvc的Uri组件构筑器)
	 * @see org.springframework.web.servlet.handler.HandlerMethodMappingNamingStrategy(处理器方法映射命名策略)
	 */
	String name() default "";

	/**
	 * 主映射由该注解表达, 这是path(路径)的别名, 同样支持类级别和方法级别
	 * 例如, 使用@RequestMapping("/foo")等同于@RequestMapping(path="/foo")
	 * 若使用类级别, 所有的方法级别映射包含该主映射, 为特定的处理器方法缩小范围
	 * 注意: 若一个处理器方法没有显式映射到任何路径, 它将被有效地映射到一个空路径
	 */
	@AliasFor("path")
	String[] value() default {};

	/**
	 * 路径映射URI(例如"/profile"), 也支持"Ant-style"路径格式(例如"/profile/**")
	 * 在方法级别, 在类级别表示的主映射中支持相对路径(例如"edit"), 路径映射URIs包含占位符(例如"/${profile_path}"), 支持类级别和方法级别
	 * 若使用类级别, 所有的方法级别映射包含该主映射, 为指定的处理器方法缩小范围 
	 * 注意: 若一个处理器方法没有显式映射到任何路径, 它将被有效地映射到一个空路径
	 * @since 4.2
	 */
	@AliasFor("value")
	String[] path() default {};

	/**
	 * HTTP请求要方法映射到的方法, 缩小主映射: 
	 * GET(查询), POST(增加), HEAD, OPTIONS, PUT(修改), PATCH, DELETE(删除), TRACE
	 * 支持在类型级别和方法级别使用
	 * 若使用类型级别, 所有的方法级别映射包含这个HTTP方法限制
	 */
	RequestMethod[] method() default {};

	/**
	 * 映射请求的参数, 缩小主映射范围
	 */
	String[] params() default {};

	/**
	 * 映射请求的头部, 缩小主映射范围
	 * @see org.springframework.http.MediaType(媒介类型)
	 */
	String[] headers() default {};


	/**
	 * 根据映射处理程序可以使用的媒体类型缩小主映射
	 * 由一个或者多个媒介类型组成, 其中一个必须与请求"Content-Type"(内容类型)头相匹配
	 * @see org.springframework.http.MediaType(媒介类型)
	 * @see javax.servlet.http.HttpServletRequest(HttpServlet的请求)#getContentType()(获取内容类型)
	 */
	String[] consumes() default {};

	/**
	 * 通过映射处理器可以生成媒介类型来缩小主映射. 
	 * 由一个或多个媒介类型组成, 必须根据请求的"可接受"媒介类型通过内容协商选择其中之一
	 * @see org.springframework.http.MediaType(媒介类型)
	 */
	String[] produces() default {};

}
1-2 查看@Mapping注解源码
package org.springframework.web.bind.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 该元注解表示一个Web映射注解
 *
 * @author Juergen Hoeller
 * @since 3.0
 * @see RequestMapping
 */
// 使用@Target注解, 设置作用目标, 元素类型为注解类型
@Target({ElementType.ANNOTATION_TYPE})
// 使用@Target注解, 设置保留策略为运行时策略
@Retention(RetentionPolicy.RUNTIME)
public @interface Mapping {

}
1-3 查看RequestMethod方法源码
  • RequestMethod方法是一个枚举类,其中包含了我们常见的GETPOST方式之外,还有HEAD、PUT、PATCH 、DELETE、OPTIONS、TRACE等方式
package org.springframework.web.bind.annotation;

// 枚举类RequestMethod(请求方法)
public enum RequestMethod {
    
    GET, // get请求(对应查询操作)
    HEAD, // 请求头
    POST, // post请求(对应增加操作)
    PUT, // put请求(对应修改操作)
    PATCH,
    DELETE, // delete请求(对应删除操作)
    OPTIONS,
    TRACE;
    
    private RequestMethod() {
    }
    
}
2.修改RestfulController控制类
2-1 使用name属性
package com.kuang.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

// 使用@Controller注解, 将该类注册为Controller层, 交由Spring的IOC容器统一管理
@Controller 
public class RestfulController {
    
    // 使用@RequestMapping注解, 设置映射请求路径
     @RequestMapping(name = "/add/{a}/{b}",method = RequestMethod.GET)
    // 使用@PathVariable注解, 将方法值对应绑定到URL模板变量上
    public String test4(@PathVariable int a, @PathVariable String b,Model model) {
        // 设置一个结果
        String result = a + b;
        // 封装数据: 向模型中添加属性msg与其值, 进行视图渲染
        model.addAttribute("msg","结果1为"+result);
        // 返回视图逻辑名, 交由视图解析器进行处理
        return "user/hello";
    }
    
}
2-2 使用value属性
package com.kuang.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

// 使用@Controller注解, 将该类注册为Controller层, 交由Spring的IOC容器统一管理
@Controller
public class RestfulController {
    
    // 使用@RequestMapping注解, 设置映射请求路径 (默认使用GET请求方式)
     @RequestMapping(value = "/add/{a}/{b}",method = RequestMethod.GET)
    // 使用@PathVariable注解,将方法值对应绑定到URL模板变量上
    public String test4(@PathVariable int a, @PathVariable String b,Model model) {
        // 设置一个结果
        String result = a + b;
        // 封装数据: 向模型中添加属性msg与其值,进行视图渲染
        model.addAttribute("msg","结果1为"+result);
        // 返回视图逻辑名, 交由视图解析器进行处理
        return "user/hello";
    }
    
}
2-3 使用path属性
package com.kuang.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

// 使用@Controller注解, 将该类注册为Controller层, 交由Spring的IOC容器统一管理
@Controller
public class RestfulController {
    
    // 使用@RequestMapping注解设置映射请求路径 (默认使用GET请求方式)
     @RequestMapping(path = "/add/{a}/{b}",method = RequestMethod.GET)
    // 使用@PathVariable注解,将方法值对应绑定到URL模板变量上
    public String test4(@PathVariable int a, @PathVariable String b,Model model) {
        // 设置一个结果
        String result = a + b;
        // 封装数据:向模型中添加属性msg与其值, 进行视图渲染
        model.addAttribute("msg","结果1为"+result);
        // 返回视图逻辑名, 交由视图解析器进行处理
        return "user/hello";
    }
    
}
3.测试结果
3-1 使用name属性

在这里插入图片描述

结果访问失败,HTTP状态404找不到!

3-2 使用value属性

在这里插入图片描述

4.使用总结
  • SpringMVC@RequstMapping注解能够请求处理HTTP请求的方法,比如GET、PUT、POST/DELETE以及PATCH
  • 所有的地址栏请求默认都是==HTTP GET类型==的

6.3使用其他方法级别的注解

6.3.1 方法级别的注解

方法级别注解变体有如下几个组合注解

@GetMapping对应get请求, 查询操作
@PostMapping对应post请求, 添加操作
@PutMapping对应put请求,修改操作
@DeleteMapping对应delete请求,删除操作
@PatchMapping对应patct请求,多条数据修改和删除操作

6.3.2 使用@GetMapping注解

1.了解@GetMapping注解

@GetMapping是一个组合注解,相当于@RequstMapping(method=ReustMethod.GET),平常使用的会比较多

2.编写RestfulController控制类
package com.kuang.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

// 使用@Controller注解, 将该类注册为Controller层, 交由Spring的IOC容器统一管理
@Controller
public class RestfulController {
    
    // 使用@PostMapping注解, 设置映射请求路径, 请求方式为post请求
    @PostMapping("/add/{a}/{b}")
    // 使用@PathVariable注解,让方法值对应绑定到URL模板变量上
    public String test4(@PathVariable int a, @PathVariable String b,Model model) {
        // 设置一个结果
        String result = a + b;
        // 封装数据: 向模型中添加属性msg与其值,进行视图渲染
        model.addAttribute("msg","结果1为"+result);
        // 返回视图逻辑名,交由视图解析器进行处理
        return "user/hello";
    }
    
}
3.测试结果

在这里插入图片描述

结果访问失败,HTTP状态405方法不允许!

4.错误总结
  • 400错误表示URL请求错误
  • 404错误表示URL未找到
  • 405错误表示方法不允许
  • 500错误表示内部服务器错误或者代码出错
5.使用总结
  • "name"属性为该映射起一个名字,而并不代表该映射的具体路径
  • "value"属性表示该映射的具体路径,但不清楚在哪些情况下指定路径
  • "path"属性也表示该映射的具体路径,作用与value相同

6.3.3 使用PostMapping注解

1.修改RestfulController控制类
package com.kuang.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

// 使用@Controller注解, 将该类注册为Controller层, 交由Spring的IOC容器统一管理
@Controller 
public class RestfulController {   
    
    /** 
     * 使用@GetMapping注解, 设置映射请求路径, 请求方式为get
     * 其真实访问路径为: http://localhost:8888/add/123/hello
     */
    @GetMapping("/add/{a}/{b}")
    //使用@PathVariable注解,将方法值对应绑定到URL模板变量上
    public String test5(@PathVariable int a, @PathVariable String b,Model model) {
        // 设置一个结果
        String result = a + b;
        // 封装数据: 向模型中添加属性msg与其值, 进行视图渲染
        model.addAttribute("msg","结果2为"+result);
        // 返回视图逻辑名, 交由视图解析器进行处理
        return "user/hello";
    }
    
}
2.编写表单提交页面
  • 创建一个form.jsp页面用来提交表单信息,直接在action设置a和b的参数值注意要在web文件夹下创建,否则会访问不到
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
   <%-- 直接在action中设置a和b的参数值
        注意from.jsp页面要放在web文件夹下 --%>
    <form action="/add/123/helloworld" method="post">
        <input type="text" name="a"/>
        <input type="text" name="b"/>
        <input type="submit"/>
    </form>
    
</body>
</html>
3.测试结果

在这里插入图片描述

结果访问成功,并且显示整数和字符串的拼接结果"123hello"!

6.4 混合使用方法级映射注解

6.4.1 使用@RequestMapping和@GetMapping注解

1.修改RestfulController控制类
  • RestfulController控制器类中同时使用@RequestMapping@GetMapping注解
package com.kuang.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

// 使用@Controller注解, 将该类注册为Controller层, 交由Spring的IOC容器统一管理
@Controller 
public class RestfulController {
    
    // 使用@RequestMapping注解, 设置映射请求路径, 请求方式为get类型, 这里推荐使用使用value属性
    @RequestMapping(value= "/add/{a}/{b}",method = RequestMethod.GET)
    // 使用@PathVariable注解,让方法值对应绑定到URL模板变量上
    public String test4(@PathVariable int a, @PathVariable String b,Model model) {
        // 设置一个结果
        String result = a + b;
        // 封装数据: 向模型中添加属性msg与其值,进行视图渲染
        model.addAttribute("msg","结果1为"+result);
        // 返回视图逻辑名,让视图解析器进行处理
        return "user/hello";
    }
    
    // 使用@GetMapping注解, 设置映射请求路径, 请求方式为get类型
    @GetMapping("/add/{a}/{b}")
    // 使用@PathVariable注解,将方法值对应绑定到URL模板变量上
    public String test5(@PathVariable int a, @PathVariable String b,Model model) {
        // 设置一个结果
        String result = a + b;
        // 封装数据: 向模型中添加属性msg与其值, 进行视图渲染
        model.addAttribute("msg","结果2为"+result);
        // 返回视图逻辑名,让视图解析器进行处理
        return "user/hello";
    }
    
}
2.测试结果

在这里插入图片描述

结果报错:Ambiguous mapping. Cannot map restfulController’ method,即RestfulController类中存在模棱两可的映射

3.错误分析

由于RequestMapping使用的请求方法就是GET类型,同时使用@GetMapping相当于定义了两次,因此RestfulController出现模棱两可的映射

4.使用总结
  • @RequestMapping注解中的method = RequestMethod.GET@GetMapping注解作用相同
  • 避免同时使用@RequestMapping注解@GetMapping注解,以免出现模棱两可的映射问题

6.4.2 使用@RequestMapping和@PostMapping注解

1.修改RestfulController控制类
  • RestfulController控制器类中同时使用@RequestMapping@PostMapping注解
package com.kuang.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

// 使用@Controller注解, 将该类注册为Controller层, 交由Spring的IOC容器统一管理
@Controller
public class RestfulController {
    
	// 使用@RequestMapping注解, 设置映射请求路径, 请求方式为get类型, 推荐使用value属性
    @RequestMapping(value= "/add/{a}/{b}",method = RequestMethod.GET)
    // 使用@PathVariable注解, 将方法值对应绑定到URL模板变量上
    public String test4(@PathVariable int a, @PathVariable String b, Model model) {
        // 设置一个结果
        String result = a + b;
        // 封装数据:向模型中添加属性msg与值,进行视图渲染
        model.addAttribute("msg","结果1为"+result);
        // 返回视图逻辑名,交由视图解析器进行处理
        return "user/hello";
    }
    
   // 使用@PostMapping注解, 设置映射请求路径, 请求方式为get类型
    @PostMapping("/add/{a}/{b}")
    // 使用@PathVariable注解,让方法值对应绑定到URL模板变量上
    public String test5(@PathVariable int a, @PathVariable String b, Model model) {
        // 设置一个结果
        String result = a + b;
        // 封装数据:向模型中添加属性msg与值,进行视图渲染
        model.addAttribute("msg","结果2为"+result);
        // 返回视图逻辑名,让视图解析器进行处理
        return "user/hello";
    }
    
}
2.测试结果

在这里插入图片描述

结果访问成功,并且显示整数和字符串的拼接结果"123hellospring"!

3.使用总结
  • 同时使用@RequestMapping@PostMapping注解控制器调用的是@RequestMapping注解的方法
  • 地址栏请求默认方式是GET请求

6.4.3 使用@GetMapping和@PostMapping注解

1.修改RestfulController控制类
  • RestfulController控制器类中同时使用@GettMapping@PostMapping注解
package com.kuang.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

// 使用@Controller注解, 将该类注册为Controller层, 交由Spring的IOC容器统一管理
@Controller 
public class RestfulController {
    
    // 使用@PostMapping注解, 设置映射请求路径, 请求方式为post类型
    @PostMapping("/add/{a}/{b}")
    // 使用@PathVariable注解,让方法值对应绑定到URL模板变量上
    public String test4(@PathVariable int a, @PathVariable String b,Model model) {
        // 设置一个结果
        String result = a + b;
        // 封装数据:向模型中添加属性msg与值,进行视图渲染
        model.addAttribute("msg","结果1为"+result);
        // 返回视图逻辑名,让视图解析器进行处理
        return "user/hello";
    }
    
    // 使用@GetMapping注解, 设置映射请求路径, 请求方式为get类型
    @GetMapping("/add/{a}/{b}")
    // 使用@PathVariable注解,将方法值对应绑定到URL模板变量上
    public String test5(@PathVariable int a, @PathVariable String b,Model model) {
        // 设置一个结果
        String result = a + b;
        // 封装数据: 向模型中添加属性msg与其值, 进行视图渲染
        model.addAttribute("msg","结果2为"+result);
        // 返回视图逻辑名,交由视图解析器进行处理
        return "user/hello";
    }
    
}
2.测试结果

在这里插入图片描述

结果访问成功,并且显示整数和字符串的拼接结果"123hellospringmvc"!

3.使用总结
  • 同时使用@GettMapping@PostMapping注解控制器调用的是@GetMapping注解的方法
  • 再次证明地址栏请求默认方式是GET请求

好了,今天的有关 Restful风格的简单使用 的学习就到此结束啦。欢迎小伙伴们积极学习和讨论,喜欢的可以给蜗牛君点个关注,顺便来个一键三连。我们下期见,拜拜啦!


参考视频链接【狂神说Java】SpringMVC最新教程IDEA版通俗易懂

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

狂奔の蜗牛rz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值