DAY10_SpringBoot—SpringMVC重定向和转发RestFul风格JSON格式SSM框架整合

news2024/9/28 5:31:27

目录

  • 1 SpringMVC
    • 1.1 重定向和转发
      • 1.1.1 转发
      • 1.1.2 重定向
      • 1.1.3 转发练习
      • 1.1.4 重定向练习
      • 1.1.5 重定向/转发特点
      • 1.1.6 重定向/转发意义
    • 1.2 RestFul风格
      • 1.2.1 RestFul入门案例
      • 1.2.2 简化业务调用
    • 1.3 JSON
      • 1.3.1 JSON介绍
      • 1.3.2 JSON格式
        • 1.3.2.1 Object格式
        • 1.3.2.2 Array格式
        • 1.3.2.3 嵌套格式
    • 1.4 SpringMVC JSON返回
      • 1.4.1 学习的意义
      • 1.4.2 @ResponseBody注解
      • 1.4.2 @RestController
  • 2 SpringBoot整合其他框架
    • 2.1 创建项目springboot_demo_4
    • 2.2 编辑pom.xml文件
    • 2.2 编辑yml配置文件
    • 2.3 编辑userList.html页面
    • 2.4 编辑UserController
    • 2.5 编辑UserService
    • 2.6 编辑UserMapper
    • 2.7 页面效果展现
    • 2.8 RestFul策略优化

1 SpringMVC

1.1 重定向和转发

1.1.1 转发

由服务器内部进行页面的跳转

一般情况下 SpringMVC内部 以转化为主
在这里插入图片描述

1.1.2 重定向

当用户发起请求时,由服务器返回有效的网址信息.之后由用户再次发起请求的结构
在这里插入图片描述

1.1.3 转发练习

/**
    * 测试转发和重定向
    * 1.准备一个请求 findUser请求
    * 2.要求转发到 findDog请求中
    * 3.关键字   forward: 转发的是一个请求.....
    * 4.特点:    转发时 会携带用户提交的数据,用户浏览器地址不会发生改变
    * 5.转发的意义:
    *      如果直接转向到页面中,如果页面需要额外的参数处理,则没有执行.
    *      如果在该方法中添加业务处理,则方法的耦合性高.不方便后续维护
    *      所以方法应该尽可能松耦合
*/
@RequestMapping("/findUser")
public String findUser(String name) {
    //return 本身就是一个转发
    //return "dog"; 页面耦合性高
    return "forward:/findDog";
}

//需要将name属性返回给页面
@RequestMapping("/findDog")
public String findDog(String name, Model model) {
    System.out.println("动态获取name属性值:" + name);
    model.addAttribute("name", name + "旺旺旺");
    return "dog";
}
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>转发与重定向练习</title>
</head>
<body>
    <h1>我是Dog页面</h1>
    <!--动态获取服务器数据-->
    <h3 th:text="${name}"></h3>
</body>
</html>
  • 运行结果

在这里插入图片描述
在这里插入图片描述

1.1.4 重定向练习

/**
     * 测试重定向
     * 1.准备一个请求 findUser请求
     * 2.要求重定向到 findDog请求中
     * 3.关键字    redirect:多次请求多次响应
     * 4.特点:    重定向时 不会携带用户的数据,用户的浏览器的地址会发生变化
     * 5.重定向的意义:
     * 		实现了内部方法的松耦合
     */
    @RequestMapping("/findUser")
    public String findUser2(String name) {
        return "redirect:/findDog";
    }

    //需要将name属性返回给页面
    @RequestMapping("/findDog")
    public String findDog2(String name, Model model) {
        System.out.println("动态获取name属性值:" + name);
        model.addAttribute("name", name + "旺旺旺");
        return "dog";
    }
  • 运行结果

在这里插入图片描述
在这里插入图片描述

1.1.5 重定向/转发特点

  • 转发 forward
    • 会携带用户提交的数据
    • 用户浏览器的地址不会发生改变
  • 重定向 redirect
    • 由于是多次请求,所以不会携带用户的数据
    • 由于是多次请求,所以用户的浏览器的地址会发生变化

