概要
本實(shí)例適合所有的開發(fā),不僅僅是前后端分離項(xiàng)目,不分離項(xiàng)目使用的AJAX請(qǐng)求后臺(tái)也可以使用!
例如:
/**
初學(xué)者都喜歡使用@RequestMapping注解直接在Controller的方法中進(jìn)行映射
*/
@RequestMapping("/queryById")
public Demo queryById(Integer id) {
......
}
大多數(shù)接口都包含新增、刪除、修改、分頁(yè)查詢、部分也查詢、按ID查詢等6個(gè)接口,這樣如果業(yè)務(wù)復(fù)雜的請(qǐng)求,一個(gè)Controller里面有過(guò)多的@RequestMapping映射,那里面映射的單詞都不一樣,那樣開發(fā)出來(lái)的代碼一眼看就是很糟糕!!
使用Restful風(fēng)格只有在Controller類上有@RequestMapping
注解,其中的方法只對(duì)應(yīng)請(qǐng)求方式,比如分頁(yè)查詢的get請(qǐng)求直接使用 @GetMapping
在方法上即可!如果有過(guò)多的get請(qǐng)求比如通過(guò)id查詢則使用地址傳參的方式 @GetMapping("{id}")
然后在方法參數(shù)中加入@PathVariable("id") Integer id
即可使用參數(shù)id!
@GetMapping("{id}")
public Demo queryById(@PathVariable("id") Integer id) {
....
}
以上只是對(duì)請(qǐng)求方式以及請(qǐng)求參數(shù)的一種寫法,這里還有就是返回參數(shù)的問(wèn)題,在所有的接口請(qǐng)求中都會(huì)有著不同的返回,上面都是返回的一個(gè)Demo的實(shí)體對(duì)象,但是在業(yè)務(wù)操作中,比如再獲取列表的接口,那我們就需要返回的是一個(gè)集合,如果是修改的接口,那我們可能返回的是一個(gè)是否修改成功的標(biāo)識(shí),那樣一個(gè)Controller里面就很繁瑣了,如果遇到外鍵查詢可能不是一個(gè)實(shí)體的對(duì)象,則就需要單獨(dú)處理,所以我自己使用的就是一個(gè)封裝的一個(gè)返回對(duì)象JsonWrite
package com.ww.talk.util;
/**
* @author maker
* @desc 后臺(tái)返回前臺(tái)json格式
*/
public class JsonWrite {
public JsonWrite() {
}
/**
* 狀態(tài)碼
*/
private String code;
/**
* 是否成功
*/
private boolean success;
/**
* 提示消息
*/
private String msg;
/**
* 返回的數(shù)據(jù)
*/
private Object data;
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public boolean isSuccess() {
return success;
}
public void setSuccess(boolean success) {
this.success = success;
}
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 JsonWrite(String code, boolean success, String msg) {
this.code = code;
this.success = success;
this.msg = msg;
}
public JsonWrite(String code, boolean success, String msg, Object data) {
this.code = code;
this.success = success;
this.msg = msg;
this.data = data;
}
/**
* 自定義返回內(nèi)容
*
* @param code
* @param success
* @param msg
* @param data
* @return
*/
public static JsonWrite CUSTOMIZE(String code, boolean success, String msg, Object data) {
JsonWrite jsonWrite = new JsonWrite();
jsonWrite.setCode(code);
jsonWrite.setSuccess(success);
jsonWrite.setMsg(msg);
jsonWrite.setData(data);
return jsonWrite;
}
/**
* 自定義返回內(nèi)容
*
* @param code
* @param success
* @param msg
* @return
*/
public static JsonWrite CUSTOMIZE(String code, boolean success, String msg) {
JsonWrite jsonWrite = new JsonWrite();
jsonWrite.setCode(code);
jsonWrite.setSuccess(success);
jsonWrite.setMsg(msg);
return jsonWrite;
}
/**
* 操作成功,無(wú)數(shù)據(jù)傳遞
*
* @return
*/
public static JsonWrite SUCCESS() {
JsonWrite jsonWrite = new JsonWrite();
jsonWrite.setCode(StatusCode.SUCCESS.getCode());
jsonWrite.setSuccess(true);
jsonWrite.setMsg(StatusCode.SUCCESS.getMsg());
return jsonWrite;
}
/**
* 操作成功,傳遞數(shù)據(jù)
*
* @return
*/
public static JsonWrite SUCCESS(Object data) {
JsonWrite jsonWrite = new JsonWrite();
jsonWrite.setCode(StatusCode.SUCCESS.getCode());
jsonWrite.setSuccess(true);
jsonWrite.setMsg(StatusCode.SUCCESS.getMsg());
jsonWrite.setData(data);
return jsonWrite;
}
/**
* 操作失敗,無(wú)數(shù)據(jù)傳遞
*
* @return
*/
public static JsonWrite ERROR() {
JsonWrite jsonWrite = new JsonWrite();
jsonWrite.setCode(StatusCode.SUCCESS.getCode());
jsonWrite.setSuccess(false);
jsonWrite.setMsg(StatusCode.SUCCESS.getMsg());
return jsonWrite;
}
/**
* 操作失敗,傳遞數(shù)據(jù)
*
* @param data
* @return
*/
public static JsonWrite ERROR(Object data) {
JsonWrite jsonWrite = new JsonWrite();
jsonWrite.setCode(StatusCode.SUCCESS.getCode());
jsonWrite.setSuccess(false);
jsonWrite.setMsg(StatusCode.SUCCESS.getMsg());
jsonWrite.setData(data);
return jsonWrite;
}
/**
* 操作成功,自定義消息
*
* @param msg
* @return
*/
public static JsonWrite SUCCESS(String msg) {
JsonWrite jsonWrite = new JsonWrite();
jsonWrite.setCode(StatusCode.SUCCESS.getCode());
jsonWrite.setSuccess(true);
jsonWrite.setMsg(msg);
return jsonWrite;
}
/**
* 操作成功,傳遞數(shù)據(jù)及自定義消息
*
* @param msg
* @param data
* @return
*/
public static JsonWrite SUCCESS(String msg, Object data) {
JsonWrite jsonWrite = new JsonWrite();
jsonWrite.setCode(StatusCode.SUCCESS.getCode());
jsonWrite.setSuccess(true);
jsonWrite.setMsg(msg);
jsonWrite.setData(data);
return jsonWrite;
}
/**
* 操作失敗,自定義消息
*
* @param msg
* @return
*/
public static JsonWrite ERROR(String msg) {
JsonWrite jsonWrite = new JsonWrite();
jsonWrite.setCode(StatusCode.SUCCESS.getCode());
jsonWrite.setSuccess(false);
jsonWrite.setMsg(msg);
return jsonWrite;
}
/**
* 操作失敗,傳遞數(shù)據(jù)以及自定義消息
*
* @param msg
* @param data
* @return
*/
public static JsonWrite ERROR(String msg, Object data) {
JsonWrite jsonWrite = new JsonWrite();
jsonWrite.setCode(StatusCode.SUCCESS.getCode());
jsonWrite.setSuccess(false);
jsonWrite.setMsg(msg);
jsonWrite.setData(data);
return jsonWrite;
}
/**
* 系統(tǒng)錯(cuò)誤
*/
public static JsonWrite SYSTEMERROR(String msg, Object data){
JsonWrite jsonWrite = new JsonWrite();
jsonWrite.setCode(StatusCode.SERVERERROR.getCode());
jsonWrite.setSuccess(false);
jsonWrite.setMsg(msg);
jsonWrite.setData(data);
return jsonWrite;
}
}
可以看到我們的返回實(shí)體JsonWrite有很多的構(gòu)造方法,這樣可以滿足多種返回格式!比如之前上面的通過(guò)id請(qǐng)求的結(jié)果我們可以寫成:
/**
* 通過(guò)主鍵查詢單條數(shù)據(jù)
*
* @param id 主鍵
* @return 單條數(shù)據(jù)
*/
@GetMapping("{id}")
public JsonWrite queryById(@PathVariable("id") Integer id) {
return JsonWrite.SUCCESS(this.userService.queryById(id));
}
因?yàn)橥ㄟ^(guò)ID查詢一般不會(huì)出現(xiàn)查詢錯(cuò)誤的情況,所以直接就是使用的SUCCESS的方法返回!
介紹
提示:上面的定義的JsonWrite類中也有其他的輔助類:StatusCode(返回狀態(tài)碼枚舉)
public enum StatusCode {
/**
* 狀態(tài)碼
*/
SUCCESS("200", "OK"),
BADREQUIRED("400", "Bad Request"),
ACCESSERROR("401", "Access-Token Error"),
AUTHERROR("403", "沒(méi)有權(quán)限"),
NOTFOUND("404", "Not Found"),
SERVERERROR("500", "Internal Server Error"),
REPEAT("600", "Repeat request,Request Forbidden"),
BADGATEWAY("502", "Bad Gateway"),
SERVICEUNAVAILABLE("503", "Service Unavailable"),
ACCOUNT_ERROR("1000", "賬戶不存在或被禁用"),
API_NOT_EXISTS("1001", "請(qǐng)求的接口不存在"),
API_NOT_PER("1002", "沒(méi)有該接口的訪問(wèn)權(quán)限"),
PARAMS_ERROR("1004", "參數(shù)錯(cuò)誤或格式錯(cuò)誤"),
SIGN_ERROR("1005", "數(shù)據(jù)簽名錯(cuò)誤"),
API_DISABLE("1011", "查詢權(quán)限已被限制"),
UNKNOWN_IP("1099", "非法IP請(qǐng)求");
/**
* 狀態(tài)碼
*/
private String code;
/**
* 狀態(tài)描述
*/
private String msg;
public String getCode() {
return code;
}
public String getMsg() {
return msg;
}
StatusCode(String code, String msg) {
this.code = code;
this.msg = msg;
}
}
不同的返回狀態(tài)嗎對(duì)應(yīng)著不同的含義!這樣前端人員調(diào)用接口之后看到了返回狀態(tài)碼就知道對(duì)應(yīng)的是什么問(wèn)題,只有狀態(tài)碼為200的時(shí)候才是正常的返回正確結(jié)果!這也是一種對(duì)于前后端的規(guī)范!
案例
提示:這里我們編寫了一個(gè)案例,大家可以對(duì)照案例理解一下思路!
package com.ww.talk.controller;
import com.ww.talk.util.JsonWrite;
import com.ww.talk.util.TableGrid;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
/**
* (User)表控制層
*
* @author makejava
*/
@RestController
@RequestMapping("user")
public class UserController {
/**
* 服務(wù)對(duì)象
*/
@Resource
private UserService userService;
/**
* 分頁(yè)查詢
*
* @param tableGrid 篩選條件
* @return 查詢結(jié)果
*/
@GetMapping
public JsonWrite queryByPage(TableGrid tableGrid) {
return JsonWrite.SUCCESS(this.userService.queryByPage(tableGrid));
}
/**
* 通過(guò)主鍵查詢單條數(shù)據(jù)
*
* @param id 主鍵
* @return 單條數(shù)據(jù)
*/
@GetMapping("{id}")
public JsonWrite queryById(@PathVariable("id") Integer id) {
return JsonWrite.SUCCESS(this.userService.queryById(id));
}
/**
* 新增數(shù)據(jù)
*
* @param user 實(shí)體
* @return 新增結(jié)果
*/
@PostMapping
public JsonWrite add(@RequestBody User user) {
return this.userService.insert(user);
}
/**
* 編輯數(shù)據(jù)
*
* @param user 實(shí)體
* @return 編輯結(jié)果
*/
@PutMapping
public JsonWrite edit(@RequestBody User user) {
return this.userService.update(user);
}
/**
* 刪除數(shù)據(jù)
*
* @param id 主鍵
* @return 刪除是否成功
*/
@DeleteMapping("{id}")
public JsonWrite deleteById(@PathVariable("id") Integer id) {
return this.userService.deleteById(id);
}
}
分析:
上面我們創(chuàng)建了一個(gè)UserController類,使用@RequestMapping(“user”)注解,這樣前端使用user接口調(diào)用都是進(jìn)入此類中查詢對(duì)應(yīng)的接口;然后我們定義了五個(gè)基礎(chǔ)方法,分別是:分頁(yè)查詢、通過(guò)注解id查詢、新增、修改和刪除;下面我們分析這五個(gè)接口對(duì)應(yīng)的寫法
- 分頁(yè)查詢:
/**
* 分頁(yè)查詢
*
* @param tableGrid 篩選條件
* @return 查詢結(jié)果
*/
@GetMapping
public JsonWrite queryByPage(TableGrid tableGrid) {
return JsonWrite.SUCCESS(this.userService.queryByPage(tableGrid));
}
查詢都是Get請(qǐng)求,這個(gè)不用多說(shuō)!前端使用接口名稱
/user
,并使用的是Get請(qǐng)求,則會(huì)進(jìn)入方法中,方法參數(shù)是封裝的分頁(yè)實(shí)體,因?yàn)椴樵兞斜淼姆椒ㄒ彩遣豢赡苡袠I(yè)務(wù)判斷或者業(yè)務(wù)報(bào)錯(cuò)的,所以直接使用JsonWrite.SUCCESS
返回給前端,查詢的數(shù)據(jù)是通過(guò)userService.queryByPage
在userService的服務(wù)層處理,而JsonWrite.SUCCESS
參數(shù)就是我們封裝的JsonWrite返回到前端的data屬性,前端在實(shí)體中通過(guò).data獲取返回的查詢到的數(shù)據(jù)!
- 通過(guò)注解id查詢
/**
* 通過(guò)主鍵查詢單條數(shù)據(jù)
*
* @param id 主鍵
* @return 單條數(shù)據(jù)
*/
@GetMapping("{id}")
public JsonWrite queryById(@PathVariable("id") Integer id) {
return JsonWrite.SUCCESS(this.userService.queryById(id));
}
同樣是獲取數(shù)據(jù)的Get請(qǐng)求,前端使用接口名稱
/user/3
,這里的3是指要查詢的數(shù)據(jù)id,方法正確使用get請(qǐng)求之后進(jìn)入此方法中,通過(guò)@PathVariable("id")
注解后臺(tái)可以直接使用到參數(shù)id,由于通過(guò)id查詢的這個(gè)id肯定是數(shù)據(jù)庫(kù)存在的,所以這里同樣使用JsonWrite.SUCCESS
直接成功返回?cái)?shù)據(jù)!
- 新增
/**
* 新增數(shù)據(jù)
*
* @param user 實(shí)體
* @return 新增結(jié)果
*/
@PostMapping
public JsonWrite add(@RequestBody User user) {
return this.userService.insert(user);
}
新增為Post請(qǐng)求,咱們不多說(shuō)!前端使用
/user
接口以及Post請(qǐng)求方式將會(huì)進(jìn)入此方法中,前端傳入的是一個(gè)實(shí)體對(duì)象,所以我們使用@RequestBody
來(lái)注明我們接受的數(shù)據(jù)是一個(gè)User對(duì)象,因?yàn)樾略龅臅r(shí)候一般會(huì)有業(yè)務(wù)判斷,比如用戶名是否存在之類的,如果重復(fù)了存在了則是新增失敗,所以我們?cè)貱ontroller中返回的是一個(gè)userService.insert
服務(wù)層返回的結(jié)果,我們看下服務(wù)層代碼:
/**
* 新增數(shù)據(jù)
*
* @param user 實(shí)例對(duì)象
* @return 實(shí)例對(duì)象
*/
@Override
public JsonWrite insert(User user) {
int count = this.userDao.insert(user);
if(count >0){
return JsonWrite.SUCCESS("數(shù)據(jù)新增成功!");
}else{
return JsonWrite.ERROR("數(shù)據(jù)新增失敗,請(qǐng)檢查數(shù)據(jù)!");
}
}
這里在服務(wù)層的新增接口中可以看到,這里是做了一個(gè)簡(jiǎn)單的判斷,因?yàn)閷?duì)于mysql來(lái)說(shuō),執(zhí)行新增操作如果成功會(huì)返回執(zhí)行成功的條數(shù),也就是新增一條數(shù)據(jù)成功會(huì)返回一個(gè)Integer類型的1,如果失敗則為0,直接判斷count執(zhí)行數(shù)據(jù)庫(kù)的結(jié)果來(lái)返回?cái)?shù)據(jù),前端使用JsonWrite的success屬性是否為true來(lái)判斷是否成功!
- 修改
/**
* 編輯數(shù)據(jù)
*
* @param user 實(shí)體
* @return 編輯結(jié)果
*/
@PutMapping
public JsonWrite edit(@RequestBody User user) {
return this.userService.update(user);
}
修改為Put請(qǐng)求,前端直接使用
/user
并使用put請(qǐng)求方式即進(jìn)入當(dāng)前方法中,使用@RequestBody
注解接收需要被修改的User對(duì)象數(shù)據(jù),然后執(zhí)行userService.update
中的修改接口,因?yàn)樾薷牡臉I(yè)務(wù)基本上都需要有判斷所以這里直接就是返回的服務(wù)層接口,判斷是否通過(guò)以及返回前臺(tái)的數(shù)據(jù)由服務(wù)層處理!
- 刪除
/**
* 刪除數(shù)據(jù)
*
* @param id 主鍵
* @return 刪除是否成功
*/
@DeleteMapping("{id}")
public JsonWrite deleteById(@PathVariable("id") Integer id) {
return this.userService.deleteById(id);
}
刪除請(qǐng)求方式為delete,這里只是簡(jiǎn)單的通過(guò)id刪除數(shù)據(jù),從前臺(tái)傳入一個(gè)id即可,傳入的方式與通過(guò)id獲取是一樣的,
/user/3
這里的3是指需要被刪除的對(duì)象的id,因?yàn)閯h除也是有很多的業(yè)務(wù)判斷,所以返回的數(shù)據(jù)結(jié)果有service的服務(wù)層處理。
小結(jié)
提示:細(xì)心的同學(xué)可能已經(jīng)發(fā)現(xiàn)了,能夠直接出結(jié)果的都是查詢接口,不能出結(jié)果的都是操作的數(shù)據(jù),針對(duì)數(shù)據(jù)庫(kù)來(lái)說(shuō)就是‘查詢數(shù)據(jù)’和‘操作數(shù)據(jù)’,凡是查詢數(shù)據(jù)的都不應(yīng)該會(huì)有問(wèn)題,所以直接的success,而操作數(shù)據(jù)的都有可能伴隨著業(yè)務(wù)的判斷是失敗所以是在業(yè)務(wù)層中區(qū)處理返回對(duì)象
-
接口
+關(guān)注
關(guān)注
33文章
8691瀏覽量
151712 -
數(shù)據(jù)
+關(guān)注
關(guān)注
8文章
7134瀏覽量
89403 -
封裝
+關(guān)注
關(guān)注
127文章
7990瀏覽量
143277 -
Restful
+關(guān)注
關(guān)注
0文章
11瀏覽量
3552
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論