【学习日记2023.4.28】之 Web服务器-Tomcat_Springboot方式下的请求与响应

文章目录

  • 1. WEB服务器-Tomcat
    • 1.1 简介
      • 1.1.1 服务器概述
      • 1.1.2 Web服务器
      • 1.1.3 Tomcat
    • 1.2 基本使用
      • 1.2.1 下载
      • 1.2.2 安装与卸载
      • 1.2.3 启动与关闭
      • 1.2.4 常见问题
    • 1.3 入门程序解析
      • 1.3.1 Spring官方骨架
      • 1.3.2 起步依赖
      • 1.3.3 SpringBoot父工程
      • 1.3.3 内嵌Tomcat
  • 2. SpringBootWeb请求响应
    • 2.1 Postman
      • 2.1.1 介绍
      • 2.1.2 安装
    • 2.2 各种类型参数的请求
      • 2.2.1 简单参数
        • 2.2.1.1 原始方式
        • 2.2.1.2 SpringBoot方式
        • 2.2.1.3 参数名不一致
      • 2.2.2 实体参数
        • 2.2.2.1 简单实体对象
        • 2.2.2.2 复杂实体对象
      • 2.2.3 数组集合参数
        • 2.2.3.1 数组
        • 2.2.3.2 集合
      • 2.2.4 日期参数
      • 2.2.5 JSON参数
      • 2.2.6 路径参数
      • 2.2.7 小结
    • 2.3 响应
      • 2.3.1 @ResponseBody
      • 2.3.2 统一响应结果
      • 2.3.3 案例
        • 2.3.3.1 需求说明
  • 3. 总结

1. WEB服务器-Tomcat

1.1 简介

1.1.1 服务器概述

服务器硬件

  • 指的也是计算机,只不过服务器要比我们日常使用的计算机大很多。
    【学习日记2023.4.28】之 Web服务器-Tomcat_Springboot方式下的请求与响应_第1张图片

服务器,也称伺服器。是提供计算服务的设备。由于服务器需要响应服务请求,并进行处理,因此服务器应具备承担服务并且保障服务的能力。

服务器的构成包括处理器、硬盘、内存、系统总线等,和通用的计算机架构类似,但是由于需要提供高可靠的服务,因此在处理能力、稳定性、可靠性、安全性、可扩展性、可管理性等方面要求较高。

在网络环境下,根据服务器提供的服务类型不同,可分为:文件服务器,数据库服务器,应用程序服务器,WEB服务器等。

服务器只是一台设备,必须安装服务器软件才能提供相应的服务。

服务器软件

服务器软件:基于ServerSocket编写的程序

  • 服务器软件本质是一个运行在服务器设备上的应用程序
  • 能够接收客户端请求,并根据请求给客户端响应数据
    【学习日记2023.4.28】之 Web服务器-Tomcat_Springboot方式下的请求与响应_第2张图片

1.1.2 Web服务器

Web服务器是一个应用程序(软件),对HTTP协议的操作进行封装,使得程序员不必直接对协议进行操作(不用程序员自己写代码去解析http协议规则),让Web开发更加便捷。主要功能是"提供网上信息浏览服务"。
【学习日记2023.4.28】之 Web服务器-Tomcat_Springboot方式下的请求与响应_第3张图片

Web服务器软件使用步骤

  • 准备静态资源(编译后的源码)
  • 下载安装Web服务器软件
  • 将静态资源部署到Web服务器上(以tomcat为例:放到webapps下)
  • 启动Web服务器使用浏览器访问对应的资源(bin目录下双击startup.bat)

对于Web服务器来说,实现的方案有很多,Tomcat只是其中的一种,除了Tomcat以外,还有很多优秀的Web服务器,比如:
【学习日记2023.4.28】之 Web服务器-Tomcat_Springboot方式下的请求与响应_第4张图片

1.1.3 Tomcat

Tomcat服务器软件是一个免费的开源的web应用服务器。是Apache软件基金会的一个核心项目。由Apache,Sun和其他一些公司及个人共同开发而成。

由于Tomcat只支持Servlet/JSP少量JavaEE规范,所以是一个开源免费的轻量级Web服务器。

JavaEE规范: JavaEE => Java Enterprise Edition(Java企业版)

JavaEE规范就是指Java企业级开发的技术规范总和。包含13项技术规范:JDBC、JNDI、EJB、RMI、JSP、Servlet、XML、JMS、Java IDL、JTS、JTA、JavaMail、JAF

因为Tomcat支持Servlet/JSP规范,所以Tomcat也被称为Web容器、Servlet容器。JavaWeb程序需要依赖Tomcat才能运行。

Tomcat的官网: https://tomcat.apache.org/

1.2 基本使用

1.2.1 下载

直接从官方网站下载:https://tomcat.apache.org/download-90.cgi
【学习日记2023.4.28】之 Web服务器-Tomcat_Springboot方式下的请求与响应_第5张图片

Tomcat软件类型说明:

  • tar.gz文件,是linux和mac操作系统下的压缩版本
  • zip文件,是window操作系统下压缩版本(我们选择zip文件)

1.2.2 安装与卸载

安装: Tomcat是绿色版,直接解压即安装。【注意:Tomcat在解压缩的时候,解压所在的目录可以任意,但最好解压到一个不包含中文和空格的目录】
【学习日记2023.4.28】之 Web服务器-Tomcat_Springboot方式下的请求与响应_第6张图片

bin:目录下有两类文件,一种是以.bat结尾的,是Windows系统的可执行文件,一种是以.sh结尾的,是Linux系统的可执行文件。

webapps:就是以后项目部署的目录

**卸载:**卸载比较简单,可以直接删除目录即可

1.2.3 启动与关闭

启动Tomcat

  • 双击tomcat解压目录/bin/startup.bat文件即可启动tomcat

Tomcat启动的过程中,遇到控制台有中文乱码时,可以通常修改conf/logging.prooperties文件解决
请添加图片描述

关闭: 关闭有三种方式

1、强制关闭:直接x掉Tomcat窗口(不建议)

2、正常关闭:bin\shutdown.bat

3、正常关闭:在Tomcat启动窗口中按下 Ctrl+C

  • 说明:如果按下Ctrl+C没有反映,可以多按几次

1.2.4 常见问题

问题1:Tomcat启动时,窗口一闪而过

  • 检查JAVA_HOME环境变量是否正确配置

问题2:端口号冲突
请添加图片描述

  • 发生问题的原因:Tomcat使用的端口被占用了。

  • 解决方案:换Tomcat端口号

    • 要想修改Tomcat启动的端口号,需要修改 conf/server.xml文件
      【学习日记2023.4.28】之 Web服务器-Tomcat_Springboot方式下的请求与响应_第7张图片

注: HTTP协议默认端口号为80,如果将Tomcat端口号改为80,则将来访问Tomcat时,将不用输入端口号。

1.3 入门程序解析

1.3.1 Spring官方骨架

Spring官方骨架,可以理解为Spring官方为程序员提供一个搭建项目的模板。
【学习日记2023.4.28】之 Web服务器-Tomcat_Springboot方式下的请求与响应_第8张图片

访问:https://start.spring.io/ ,进入到官方骨架页面
【学习日记2023.4.28】之 Web服务器-Tomcat_Springboot方式下的请求与响应_第9张图片
【学习日记2023.4.28】之 Web服务器-Tomcat_Springboot方式下的请求与响应_第10张图片
【学习日记2023.4.28】之 Web服务器-Tomcat_Springboot方式下的请求与响应_第11张图片
【学习日记2023.4.28】之 Web服务器-Tomcat_Springboot方式下的请求与响应_第12张图片

Spring官方生成的SpringBoot项目解压缩后,就会得到一个SpringBoot项目工程。
【学习日记2023.4.28】之 Web服务器-Tomcat_Springboot方式下的请求与响应_第13张图片

打开pom.xml文件,可以看到springboot项目中引入了web依赖和test依赖
【学习日记2023.4.28】之 Web服务器-Tomcat_Springboot方式下的请求与响应_第14张图片

结论:不论使用IDEA创建SpringBoot项目,还是直接在官方网站利用骨架生成SpringBoot项目,项目的结构和pom.xml文件中内容是相似的。

1.3.2 起步依赖

spring-boot-starter-web和spring-boot-starter-test,在SpringBoot中又称为:起步依赖
【学习日记2023.4.28】之 Web服务器-Tomcat_Springboot方式下的请求与响应_第15张图片

在SpringBoot的项目中,有很多的起步依赖,他们有一个共同的特征:就是以spring-boot-starter-作为开头。spring-boot-starter-xxx这类的依赖,都为起步依赖。起步依赖特殊之处:

  • spring-boot-starter-web:包含了web应用开发所需要的常见依赖
  • spring-boot-starter-test:包含了单元测试所需要的常见依赖
    【学习日记2023.4.28】之 Web服务器-Tomcat_Springboot方式下的请求与响应_第16张图片

Spring的官方提供了很多现成的starter(起步依赖),在开发相关应用时,只需要引入对应的starter即可。

官方地址:https://docs.spring.io/spring-boot/docs/2.7.2/reference/htmlsingle/#using.build-systems.starters
【学习日记2023.4.28】之 Web服务器-Tomcat_Springboot方式下的请求与响应_第17张图片

每一个起步依赖,都用于开发一个特定的功能。例:当我们开发中需要使用redis数据库时,只需要在SpringBoot项目中,引入:spring-boot-starter-redis ,即可导入redis开发所需要的依赖。

1.3.3 SpringBoot父工程

因为每一个SpringBoot工程,都有一个父工程。依赖的版本号,在父工程中统一管理。所以通过maven引入的依赖,可以是没有指定具体的依赖版本号的。
【学习日记2023.4.28】之 Web服务器-Tomcat_Springboot方式下的请求与响应_第18张图片

1.3.3 内嵌Tomcat

SpringBoot中,引入了web运行环境(也就是引入spring-boot-starter-web起步依赖),其内部已经集成了内置的Tomcat服务器。可以通过IDEA开发工具右侧的maven面板中,就可以看到当前工程引入的依赖。其中已经将Tomcat的相关依赖传递下来了,也就是说在SpringBoot中可以直接使用Tomcat服务器。
【学习日记2023.4.28】之 Web服务器-Tomcat_Springboot方式下的请求与响应_第19张图片

运行SpringBoot的引导类时(运行main方法),就会看到命令行输出的日志,其中占用8080端口的就是Tomcat。
【学习日记2023.4.28】之 Web服务器-Tomcat_Springboot方式下的请求与响应_第20张图片

2. SpringBootWeb请求响应

测试开发的程序的方式:

方式1:在浏览器中输入地址,测试后端程序。

  • 弊端:在浏览器地址栏中输入地址这种方式都是GET请求,如何我们要用到POST请求怎么办呢?
    • 要解决POST请求,需要程序员自己编写前端代码(比较麻烦)

方式2:使用专业的接口测试工具Postman工具

2.1 Postman

2.1.1 介绍

Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件。

  • Postman原是Chrome浏览器的插件,可以模拟浏览器向后端服务器发起任何形式(如:get、post)的HTTP请求

  • 使用Postman还可以在发起请求时,携带一些请求参数、请求头等信息

  • 作用:常用于进行接口测试

  • 特征

    • 简单
    • 实用
    • 美观
    • 大方

2.1.2 安装

双击下载的Setup.exe即可自动安装,默认安装在 C:\Users\用户名\AppData\Local\Postman\ 下,也可以自己修改位置,将其剪切到你所要安装的位置即可。
【学习日记2023.4.28】之 Web服务器-Tomcat_Springboot方式下的请求与响应_第21张图片

界面介绍:
【学习日记2023.4.28】之 Web服务器-Tomcat_Springboot方式下的请求与响应_第22张图片

如果需要将测试的请求信息保存下来,就需要创建一个postman的账号,然后登录之后才可以。
【学习日记2023.4.28】之 Web服务器-Tomcat_Springboot方式下的请求与响应_第23张图片
【学习日记2023.4.28】之 Web服务器-Tomcat_Springboot方式下的请求与响应_第24张图片
请添加图片描述

登录完成之后,可以创建工作空间:
【学习日记2023.4.28】之 Web服务器-Tomcat_Springboot方式下的请求与响应_第25张图片
【学习日记2023.4.28】之 Web服务器-Tomcat_Springboot方式下的请求与响应_第26张图片
【学习日记2023.4.28】之 Web服务器-Tomcat_Springboot方式下的请求与响应_第27张图片

创建请求:
【学习日记2023.4.28】之 Web服务器-Tomcat_Springboot方式下的请求与响应_第28张图片

点击"Save",保存当前请求
【学习日记2023.4.28】之 Web服务器-Tomcat_Springboot方式下的请求与响应_第29张图片
【学习日记2023.4.28】之 Web服务器-Tomcat_Springboot方式下的请求与响应_第30张图片

2.2 各种类型参数的请求

2.2.1 简单参数

简单参数:在向服务器发起请求时,向服务器传递的是一些普通的请求数据。
【学习日记2023.4.28】之 Web服务器-Tomcat_Springboot方式下的请求与响应_第31张图片

后端程序中接收传递过来的普通参数数据的两种方式:

  1. 原始方式
  2. SpringBoot方式
2.2.1.1 原始方式

在原始的Web程序当中,需要通过Servlet中提供的API:HttpServletRequest(请求对象),获取请求的相关信息。

Tomcat接收到http请求时:把请求的相关信息封装到HttpServletRequest对象中

在Controller中,要想获取Request对象,可以直接在方法的形参中声明 HttpServletRequest 对象。然后就可以通过该对象来获取请求信息:

//根据指定的参数名获取请求参数的数据值
String  request.getParameter("参数名")
@RestController
public class RequestController {
    //原始方式
    @RequestMapping("/simpleParam")
    public String simpleParam(HttpServletRequest request){
        // http://localhost:8080/simpleParam?name=Tom&age=10
        // 请求参数: name=Tom&age=10   (有2个请求参数)
        // 第1个请求参数: name=Tom   参数名:name,参数值:Tom
        // 第2个请求参数: age=10     参数名:age , 参数值:10

        String name = request.getParameter("name");//name就是请求参数名
        String ageStr = request.getParameter("age");//age就是请求参数名

        int age = Integer.parseInt(ageStr);//需要手动进行类型转换
        System.out.println(name+"  :  "+age);
        return "OK";
    }
}

以上这种方式,仅做了解。(在以后的开发中不会使用到)

2.2.1.2 SpringBoot方式

在Springboot的环境中,对原始的API进行了封装,接收参数的形式更加简单。

简单参数,请求参数名与形参变量名相同,定义同名的形参即可接收参数。

@RestController
public class RequestController {
    // http://localhost:8080/simpleParam?name=Tom&age=10
    // 第1个请求参数: name=Tom   参数名:name,参数值:Tom
    // 第2个请求参数: age=10     参数名:age , 参数值:10
    
    //springboot方式
    @RequestMapping("/simpleParam")
    public String simpleParam(String name , Integer age ){//形参名和请求参数名保持一致
        System.out.println(name+"  :  "+age);
        return "OK";
    }
}

postman测试( GET 请求):
【学习日记2023.4.28】之 Web服务器-Tomcat_Springboot方式下的请求与响应_第32张图片

postman测试( POST请求 ):
【学习日记2023.4.28】之 Web服务器-Tomcat_Springboot方式下的请求与响应_第33张图片

结论:不论是GET请求还是POST请求,对于简单参数来讲,只要保证请求参数名和Controller方法中的形参名保持一致,就可以获取到请求参数中的数据值。

2.2.1.3 参数名不一致
@RestController
public class RequestController {
    // http://localhost:8080/simpleParam?name=Tom&age=20
    // 请求参数名:name

    //springboot方式
    @RequestMapping("/simpleParam")
    public String simpleParam(String username , Integer age ){//请求参数名和形参名不相同
        System.out.println(username+"  :  "+age);
        return "OK";
    }
}

方法形参名称与请求参数名称不一致,运行不会报错。 controller方法中的username值为:null,age值为20

结论:对于简单参数来讲,请求参数名和controller方法中的形参名不一致时,无法接收到请求数据

解决方案:可以使用Spring提供的@RequestParam注解完成映射

@RestController
public class RequestController {
    // http://localhost:8080/simpleParam?name=Tom&age=20
    // 请求参数名:name

    //springboot方式
    @RequestMapping("/simpleParam")
    public String simpleParam(@RequestParam("name") String username , Integer age ){
        System.out.println(username+"  :  "+age);
        return "OK";
    }
}

注意事项:

@RequestParam中的required属性默认为true(默认值也是true),代表该请求参数必须传递,如果不传递将报错
【学习日记2023.4.28】之 Web服务器-Tomcat_Springboot方式下的请求与响应_第34张图片

可以将required属性设置为false

@RequestMapping("/simpleParam")
public String simpleParam(@RequestParam(name = "name", required = false) String username, Integer age){
System.out.println(username+ ":" + age);
return "OK";
}

2.2.2 实体参数

使用简单参数做为数据传递方式时,前端传递了多少个请求参数,后端controller方法中的形参就要书写多少个。如果请求参数比较多,通过上述的方式一个参数一个参数的接收,会比较繁琐。

可以考虑将请求参数封装到一个实体类对象中。 要想完成数据封装,需要遵守如下规则:请求参数名与实体类的属性名相同
【学习日记2023.4.28】之 Web服务器-Tomcat_Springboot方式下的请求与响应_第35张图片

2.2.2.1 简单实体对象

定义POJO实体类:

public class User {
    private String name;
    private Integer age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

Controller方法:

@RestController
public class RequestController {
    //实体参数:简单实体对象
    @RequestMapping("/simplePojo")
    public String simplePojo(User user){
        System.out.println(user);
        return "OK";
    }
}

Postman测试:

  • 参数名和实体类属性名一致时
    【学习日记2023.4.28】之 Web服务器-Tomcat_Springboot方式下的请求与响应_第36张图片

  • 参数名和实体类属性名不一致时
    【学习日记2023.4.28】之 Web服务器-Tomcat_Springboot方式下的请求与响应_第37张图片

2.2.2.2 复杂实体对象

复杂实体对象指的是,在实体类中有一个或多个属性,也是实体对象类型的。

  • User类中有一个Address类型的属性(Address是一个实体类)
    【学习日记2023.4.28】之 Web服务器-Tomcat_Springboot方式下的请求与响应_第38张图片

复杂实体对象的封装,需要遵守如下规则:

  • 请求参数名与形参对象属性名相同,按照对象层次结构关系即可接收嵌套实体类属性参数。

定义POJO实体类:

  • Address实体类
public class Address {
    private String province;
    private String city;

    public String getProvince() {
        return province;
    }

    public void setProvince(String province) {
        this.province = province;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    @Override
    public String toString() {
        return "Address{" +
                "province='" + province + '\'' +
                ", city='" + city + '\'' +
                '}';
    }
}
  • User实体类
public class User {
    private String name;
    private Integer age;
    private Address address; //地址对象

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", address=" + address +
                '}';
    }
}

Controller方法:

@RestController
public class RequestController {
    //实体参数:复杂实体对象
    @RequestMapping("/complexPojo")
    public String complexPojo(User user){
        System.out.println(user);
        return "OK";
    }
}

Postman测试:
【学习日记2023.4.28】之 Web服务器-Tomcat_Springboot方式下的请求与响应_第39张图片

2.2.3 数组集合参数

数组集合参数的使用场景:在HTML的表单中,有一个表单项是支持多选的(复选框),可以提交选择的多个值。
【学习日记2023.4.28】之 Web服务器-Tomcat_Springboot方式下的请求与响应_第40张图片

后端程序接收上述多个值的方式有两种:

  1. 数组
  2. 集合
2.2.3.1 数组

数组参数:请求参数名与形参数组名称相同且请求参数为多个,定义数组类型形参即可接收参数
【学习日记2023.4.28】之 Web服务器-Tomcat_Springboot方式下的请求与响应_第41张图片

Controller方法:

@RestController
public class RequestController {
    //数组集合参数
    @RequestMapping("/arrayParam")
    public String arrayParam(String[] hobby){
        System.out.println(Arrays.toString(hobby));
        return "OK";
    }
}

Postman测试:

在前端请求时,有两种传递形式:

方式一: xxxxxxxxxx?hobby=game&hobby=java
【学习日记2023.4.28】之 Web服务器-Tomcat_Springboot方式下的请求与响应_第42张图片

方式二:xxxxxxxxxxxxx?hobby=game,java
【学习日记2023.4.28】之 Web服务器-Tomcat_Springboot方式下的请求与响应_第43张图片

2.2.3.2 集合

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

默认情况下,请求中参数名相同的多个值,是封装到数组。如果要封装到集合,要使用@RequestParam绑定参数关系
【学习日记2023.4.28】之 Web服务器-Tomcat_Springboot方式下的请求与响应_第44张图片

Controller方法:

@RestController
public class RequestController {
    //数组集合参数
    @RequestMapping("/listParam")
    public String listParam(@RequestParam List<String> hobby){
        System.out.println(hobby);
        return "OK";
    }
}

Postman测试:

方式一: xxxxxxxxxx?hobby=game&hobby=java
【学习日记2023.4.28】之 Web服务器-Tomcat_Springboot方式下的请求与响应_第45张图片

方式二:xxxxxxxxxxxxx?hobby=game,java
【学习日记2023.4.28】之 Web服务器-Tomcat_Springboot方式下的请求与响应_第46张图片

2.2.4 日期参数

对于日期类型的参数在进行封装的时候,需要通过@DateTimeFormat注解,以及其pattern属性来设置日期的格式。
【学习日记2023.4.28】之 Web服务器-Tomcat_Springboot方式下的请求与响应_第47张图片

  • @DateTimeFormat注解的pattern属性中指定了哪种日期格式,前端的日期参数就必须按照指定的格式传递。
  • 后端controller方法中,需要使用Date类型或LocalDateTime类型,来封装传递的参数。

Controller方法:

@RestController
public class RequestController {
    //日期时间参数
   @RequestMapping("/dateParam")
    public String dateParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime updateTime){
        System.out.println(updateTime);
        return "OK";
    }
}

2.2.5 JSON参数

JSON是开发中最常用的前后端数据交互方式,需关注以下两个方面:

  1. Postman在发送请求时,如何传递json格式的请求参数
  2. 在服务端的controller方法中,如何接收json格式的请求参数

Postman发送JSON格式数据:
【学习日记2023.4.28】之 Web服务器-Tomcat_Springboot方式下的请求与响应_第48张图片

服务端Controller方法接收JSON格式数据:

  • 传递json格式的参数,在Controller中会使用实体类进行封装。

  • 封装规则:JSON数据键名与形参对象属性名相同,定义POJO类型形参即可接收参数。需要使用 @RequestBody标识。
    【学习日记2023.4.28】之 Web服务器-Tomcat_Springboot方式下的请求与响应_第49张图片

  • @RequestBody注解:将JSON数据映射到形参的实体类对象中(JSON中的key和实体类中的属性名保持一致)

实体类:Address

public class Address {
    private String province;
    private String city;
    
	//省略GET , SET 方法
}

实体类:User

public class User {
    private String name;
    private Integer age;
    private Address address;
    
    //省略GET , SET 方法
}    

Controller方法:

@RestController
public class RequestController {
    //JSON参数
    @RequestMapping("/jsonParam")
    public String jsonParam(@RequestBody User user){
        System.out.println(user);
        return "OK";
    }
}

Postman测试:
【学习日记2023.4.28】之 Web服务器-Tomcat_Springboot方式下的请求与响应_第50张图片

2.2.6 路径参数

在现在的开发中,经常还会直接在请求的URL中传递参数。例如:

http://localhost:8080/user/1		
http://localhost:880/user/1/0

上述的这种传递请求参数的形式称为:路径参数。

路径参数:

  • 前端:通过请求URL直接传递参数
  • 后端:使用{…}来标识该路径参数,需要使用@PathVariable获取路径参数
    【学习日记2023.4.28】之 Web服务器-Tomcat_Springboot方式下的请求与响应_第51张图片

Controller方法:

@RestController
public class RequestController {
    //路径参数
    @RequestMapping("/path/{id}")
    public String pathParam(@PathVariable Integer id){
        System.out.println(id);
        return "OK";
    }
}

Postman测试:
【学习日记2023.4.28】之 Web服务器-Tomcat_Springboot方式下的请求与响应_第52张图片

传递多个路径参数:

Postman:
【学习日记2023.4.28】之 Web服务器-Tomcat_Springboot方式下的请求与响应_第53张图片