1.1.6 重定向/转发意义

  • 实现了方法内部的松耦合
    • 如果需要携带参数 使用转发
    • 如果一个业务已经完成需要一个新的开始则使用重定向

1.2 RestFul风格

1.2.1 RestFul入门案例

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

@Controller
public class RestFulController {

    /**
     * 常规get请求:
     * url地址: http://localhost:8090/restFul?id=1&name=tom
     * get请求弊端: 如果参数有多个,则key-value的结构需要多份.
     * RestFul结构:
     *  url地址: http://localhost:8090/restFul/{id}/{name}
     *      1.参数之间使用/分割
     *      2.参数的位置一旦确定,不可更改
     *      3.参数使用{}号的形式进行包裹,并且设定形参
     *      4.在接收参数时,使用特定的注解取值@PathVariable
     *
     * @PathVariable: 参数说明
     *      1.name/value  动态接收形参的数据  如果参数相同则省略不写
     *      2.必填项 required 默认为true
     */
    @RequestMapping("/restFul/{id}/{name}")
    public String restFul(@PathVariable Integer id,
                          @PathVariable String name){
        System.out.println("获取参数:"+id+"|"+name);
        return "success";
    }
}

1.2.2 简化业务调用

  • 按照常规说明执行增删改查的操作需要多个业务方法
    • 新增用户 /insertUser
    • 修改用户 /updateUser
    • 删除用户 /deleteUser
    • 查询用户 /selectUser

上述的操作在早期这么写没有问题.但是新的请求规范规定应该让请求尽可能变成无状态的请求.(删除动词)

  • 常见请求类型: 1.GET 2.POST 3.PUT 4.DELETE
  • 优化:
    • 新增用户 /user 请求类型: POST
    • 修改用户 /user 请求类型: PUT
    • 删除用户 /user 请求类型: DELETE
    • 查询用户 /user 请求类型: GET

优化注解:

在这里插入图片描述

  • 总结:
    • 利用RestFul 可以简化get请求类型.
    • 利用RestFul可以使用无状态的请求,通过不同的请求类型 控制不同的业务逻辑(较为常用)

1.3 JSON

1.3.1 JSON介绍

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式(字符串)。它使得人们很容易的进行阅读和编写。同时也方便了机器进行解析和生成。

1.3.2 JSON格式

1.3.2.1 Object格式

对象(object) 是一个无序的“‘名称/值’对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。

在这里插入图片描述

JSON练习: {“key1”:“value1”,“key2”:“value2”}

1.3.2.2 Array格式

数组(array) 是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔。

在这里插入图片描述

JSON: [“value1”,“value2”,“value3”]

1.3.2.3 嵌套格式

在这里插入图片描述

关于JSON串 嵌套

[true,false,{"id":100,"name":"tomcat","hobbys":["敲代码","玩游戏","找对象",{"username":"admin","password":"123456"}]}]

1.4 SpringMVC JSON返回

1.4.1 学习的意义

现阶段一般的请求都是前后端分离的方式ajax (jQuery/axios),一般向服务器请求的数据通常详情下都是采用JSON串的方式返回.

1.4.2 @ResponseBody注解

import com.jt.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class JSONController {

    /**
     * 需求: 要求根据getJSON的请求,获取User对象的JSON数据.
     * 用法: 如果需要返回JOSN数据则使用注解@ResponseBody
     * 知识点讲解:
     *      返回的对象之后,SpringMVC通过内部API(ObjectMapper)
     *      调用对象的getXXX()方法动态的获取属性和属性值.
     *  演化规则:
     *      getAge() ~~~~~去掉get首字母~~~~~Age()
     *      ~~~~~~首字母小写~~~~~age()~~~~获取属性age
     *      ~~~~~通过getAge() 动态获取属性的值
     *
     *  JSON: {"age": "今年18岁!!!"}
     *  注意事项:
     *      必须添加get/set方法
     */
    @RequestMapping("/getJSON")
    @ResponseBody //返回值就是一个JSON串
    public User getJSON(){
        User user = new User();
        user.setId(1000).setName("JSON测试");
        return user; //不需要执行视图解析器
    }
}

