Controller 层编码规范

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: Controller 层编码规范

1、控制器层

controller 层在 MVC 设计属于控制层设计初衷:设计初衷:请求并响应请求;所以该层轻似接受,涉及业务的。

之前,使用下分开的开发设计模式,推荐使用@RestController注解它@ResponseBody + @Controller的组合。

  1. 如果只是将Controller中的内容解开,@RestController则将Controller中的内容解析器的视图的解法,或者将配置方法重新设置为返回使用HTML格式的方法,或者返回解析器返回常用的方法InternalResourceViewResolver,返回js的内容。
  2. 如果需要返回到指定的页面,则需要用@Controller视图来指定解析器InternalResourceViewResolver才行。mediaType``@ResponseBody

如,使用@Controller注释解,在的方法上,查看解析器可以解析返回的jsp,html页面,跳转到相应页面;若返回json等内容到页面,则需要加@ResponseBody注解

1)设置请求路径

使用注解@PostMapping("/page"),类命名和方法除掉都可以加。

注意按照不同业务划分使用,避免乱写乱用。

2)设置请求方式

常用的POST/GET。使用注解:@RequestMapping  和  @GetMapping@PostMapping

4.3中的介绍@GetMapping、介绍@PostMapping、提高的方法、@PutMapping来帮助解决快速表达方式的HTTP和地@DeleteMapping``@PatchMapping

该注解HTTP Get方法将映射到特定的处理上

  • @GetMapping是一个注释解,它是一个组合@RequestMapping(method = RequestMethod.GET)的缩写
  • @PostMapping是一个注释解,它是一个组合@RequestMapping(method = RequestMethod.POST)的缩写

3)设置请求参数方式

①提交提交,直接使用vo类或具体参数名接收;

@Controller
public class LoginController {
    @RequestMapping(value = "login", method = RequestMethod.POST)
    public String login(UserVO user){
        System.out.println("POJO: " + user.getClass().getName() + 
                ", hash code: " + user.hashCode() + ", " + user.toString());
        return "redirect:/";
    }
}

②@RequestParam

@RequestParam(value="", required=true, defaultValue="")

@RequestParam有三个属性:

  • value: 请求参数名(必须配置)
  • required: 必须,默认为true 请求中必须包含该参数,如果包含没有,即抛出异常(可选配置)
  • defaultValue: 默认值,如果设置了该值,必填 将自动设为 false
@ApiOperation(value = "根据id查询") 
@PostMapping("/show")
public Responses show(@RequestParam(value="userId",defaultValue="-1") Long userId) {
    Record data = recordService.getOne(vo.getId());
    return Responses.success(data);
}

③n提交,使用注解@RequestBody

@RequestBody`主要接收接收端以POST方式传递给使用`@RequestBody`数据时(JSON字符串中的数据请求体中的数据的);GET方式无请求体,所以接收端不能使用GET方式提交数据,只是可以用同一个POST方式进行提交。可以在同一个接收方法中,`@RequestBody`最多可以有一个,并且有多个。`@RequestParam()``@RequestBody``@RequestParam()

注:一个请求,只有一个RequestBody请求,可以有多个RequestParam

@ApiOperation(value = "根据id查询") 
 @PostMapping("/get")
 public Responses getOne(@Validated @RequestBody IdVO vo){
     Record data = recordService.getOne(vo.getId());
     return Responses.success(data);
 }

④ath变量

@RestController
@RequestMapping("/")
public class ChineseDrugController {
 @ResponseBody
 @RequestMapping(value = "/{name}")
 public String showName(@PathVariable String name, @PathVariable(value = "name", required = false) String sex) {
  return "Hello " + name + sex;
 }

⑤@PathParam

url:http://127.0.0.1:8080/sexvalue/namevalue?name=唐&sex=男
@RestController
@RequestMapping(value = "/{sex}")
public class ChineseDrugController {
 @ResponseBody
 @RequestMapping(value = "/{name}")
 public String showName(@PathVariable(value = "name") String name, @PathParam(value = "sex") String sex) {
  return "Hello " + name + " " + sex;
 }
}

说明:示例代码的实用性更高,实际开发中使用了各种功能。

4)请求参数

参数参数

  • 使用注意解说@Validated,有特色的自动评测开始了,它是spring-contex中性的注释解说;
  • vo类中自定义标注,比如@NotNull下等,他是javaxvalidation-api中的注解这里不赘述;
  • 程序表示的验证。

