SpringMVC框架和SpringBoot项目中控制器的响应结果深入分析

 更新时间:2022年12月08日 14:09:48   作者:居然天上楼  
这篇文章主要介绍了SpringMVC框架和SpringBoot项目中控制器的响应结果,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧

1.控制器的响应结果

当控制器处理了请求之后,向客户端响应的结果中,应该至少包含:

  • 业务状态码:通常是数值类型的,客户端可以根据此数值来判断操作成功与否,或者,失败时是哪一种失败,具体值应该是由服务器端和客户端协商的
  • 消息:是字符串类型的,客户端可以将此消息直接显示在软件的界面中(例如显示在网页中、显示在手机APP中……),有了这个数据,客户端就不必自行组织语言来描述操作结果

由于响应结果只有1个,但是需要同时包含业务状态和消息,应该使用JSON格式来组织这样的结果,例如:

{

"state": 1,

"message": "添加相册成功!"

}

或者:

{

"state": 2,

"message": "添加相册失败,尝试添加的相册名称已经被使用!"

}

2.相关配置

在Spring MVC框架中,当需要响应JSON格式的字符串时,需要:

使用自定义的数据类型作为处理请求的方法的返回值类型,并返回自定义数据类型的对象

需要在项目中添加jackson-databind依赖项

  • spring-boot-starter-web中已经包含jackson-databind

需要开启注解驱动

  • 在基于XML配置的Spring MVC项目中,需要在XML配置中添加<annotation-driven/>标签
  • 在基于注解配置的Spring MVC项目中,需要在配置类上添加@EnableWebMvc注解
  • 在Spring Boot项目中,不需要额外配置

则在项目的根包下创建web.JsonResult类,在类中声明JSON结果中对应的属性:

package cn.tedu.csmall.product.web;
import lombok.Data;
@Data
public class JsonResult {
    private Integer state;
    private String message;
    public static JsonResult ok() {
        JsonResult jsonResult = new JsonResult();
        jsonResult.state = ServiceCode.OK;
        return jsonResult;
    }
}

然后,调整控制器中处理请求的方法的返回结果:

@ApiOperation("添加相册")
@PostMapping("/add-new")
public JsonResult addNew(AlbumAddNewDTO albumAddNewDTO) {
    albumService.addNew(albumAddNewDTO);
    return JsonResult.ok();
}
if (response.data.state == 1) {
    // 成功
} else if (response.data.state == 2) {
    // 失败:名称被占用
    alert(response.data.message);
}
    login(){
        axios.post("/login",v.user).then(function (response) {
            if (response.data==1){
                location.href="/admin.html" rel="external nofollow" ; //跳转到后台管理页面
            }else if(response.data==2){
                v.\$message.error("用户名不存在!");
            }else{
                v.\$message.error("密码错误!");
            }
        })
    }

3.使用枚举优化代码

JsonResult中设计了Integer state属性,用于表示“业务状态码”,由于此值是可以由客户端和服务器端协商的值,所以,值的大小不一定是固定的,例如“成功”,可以使用1表示,也可以使用200表示,只要协商一致即可,所以,在应用时,不应该直接将数值常量赋值到state属性上,否则,代码的可读性较差!

**反例:**jsonResult.state = 200;

应该将数值声明为常量来使用,以增加代码的可读性!

**正例:**jsonResult.state = ServiceCode.OK;

在设计方法时,如果使用Integer state作为参数,方法的调用者仍可能不使用声明的常量,而是直接传入某个未协商的直接常量值,例如,当设计了fail()方法时:

public static JsonResult fail(Integer state, String message) { 
    // ... 
}

则可能调用时传入错误的值:

JsonResult.fail(99999, e.getMessage());

由于state对应的值是相对有限的,是可以穷举的,则可以使用枚举来解决问题!

package cn.tedu.csmall.product.web;
public enum ServiceCode {
    OK(200),
    ERR_NOT_FOUND(404),
    ERR_CONFLICT(409);
    private Integer value;
    ServiceCode(Integer value) {
        this.value = value;
    }
    public Integer getValue() {
        return value;
    }
}

如果将方法的参数设计为以上枚举类型,则方法的调用者只能传入以上列举的3个值中的某1个!例如将方法调整为:

public static JsonResult fail(ServiceCode serviceCode, String message) { 
    // ... 
}

调用时则是:

JsonResult.fail(ServiceCode.ERR_CONFLICT, e.getMessage());

到此这篇关于SpringMVC框架和SpringBoot项目中控制器的响应结果深入分析的文章就介绍到这了,更多相关SpringMVC控制器响应内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • tomcat启动完成执行 某个方法 定时任务(Spring)操作

    tomcat启动完成执行 某个方法 定时任务(Spring)操作

    这篇文章主要介绍了tomcat启动完成执行 某个方法 定时任务(Spring)操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • Spring-Web与Spring-WebFlux冲突问题解决

    Spring-Web与Spring-WebFlux冲突问题解决

    Spring WebFlux是一套全新的Reactive Web技术栈,实现完全非阻塞,支持Reactive Streams背压等特性,这篇文章主要给大家介绍了关于Spring-Web与Spring-WebFlux冲突问题解决的相关资料,需要的朋友可以参考下
    2024-04-04
  • java swing框架实现贪吃蛇游戏

    java swing框架实现贪吃蛇游戏

    这篇文章主要为大家详细介绍了java swing框架实现贪吃蛇游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-12-12
  • 详解Java实践之抽象工厂模式

    详解Java实践之抽象工厂模式

    抽象工厂模式用于产品族的构建。抽象工厂是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂是指当有多个抽象角色时使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体情况下,创建多个产品族中的产品对象
    2021-06-06
  • mybatis plus in方法使用说明

    mybatis plus in方法使用说明

    这篇文章主要介绍了mybatis plus in方法使用说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • 浅析Java IO相关知识点

    浅析Java IO相关知识点

    本篇文章给大家分享了关于java io的一些相关知识点以及相关内容,对此有需要的朋友可以学习参考下。
    2018-05-05
  • java实战技巧之if-else代码优化技巧大全

    java实战技巧之if-else代码优化技巧大全

    代码中如果if-else比较多,阅读起来比较困难,维护起来也比较困难,很容易出bug,下面这篇文章主要给大家介绍了关于java实战技巧之if-else代码优化技巧的相关资料,需要的朋友可以参考下
    2022-02-02
  • java压缩多个文件并且返回流示例

    java压缩多个文件并且返回流示例

    这篇文章主要介绍了java压缩多个文件并且返回流示例,返回压缩流主是为了在程序里再做其它操作,需要的朋友可以参考下
    2014-03-03
  • Java设计模式UML之类图精解

    Java设计模式UML之类图精解

    在UML类图中,类使用包含类名、属性(field) 和方法(method) 且带有分割线的矩形来表示,比如下图表示一个Employee类,它包含name,age和email这3个属性,以及modifyInfo()方法
    2022-02-02
  • Spring实现数据库读写分离详解

    Spring实现数据库读写分离详解

    这篇文章主要介绍了Spring 实现数据库读写分离,大多数系统都是读多写少,为了降低数据库的压力,可以对主库创建多个从库,从库自动从主库同步数据,程序中将写的操作发送到主库,将读的操作发送到从库去执行,需要的朋友可以参考下
    2024-01-01

最新评论