5 注冊-控制層
5.1 創建回應
狀態碼、狀態碼描述資訊、資料,這部分功能封裝到一個類中,將這類作為方法回傳值,回傳給前端瀏覽器,
package com.cy.store.util;
import java.io.Serializable;
/**
* Json格式的資料進行回應
*/
public class JsonResult<E> implements Serializable {
//狀態碼
private Integer state;
//描述資訊
private String message;
//資料型別不確定,宣告稱泛型
private E data;
public JsonResult() {
}
public JsonResult(Integer state) {
this.state = state;
}
public JsonResult(Throwable e) {
this.message = e.getMessage();
}
public JsonResult(Integer state, E data) {
this.state = state;
this.data = https://www.cnblogs.com/shionlingfan/archive/2023/05/17/data;
}
public Integer getState() {
return state;
}
public void setState(Integer state) {
this.state = state;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public E getData() {
return data;
}
public void setData(E data) {
this.data = data;
}
}
5.2 設計請求
依據當前的業務功能模塊進行請求的設計,
請求路徑:/users/reg
請求引數:User user
請求型別:敏感型別用POST,沒有用GET
回應結果:JsonResult
5.3 處理請求
- 創建一個控制層對應的類UserController類,依賴于業務層的介面,
package com.cy.store.controller;
import com.cy.store.entity.User;
import com.cy.store.service.IUserService;
import com.cy.store.service.ex.InsertException;
import com.cy.store.service.ex.UsernameDuplicatedException;
import com.cy.store.util.JsonResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
// @Controller
@RestController //controller+ResponseBody
@RequestMapping("users")
public class UserController {
@Autowired
private IUserService userService;
@RequestMapping("reg")
// @ResponseBody //表示此方法的回應結果以json格式進行資料的相應給到前端,為了防止在所有方法上添加,在類上使用注解 @RestController
public JsonResult<Void> reg(User user){
// 創建回應結果物件
JsonResult<Void> result = new JsonResult<>();
try {
userService.reg(user);
result.setState(200);
result.setMessage("注冊成功");
} catch (UsernameDuplicatedException e) {
result.setState(400);
result.setMessage("用戶名被占用");
}catch (InsertException e){
result.setState(500);
result.setMessage("注冊時產生未知的例外");
}
return result;
}
}
- 啟動服務,在瀏覽器輸入訪問地址,可以看到成功輸出資訊

再次訪問該地址,報用戶名占用例外

去資料庫查看生成的用戶名資訊

5.4 控制層優化設計
在控制層抽離一個父類,在這個父類中統一的去處理關于例外的相關操作,撰寫一個BaseController類,統一處理例外,
package com.cy.store.controller;
import com.cy.store.service.ex.InsertException;
import com.cy.store.service.ex.ServiceException;
import com.cy.store.service.ex.UsernameDuplicatedException;
import com.cy.store.util.JsonResult;
import org.springframework.web.bind.annotation.ExceptionHandler;
/**
* 控制層類的基類
*/
public class BaseController {
/**
* 操作成功的狀態
*/
public static final int OK = 200;
//請求處理方法,這個方法的回傳值就是需要傳遞給前端的資料
//自動將例外物件傳遞給此方法的引數串列上
//當前專案中產生了例外,會被統一攔截到此方法中,這個方法此時就充當的是請求處理方法,方法的回傳值直接給到前端,
@ExceptionHandler(ServiceException.class) //用于統一處理拋出的例外
public JsonResult<Void> handleException(Throwable e){
JsonResult<Void> result = new JsonResult<>(e);
if (e instanceof UsernameDuplicatedException){
result.setState(4000);
result.setMessage("用戶名已經被占用");
} else if (e instanceof InsertException) {
result.setState(5000);
result.setMessage("注冊時產生未知的例外");
}
return result;
}
}
重新構建了reg()方法
// @Controller
@RestController //controller+ResponseBody
@RequestMapping("users")
public class UserController extends BaseController {
@Autowired
private IUserService userService;
@RequestMapping("reg")
// @ResponseBody //表示此方法的回應結果以json格式進行資料的相應給到前端,為了防止在所有方法上添加,在類上使用注解 @RestController
public JsonResult<Void> reg(User user){
userService.reg(user);
return new JsonResult<>(OK);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/552677.html
標籤:其他
上一篇:ThreadLocal 的原理講述 + 基于ThreadLocal實作MVC中的M層的事務控制
下一篇:返回列表