示例方法如下

@ApiOperation(value = "应用类型和应用关系绑定")
@PostMapping("/applicationTypeBind")
public Boolean applicationTypeBind(@Validated @RequestBody ApplicationBindVO vo){
    applicationTypeService.applicationTypeBind(vo);
    return true;
}

VO 类示例

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.List;
import java.util.Set;
@Data
@ApiModel(value = "ApplicationBindVO",description = "关系绑定vo")
public class ApplicationBindVO {
    @NotNull
    @ApiModelProperty("应用类型id")
    private Long typeId;
    @ApiModelProperty("应用id集合")
    private List<Long> applicationIdList;
}

5)入参出参设计

到期业务而定,格式轻松统一;

响应前端(APP/PC)的参数,一般重新处理,按顺序排列,方便统一

Responses.success(data);
import com.fasterxml.jackson.annotation.JsonView;
import com.myfutech.common.util.enums.ResponseCode;
import com.myfutech.common.util.vo.BaseView;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@ApiModel(value = "Responses",description = "响应信息")
public class Responses<T> {
 @JsonView({BaseView.class})
    @ApiModelProperty("响应编码")
    private String code;
    @JsonView({BaseView.class})
    @ApiModelProperty("响应消息")
    private String msg;
    @JsonView({BaseView.class})
    @ApiModelProperty("响应体")
    private T result;
    public static <T> Responses<T> success() {
        return new Responses(ResponseCode.SUCCESS_CODE, "", (Object)null);
    }
    public static <T> Responses<T> success(T result) {
        return new Responses(ResponseCode.SUCCESS_CODE, "", result);
    }
    public static <T> Responses<T> success(String msg, T result) {
        return new Responses(ResponseCode.SUCCESS_CODE, msg, result);
    }
    public static <T> Responses<T> error(String msg) {
        return new Responses(ResponseCode.ERROR_CODE, msg, (Object)null);
    }
    public static <T> Responses<T> error(ResponseCode code) {
        return new Responses(code, code.getDefaultMsg(), (Object)null);
    }
    public static <T> Responses<T> error(ResponseCode code, String msg) {
        return new Responses(code, msg, (Object)null);
    }
    public Responses() {
    }
    private Responses(ResponseCode code, String msg, T result) {
        this.code = code.getCode();
        this.msg = msg;
        this.result = result;
    }
    public String getCode() {
        return this.code;
    }
    public boolean notSuccess() {
        return !ResponseCode.SUCCESS_CODE.getCode().equals(this.code);
    }
    public String getMsg() {
        return this.msg;
    }
    public T getResult() {
        return this.result;
    }
    public void setCode(String code) {
        this.code = code;
    }
    public void setMsg(String msg) {
        this.msg = msg;
    }
    public void setResult(T result) {
        this.result = result;
    }
}

6) 自动生成接口文档

使用SwaggerAPI,常用注解

//加载类名之上
@Api(tags = "日志相关接口", description="操作日志",
        consumes= MediaType.APPLICATION_JSON_UTF8_VALUE,
        produces=MediaType.APPLICATION_JSON_UTF8_VALUE)
//加在方法名之上
@ApiOperation(value = "查询分页列表")
//加载实体或VO类名之上
@Data
@ApiModel(value = "ApprovalRoleModifyVO",description = "审批角色修改信息")
public class ApprovalRoleModifyVO{

@Api: 作用在类上,标注该类具体实现内容。表示该类是swagger的资源。

参数:

  • 标签: 可以使用tags()允许您为操作设置多个标签的属性,而不是使用该属性。
  • description: 可描述描述该类的作用。

@ApiOperation: 用于方法,表示一个http请求的操作。

@ApiModel: 方法用于,更改字段数据,表示对模型属性的说明或操作

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

2、相对标准控制器类示例

package com.myfutech.employee.service.provider.ctrl;
import com.myfutech.common.util.Responses;
import com.myfutech.common.util.vo.IdVO;
import com.myfutech.common.util.vo.Page;
import com.myfutech.common.util.vo.Pageable;
import com.myfutech.employee.service.api.vo.response.record.RecordListVo;
import com.myfutech.employee.service.provider.model.Record;
import com.myfutech.employee.service.provider.service.RecordService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.MediaType;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
 *  相关接口
 */
@Api(tags = "日志相关接口", description="操作日志",
        consumes= MediaType.APPLICATION_JSON_UTF8_VALUE,
        produces=MediaType.APPLICATION_JSON_UTF8_VALUE)
@RestController
@RequestMapping("/record")
public class RecordCtrl {
    private static final Logger log = LoggerFactory.getLogger(RecordCtrl.class);
    @Resource(name="recordService") 
    private RecordService recordService;
    @ApiOperation(value = "查询分页列表")
    @PostMapping("/page")
    public Page<RecordListVo> page( @RequestBody Pageable pageable){
        Page<RecordListVo> list = recordService.findConditionPage(pageable);
        return list;
    }
    @ApiOperation(value = "根据id查询") 
    @PostMapping("/get")
    public Responses getOne(@Validated @RequestBody IdVO vo){
        Record data = recordService.getOne(vo.getId());
        return Responses.success(data);
    }
    @ApiOperation(value = "新增") 
    @PostMapping("/add")
    public Responses add(@Validated(Record.Create.class) @RequestBody Record data){
        recordService.save(data);
        return Responses.success();
    }
    @ApiOperation(value = "更新") 
    @PostMapping("/update")
    public Responses update(@Validated(Record.Update.class) @RequestBody Record data){
        recordService.save(data);
        return Responses.success();
    }
    @ApiOperation(value = "删除") 
    @PostMapping("/delete")
    public Responses delete(@Validated @RequestBody IdVO vo){
        recordService.deleteById(vo.getId());
        return Responses.success();
    }
}
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
6月前
|
存储 前端开发 Java
一篇文章带你搞懂Controller、Service等各层的功能与作用
本文将深入探讨这些controller.service等层的作用与功能,帮助读者更好地理解它们在软件开发中的重要性和运作原理。
2125 0
|
5月前
|
设计模式 存储 前端开发
MVC(Model-View-Controller)是一种软件设计模式,用于将应用程序的输入逻辑、业务逻辑和用户界面逻辑分离
【6月更文挑战第17天】**MVC模式**是软件设计模式,用于分离输入逻辑、业务逻辑和用户界面。模型处理数据和业务,视图展示数据,控制器协调两者响应用户请求。优点包括:关注点分离、提高开发效率、简化测试、支持多视图及便于大型项目管理。
51 3
|
3月前
|
设计模式 Java 测试技术
分层设计:Service 层真的需要实现接口吗?
【8月更文挑战第4天】在软件开发领域,分层设计是一种广泛应用且高效的设计模式,它通过将系统划分为不同的逻辑层(如表现层、服务层、数据访问层等),来提高代码的可维护性、可扩展性和可测试性。其中,Service层作为业务逻辑处理的核心,其设计尤为重要。那么,Service层是否真的需要实现接口呢?这个问题值得我们深入探讨。
152 8
接口模板,文本常用的接口Controller层,常用的controller层模板,Mybatisplus的相关配置
接口模板,文本常用的接口Controller层,常用的controller层模板,Mybatisplus的相关配置
|
消息中间件 JavaScript 小程序
Controller层代码这么写,简洁又优雅!
说到 Controller,相信大家都不陌生,它可以很方便地对外提供数据接口。它的定位,我认为是「不可或缺的配角」。 说它不可或缺是因为无论是传统的三层架构还是现在的 COLA 架构,Controller 层依旧有一席之地,说明他的必要性。 说它是配角是因为 Controller 层的代码一般是不负责具体的逻辑业务逻辑实现,但是它负责接收和响应请求。
|
缓存 Kubernetes 搜索推荐
k8s自定义controller三部曲之三:编写controller代码
本文是《k8s自定义controller三部曲》的终篇,编写controller的代码,通过监听API对象的增删改变化做出业务方面的响应
1176 0
k8s自定义controller三部曲之三:编写controller代码
|
Java Spring
Controller层代码就该这么写,简洁又优雅! 2
Controller层代码就该这么写,简洁又优雅! 2
|
消息中间件 JavaScript 小程序
Controller层代码就该这么写,简洁又优雅!
Controller层代码就该这么写,简洁又优雅!
|
Java 数据库连接 API
Controller 层代码就该这么写,简洁又优雅!(2)
Controller 层代码就该这么写,简洁又优雅!
|
Java Spring
Controller 层代码就该这么写,简洁又优雅!(1)
Controller 层代码就该这么写,简洁又优雅!
150 0