5 註冊-控制層 5.1 創建響應 狀態碼、狀態碼描述信息、數據。這部分功能封裝到一個類中,將這類作為方法返回值,返回給前端瀏覽器。 package com.cy.store.util; import java.io.Serializable; /** * Json格式的數據進行響應 */ publ ...
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 = 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);
}
}