1.4.2 @RestController

在这里插入图片描述

2 SpringBoot整合其他框架

2.1 创建项目springboot_demo_4

在这里插入图片描述
在这里插入图片描述

2.2 编辑pom.xml文件

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <!--引入父级工程-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.1.8</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.jt</groupId>
    <artifactId>springboot_demo_4</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot_demo_4</name>
    <description>springboot_demo_4</description>
    <properties>
        <java.version>17</java.version>
    </properties>
    <dependencies>
        <!--引入jdbc包-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <!--thymeleaf导入模版工具类-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <!--SpringMVCjar包文件-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--热部署工具-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <!--lombok插件-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <!--测试包-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!--引入数据库驱动 -->
        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <scope>runtime</scope>
        </dependency>
        <!--spring整合mybatis-plus -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.5</version>
        </dependency>
    </dependencies>
    <!--负责项目打包部署-->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <image>
                        <builder>paketobuildpacks/builder-jammy-base:latest</builder>
                    </image>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

2.2 编辑yml配置文件

server:
  port: 8090
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/jtadmin?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
    username: root
    password: root

  #整合SpringMVC
  thymeleaf:
    #设置页面前缀
    prefix: classpath:/templates/
    #设置页面后缀
    suffix: .html
    #是否使用缓存
    cache: false
mybatis-plus:
  type-aliases-package: com.jt.pojo
  mapper-locations: classpath:/mappers/*.xml
  #开启驼峰映射
  configuration:
    map-underscore-to-camel-case: true
#添加MP日志  打印执行的sql
logging:
  level:
    com.jt.mapper: debug

2.3 编辑userList.html页面

<!DOCTYPE html>
<!--导入模板标签!!!!!-->
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>用户列表数据</title>
</head>
<body>
   <!--准备一个表格-->
    <table border="1px" align="center" width="800px">
        <tr align="center">
            <td colspan="4"><h3>用户列表</h3></td>
        </tr>
        <tr align="center">
            <td>ID</td>
            <td>名称</td>
            <td>年龄</td>
            <td>性别</td>
        </tr>
        <!--1.页面通过request对象 动态的获取userList数据 之后tr展现-->
        <tr align="center" th:each="user : ${userList}">
            <td th:text="${user.id}"></td>
            <td th:text="${user.name}"></td>
            <td th:text="${user.age}"></td>
            <td th:text="${user.sex}"></td>
        </tr>
    </table>
</body>
</html>

2.4 编辑UserController

/**
     * 查询所有的用户列表数据,在userList.html中展现数据
     */
    @RequestMapping("/userList")
    public String userList(Model model){
        //1.查询业务层获取数据
        List<User> userList = userService.findAll();
        //2.将数据保存到Model对象中返回给页面
        model.addAttribute("userList",userList);
        return "userList";
    }

2.5 编辑UserService

@Service
public class UserServiceImpl implements UserService{
    @Autowired
    private UserMapper userMapper;

    @Override
    public List<User> findAll() {
        return userMapper.selectList(null);
    }
}

2.6 编辑UserMapper

在这里插入图片描述

2.7 页面效果展现

在这里插入图片描述

2.8 RestFul策略优化

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1410040.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

mysql 多版本并发控制mvcc

行级锁的一个变种避免了加锁&#xff0c;开销低非阻塞读操作&#xff0c;写操作是行级原理&#xff1a;使用数据在某个时间点的快照实现&#xff0c;不同事务在同一个时间可以看到同一个表中的不同数据。分类&#xff1a;乐观&#xff0c;悲观在一行中存储更多数据&#xff0c;…

芯片查询工具:道合顺电子网助您轻松实现芯片查询、分析与调试

