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);
- }
- }
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |