首頁 > 軟體

Java SSM整合開發統一結果封裝詳解

2022-08-19 22:02:41

表現層與前端資料傳輸協定定義

SSM整合以及功能模組開發完成後,接下來,我們在上述案例的基礎上分析下有哪些問題需要我們去解決下。首先第一個問題是:

在Controller層增刪改返回給前端的是boolean型別資料

在Controller層查詢單個返回給前端的是物件

在Controller層查詢所有返回給前端的是集合物件

目前我們就已經有三種資料型別返回給前端,如果隨著業務的增長,我們需要返回的資料型別會越來越多。對於前端開發人員在解析資料的時候就比較凌亂了,所以對於前端來說,如果後臺能夠返回一個統一的資料結果,前端在解析的時候就可以按照一種方式進行解析。開發就會變得更加簡單。

所以我們就想能不能將返回結果的資料進行統一,具體如何來做,大體的思路為:

  • 為了封裝返回的結果資料:建立結果模型類,封裝資料到data屬性中
  • 為了封裝返回的資料是何種操作及是否操作成功:封裝操作結果到code屬性中
  • 操作失敗後為了封裝返回的錯誤資訊:封裝特殊訊息到message(msg)屬性中

根據分析,我們可以設定統一資料返回結果類

public class Result{
	private Object data;
	private Integer code;
	private String msg;
}

注意:Result類名及類中的欄位並不是固定的,可以根據需要自行增減提供若干個構造方法,方便操作。

表現層與前端資料傳輸協定實現

結果封裝

對於結果封裝,我們應該是在表現層進行處理,所以我們把結果類放在controller包下,當然你也可以放在domain包,這個都是可以的,具體如何實現結果封裝,具體的步驟為:

步驟1:建立Result類

public class Result {
    //描述統一格式中的資料
    private Object data;
    //描述統一格式中的編碼,用於區分操作,可以簡化設定0或1表示成功失敗
    private Integer code;
    //描述統一格式中的訊息,可選屬性
    private String msg;
    public Result() {
    }
    //構造方法是方便物件的建立
    public Result(Integer code,Object data) {
        this.data = data;
        this.code = code;
    }
    //構造方法是方便物件的建立
    public Result(Integer code, Object data, String msg) {
        this.data = data;
        this.code = code;
        this.msg = msg;
    }
    public Object getData() {
        return data;
    }
    public void setData(Object data) {
        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;
    }
    @Override
    public String toString() {
        return "Result{" +
                "data=" + data +
                ", code=" + code +
                ", msg='" + msg + ''' +
                '}';
    }
}

注意:

可以不寫toString方法,他最後會被被轉為json格式。 但是getter和setter方法是一定要有的!

步驟2:定義返回碼Code類

//狀態碼
public class Code {
    public static final Integer SAVE_OK = 20011;
    public static final Integer DELETE_OK = 20021;
    public static final Integer UPDATE_OK = 20031;
    public static final Integer GET_OK = 20041;
    public static final Integer SAVE_ERR = 20010;
    public static final Integer DELETE_ERR = 20020;
    public static final Integer UPDATE_ERR = 20030;
    public static final Integer GET_ERR = 20040;
}

注意:code類中的常數設計也不是固定的,可以根據需要自行增減,例如將查詢再進行細分為GET_OK,GET_ALL_OK,GET_PAGE_OK等。

步驟3:修改Controller類的返回值

//統一每一個控制器方法返回值
@RestController
@RequestMapping("/books")
public class BookController {
    @Autowired
    private BookService bookService;
    @PostMapping
    public Result save(@RequestBody Book book) {
        boolean flag = bookService.save(book);
        return new Result(flag ? Code.SAVE_OK:Code.SAVE_ERR,flag);
    }
    @PutMapping
    public Result update(@RequestBody Book book) {
        boolean flag = bookService.update(book);
        return new Result(flag ? Code.UPDATE_OK:Code.UPDATE_ERR,flag);
    }
    @DeleteMapping("/{id}")
    public Result delete(@PathVariable Integer id) {
        boolean flag = bookService.delete(id);
        return new Result(flag ? Code.DELETE_OK:Code.DELETE_ERR,flag);
    }
    @GetMapping("/{id}")
    public Result getById(@PathVariable Integer id) {
        Book book = bookService.getById(id);
        Integer code = book != null ? Code.GET_OK : Code.GET_ERR;
        String msg = book != null ? "" : "資料查詢失敗,請重試!";
        return new Result(code,book,msg);
    }
    @GetMapping
    public Result getAll() {
        List<Book> bookList = bookService.getAll();
        Integer code = bookList != null ? Code.GET_OK : Code.GET_ERR;
        String msg = bookList != null ? "" : "資料查詢失敗,請重試!";
        return new Result(code,bookList,msg);
    }
}

這裡拿bookList和null比較是因為,如果查詢全部沒有查到結果,那麼就會直接返回一個null,而不是返回一個空列表!

在根據id查book的時候,如果沒有查到也是返回一個null

最後我們的專案結構:

步驟4:啟動服務測試

至此,我們的返回結果就已經能以一種統一的格式返回給前端。前端根據返回的結果,先從中獲取code,根據code判斷,如果成功則取data屬性的值,如果失敗,則取msg中的值做提示。

到此這篇關於Java SSM整合開發統一結果封裝詳解的文章就介紹到這了,更多相關Java封裝內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com