Controller方法:

@RestController
public class RequestController {
    //路径参数
    @RequestMapping("/path/{id}/{name}")
    public String pathParam2(@PathVariable Integer id, @PathVariable String name){
        System.out.println(id+ " : " +name);
        return "OK";
    }
}

2.2.7 小结

【学习日记2023.4.28】之 Web服务器-Tomcat_Springboot方式下的请求与响应_第54张图片

2.3 响应

2.3.1 @ResponseBody

controller方法中的return的结果使用@ResponseBody注解响应给浏览器
【学习日记2023.4.28】之 Web服务器-Tomcat_Springboot方式下的请求与响应_第55张图片

@ResponseBody注解:

  • 类型:方法注解、类注解
  • 位置:书写在Controller方法上或类上
  • 作用:将方法返回值直接响应给浏览器
    • 如果返回值类型是实体对象/集合,将会转换为JSON格式后在响应给浏览器
@RestController
public class HelloController {
    @RequestMapping("/hello")
    public String hello(){
        System.out.println("Hello World ~");
        return "Hello World ~";
    }
}

在类上添加的@RestController注解,是一个组合注解。

  • @RestController = @Controller + @ResponseBody

@RestController源码:

@Target({ElementType.TYPE})   //元注解(修饰注解的注解)
@Retention(RetentionPolicy.RUNTIME)  //元注解
@Documented    //元注解
@Controller   
@ResponseBody 
public @interface RestController {
    @AliasFor(
        annotation = Controller.class
    )
    String value() default "";
}

结论:在类上添加@RestController就相当于添加了@ResponseBody注解。

  • 类上有@RestController注解或@ResponseBody注解时:表示当前类下所有的方法返回值做为响应数据
    • 方法的返回值,如果是一个POJO对象或集合时,会先转换为JSON格式,在响应给浏览器

测试下响应数据:

@RestController
public class ResponseController {
    //响应字符串
    @RequestMapping("/hello")
    public String hello(){
        System.out.println("Hello World ~");
        return "Hello World ~";
    }
    //响应实体对象
    @RequestMapping("/getAddr")
    public Address getAddr(){
        Address addr = new Address();//创建实体类对象
        addr.setProvince("广东");
        addr.setCity("深圳");
        return addr;
    }
    //响应集合数据
    @RequestMapping("/listAddr")
    public List<Address> listAddr(){
        List<Address> list = new ArrayList<>();//集合对象
        
        Address addr = new Address();
        addr.setProvince("广东");
        addr.setCity("深圳");

        Address addr2 = new Address();
        addr2.setProvince("陕西");
        addr2.setCity("西安");

        list.add(addr);
        list.add(addr2);
        return list;
    }
}

在服务端响应了一个对象或者集合使用postman发送请求测试效果如下:
【学习日记2023.4.28】之 Web服务器-Tomcat_Springboot方式下的请求与响应_第56张图片
【学习日记2023.4.28】之 Web服务器-Tomcat_Springboot方式下的请求与响应_第57张图片

2.3.2 统一响应结果

编写的这些Controller方法中返回值各种各样,将造成整个项目难以维护。
【学习日记2023.4.28】之 Web服务器-Tomcat_Springboot方式下的请求与响应_第58张图片

必须定义一个统一的返回结果解决这个问题,方案如下:
【学习日记2023.4.28】之 Web服务器-Tomcat_Springboot方式下的请求与响应_第59张图片

前端:只需要按照统一格式的返回结果进行解析(仅一种解析方案),就可以拿到数据。

统一的返回结果使用类来描述,在这个结果中包含:

  • 响应状态码:当前请求是成功,还是失败

  • 状态码信息:给页面的提示信息

  • 返回的数据:给前端响应的数据(字符串、对象、集合)

定义在一个实体类Result来包含以上信息。代码如下:

public class Result {
    private Integer code;//响应码,1 代表成功; 0 代表失败
    private String msg;  //响应码 描述字符串
    private Object data; //返回的数据

    public Result() { }
    public Result(Integer code, String msg, Object data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }

    //增删改 成功响应(不需要给前端返回数据)
    public static Result success(){
        return new Result(1,"success",null);
    }
    //查询 成功响应(把查询结果做为返回数据响应给前端)
    public static Result success(Object data){
        return new Result(1,"success",data);
    }
    //失败响应
    public static Result error(String msg){
        return new Result(0,msg,null);
    }
}

改造Controller:

@RestController
public class ResponseController { 
    //响应统一格式的结果
    @RequestMapping("/hello")
    public Result hello(){
        System.out.println("Hello World ~");
        //return new Result(1,"success","Hello World ~");
        return Result.success("Hello World ~");
    }

    //响应统一格式的结果
    @RequestMapping("/getAddr")
    public Result getAddr(){
        Address addr = new Address();
        addr.setProvince("广东");
        addr.setCity("深圳");
        return Result.success(addr);
    }

    //响应统一格式的结果
    @RequestMapping("/listAddr")
    public Result listAddr(){
        List<Address> list = new ArrayList<>();

        Address addr = new Address();
        addr.setProvince("广东");
        addr.setCity("深圳");

        Address addr2 = new Address();
        addr2.setProvince("陕西");
        addr2.setCity("西安");

        list.add(addr);
        list.add(addr2);
        return Result.success(list);
    }
}

使用Postman测试:
【学习日记2023.4.28】之 Web服务器-Tomcat_Springboot方式下的请求与响应_第60张图片
【学习日记2023.4.28】之 Web服务器-Tomcat_Springboot方式下的请求与响应_第61张图片

2.3.3 案例

2.3.3.1 需求说明

需求:加载并解析xml文件中的数据,完成数据处理,并在页面展示
【学习日记2023.4.28】之 Web服务器-Tomcat_Springboot方式下的请求与响应_第62张图片

  • 获取员工数据,返回统一响应结果,在页面渲染展示
    【学习日记2023.4.28】之 Web服务器-Tomcat_Springboot方式下的请求与响应_第63张图片

Contriller代码:

@RestController
public class EmpController {
    @RequestMapping("/listEmp")
    public Result list(){
        //1. 加载并解析emp.xml
        String file = this.getClass().getClassLoader().getResource("emp.xml").getFile();
        //System.out.println(file);
        List<Emp> empList = XmlParserUtils.parse(file, Emp.class);

        //2. 对数据进行转换处理 - gender, job
        empList.stream().forEach(emp -> {
            //处理 gender 1: 男, 2: 女
            String gender = emp.getGender();
            if("1".equals(gender)){
                emp.setGender("男");
            }else if("2".equals(gender)){
                emp.setGender("女");
            }

            //处理job - 1: 讲师, 2: 班主任 , 3: 就业指导
            String job = emp.getJob();
            if("1".equals(job)){
                emp.setJob("讲师");
            }else if("2".equals(job)){
                emp.setJob("班主任");
            }else if("3".equals(job)){
                emp.setJob("就业指导");
            }
        });
        //3. 响应数据
        return Result.success(empList);
    }
}

统一返回结果实体类:

public class Result {
    private Integer code ;//1 成功 , 0 失败
    private String msg; //提示信息
    private Object data; //数据 date

    public Result() {
    }
    public Result(Integer code, String msg, Object data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }
    public Integer getCode() {
        return code;
    }
    public void setCode(Integer code) {
        this.code = code;
    }
    public String getMsg() {
        return msg;
    }
    public void setMsg(String msg) {
        this.msg = msg;
    }
    public Object getData() {
        return data;
    }
    public void setData(Object data) {
        this.data = data;
    }
    public static Result success(Object data){
        return new Result(1, "success", data);
    }
    public static Result success(){
        return new Result(1, "success", null);
    }
    public static Result error(String msg){
        return new Result(0, msg, null);
    }
}

使用Postman测试:
【学习日记2023.4.28】之 Web服务器-Tomcat_Springboot方式下的请求与响应_第64张图片

打开浏览器,在浏览器地址栏输入: http://localhost:8080/emp.html
【学习日记2023.4.28】之 Web服务器-Tomcat_Springboot方式下的请求与响应_第65张图片

3. 总结

【学习日记2023.4.28】之 Web服务器-Tomcat_Springboot方式下的请求与响应_第66张图片

你可能感兴趣的:(JavaWeb,服务器,tomcat,学习)