在电子领域&#xff0c;对芯片进行准确的查询、分析和调试是确保设备正常运行和故障排查的关键步骤。为了帮助用户轻松实现这一过程&#xff0c;道合顺电子网提供了一系列高效的芯片查询工具&#xff0c;助您快速获取所需信息、分析数据以及进行灵活的调试操作。 为什么选择道…

SpringMVC-HttpMessageConverter 报文信息转化器

文章目录 HttpMessageConverter一、概念二、RequestBody三、RequestEntity四、 ResponseBody1.返回JSON格式的字符串 五、RestController六、ResponseEntity HttpMessageConverter 一、概念 报文信息转化器&#xff0c;将请求报文转化为Java对象&#xff0c;或将Java对象转化…

使用云手机运营TikTok,实现更多可能性

在数字化时代&#xff0c;社交媒体平台的崛起改变了商业推广和品牌建设的方式。TikTok&#xff0c;作为一款风靡全球的短视频应用&#xff0c;吸引了数以亿计的用户。对于跨境电商和品牌推广而言&#xff0c;使用云手机运营TikTok可以实现多种功能&#xff0c;让运营变得更加灵…

idea中使用带provide修饰的依赖,导致ClassNotFound

1、provide修饰的依赖作用&#xff1a; 编译时起作用&#xff0c;而运行及打包时不起作用。程序打包到Linux上运行时&#xff0c;若Linux上也有这些依赖&#xff0c;为了在Linux上运行时避免依赖冲突&#xff0c;可以使用provide修饰&#xff0c;使依赖不打包进入jar中 2、可能…

再获权威认可!亚信安全实力占据CCSIP 2023全景图75个领域

近日&#xff0c;FreeBuf咨询正式发布《CCSIP&#xff08;China Cyber Security Industry Panorama&#xff09;2023中国网络安全行业全景册&#xff08;第六版&#xff09;》。本次全景册面向广大国内安全厂商&#xff0c;由厂商自主申报并填写信息征集表&#xff0c;经FreeBu…

js中的内置对象、数学对象、日期对象、数组对象、字符串对象

js中的对象&#xff08;三种&#xff09;&#xff1a; 自定义对象 car、computer DOM对象 div、p BOM对象 window、console 内置对象 数学对象 Math &#xff08;object类型&#xff09; 1、圆周率 Math.PI 2、向下取整(返回值) Math.floor() 3、向上取整(返回值) M…

【Node-RED】node-red-contrib-opcua-server模块使用(1)

node-red-contrib-opcua-server模块使用 前言node-red-contrib-opcua-server模块使用1.1.1版本报错场景1.1.0版本报错场景0.4.1版本正常场景之前版本的卸载下载0.4.1版本openssl 1.1.0下载pem文件的调试生成导入server-with-context.json示例 前言 在Node-RED中&#xff0c;如…

小红书如何做混部?

作者&#xff1a;宋泽辉&#xff08;小红书&#xff09;、张佐玮&#xff08;阿里云&#xff09; 编者按&#xff1a; Koordinator 是一个开源项目&#xff0c;是基于阿里巴巴内部多年容器调度、混部实践经验孵化诞生&#xff0c;是行业首个生产可用、面向大规模场景的开源混…

uni-app(微信小程序、钉钉小程序)打开第三方地图:uni.openLocation的使用

1.相关参数 &#xff08;文档&#xff09; 2. 代码实现 openMap() {uni.openLocation({latitude: 29.074979,longitude: 119.52142,name: 地点,address: 浙江省金华市婺城区白龙桥镇郭力垄水库(白龙桥镇),success: function(res) {console.log(打开系统位置地图成功)},fail: fu…

Springboot,使用sharedingjdbc 分库分表,最佳实践。

一、简介 Apache ShardingSphere 是一套开源的分布式数据库解决方案组成的生态圈&#xff0c;它由 JDBC、Proxy 和 Sidecar&#xff08;规划中&#xff09;这 3 款既能够独立部署&#xff0c;又支持混合部署配合使用的产品组成。 它们均提供标准化的数据水平扩展、分布式事务和…

WIFI电路原理时序检修思路

uart是串口&#xff0c;bt是蓝牙&#xff0c;hsic是高速接口。pcm是音频接口。时序图的第五步是发出就绪信号&#xff0c;然后第六步与门发出就绪信号。 wifi芯片是u8_rf。 特别说明&#xff1a;short表示短接。xw表示实际是看不到物体的&#xff0c;是直接相连的。 找信号50_…

MySQL 定位长事务(Identify Long Transactions)

在MySQL的运行中&#xff0c;经常会遇到一些长事务。长事务意味着长时间持有系统资源&#xff0c;这在OLAP系统中很常见&#xff0c;但在OLTP系统中&#xff0c;长事务意味着争用、并发降低&#xff0c;等待。长事务伴随的典型现象就是经常听到开发人员说"xxx表被锁住了……

2024年危险化学品生产单位安全生产管理人员证模拟考试题库及危险化学品生产单位安全生产管理人员理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年危险化学品生产单位安全生产管理人员证模拟考试题库及危险化学品生产单位安全生产管理人员理论考试试题是由安全生产模拟考试一点通提供&#xff0c;危险化学品生产单位安全生产管理人员证模拟考试题库是根据危…

深入了解Figure的结构与层次

深入了解Figure的结构与层次 一 Matplotlib中的Figure1.1 Figure的概念和作用:1.2.创建Figure对象:1.3 Figure的属性和方法: 二 子图&#xff08;Axes&#xff09;的角色与创建2.1 子图&#xff08;Axes&#xff09;的概念&#xff1a;2.2 创建子图的方法&#xff1a;2.3 Axes的…

文件名翻译工具,文件名称翻译软件

无论是工作、学习还是生活&#xff0c;我们时常会遇到文件名称难以理解的情况。这时&#xff0c;一款优秀的文件名称翻译软件就显得尤为重要。今天&#xff0c;我要为大家介绍一个备受好评软件——文件批量改名高手&#xff0c;这款软件自带翻译功能&#xff0c;可以帮你轻松实…

【LangChain学习之旅】—(9) 用SequencialChain链接不同的组件

【LangChain学习之旅】—&#xff08;9&#xff09;用SequencialChain链接不同的组件 什么是 ChainLLMChain&#xff1a;最简单的链链的调用方式直接调用通过 run 方法通过 predict 方法通过 apply 方法通过 generate 方法 Sequential Chain&#xff1a;顺序链首先&#xff0c;…

认识数学建模

文章目录 1 什么是数学建模2 数学建模的比赛形式3 参加数学建模的好处4 数学建模的流程5 数学建模成员分工6 数学建模常用软件7 数学建模竞赛7.1 美国大学生数学建模竞赛7.2 MathorCup高校数学建模挑战赛7.3 华中杯大学生数学建模挑战赛7.4 认证杯数学建模网络挑战赛7.5 华东杯…

【投稿优惠|稳定出版】2024年经济、大数据与区块链国际学术会议(ICEBDB 2024)

【投稿优惠|稳定出版】2024年经济、大数据与区块链国际学术会议&#xff08;ICEBDB 2024&#xff09; 重要信息 会议官网&#xff1a;http://www.icebdb.com会议地址&#xff1a;成都召开日期&#xff1a;2024/2/29截稿日期&#xff1a;2024/2/20 &#xff08;先投稿&#xff0…

MWORKS.Syslab 如何统一 Julia、C/C++、Python 乃至 MATLAB —— 解密多语言统一的底层机制

科学世界蓬勃发展&#xff0c;注入了许多时代特有的活力。年轻理科生们的口中逐渐出现了诸如“调参侠”“调包小子”“炼丹师”等新潮的调侃词语&#xff0c;这些来自机器学习/深度学习领域的“梗”在社交网络中逐渐扩散&#xff0c;让人们不禁感叹科学计算已经成为了炙手可热的…