Spring boot(三):Web 进阶
一、表单校验
1、 后端校验同样是通过注解的形式进行设置
在实体类中属性上添加注解
/**
* Created by Advancer on 2017/12/19 21:08.
* auth: lbh
*/
@Entity //注解的包 都是引用的 javax.persistence 下的
public class User {@Id@GeneratedValueprivate Integer id;private String name;@Min(value = 18, message = "禁止添加未成年人员!")private String age;@NotNull(message = "金额必传")private Double money;getter() setter() toString()}
2、在控制层中 可以进行校验
/*** 新增一条记录* @param user* @return*/@PostMapping(value = "/addUser")public Object addUser(@Valid User user, BindingResult bindingResult){if (bindingResult.hasErrors()){return ResultUtils.error(1, bindingResult.getFieldError().getDefaultMessage());}user.setAge(user.getAge());user.setMoney(user.getMoney());return ResultUtils.success(userRepository.save(user));}
@Valid 验证实体信息
BindingResult 错误校验信息类
返回类型 ResultUtils 工具类,在下面 异常处理中 讲解到
3、返回结果
二、AOP思想
OOP (面向对象) 面向对象是将不同的需求功能垂直划分为不同的并且相对独立的,它会封装成良好的类,并让它们有自己的行为。代表技术有 Java、C++、 C#…
AOP (面向切面)一种编程范式(编程思想),与程序语言无关,将面向对象构建的庞大体系进行水平的切割, 并将影响到的多个类的公共的行为,封装成一个公共的模块,这个模块就成为 切面;思想:将通用的逻辑从业务逻辑中进行分离。
POP (面向过程) 以事件、过程为中心的编程思想。 C语言
例子:以登入访问为例:要求用户必须先登录才能访问
1、首先在 pom.xml 中新增一个依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId><version>1.5.9.RELEASE</version>
</dependency>
2、创建一个处理文件
package com.lbh.aspect;import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;/**
* AOP 处理类
* Created by Advancer on 2018/1/14 16:26.
* auth: lbh
*/
@Aspect
@Component
public class HttpAspect {private final static Logger logger = LoggerFactory.getLogger(HttpAspect.class);@Pointcut("execution(public * com.lbh.Controller.UserController.*(..))") //拦截 UserController 类中 所有的方法public void log(){}@Before("log()")public void doBefore(){logger.info("doBefore()111");// ....一些逻辑操作}@After("log()")public void doAfter(){logger.info("doAfter()222");// ....一些逻辑操作}}
3、以getUsers 为例,运行结果
三、异常统一处理
1、首先将 json 返回格式进行统一处理一下
创建一个 result 返回提示实体类;
/**
* 错误消息提示类
* Created by Advancer on 2018/1/14 18:51.
* auth: lbh
*/
public class Result<T> {private Integer code; //错误码private String msg; //错误消息private T data; //具体内容getter() setter() toString()}
再写一个工具类:
public class ResultUtils {public static Result success(Object obj){Result result = new Result();result.setCode(0);result.setMsg("成功!");result.setData(obj);return result;}public static Result success(){return success(null);}public static Result error(Integer code, String msg){Result result = new Result();result.setCode(code);result.setMsg(msg);return result;}
}
2、在controller中使用
/**
* 新增一条记录
* @param user
* @return
*/
@PostMapping(value = "/addUser")
public Object addUser(@Valid User user, BindingResult bindingResult){if (bindingResult.hasErrors()){return ResultUtils.error(1, bindingResult.getFieldError().getDefaultMessage());}user.setAge(user.getAge());user.setMoney(user.getMoney());return ResultUtils.success(userRepository.save(user));
}
测试结果,可在表单验证节点看到。
3、再建立一个 异常捕获类
@ControllerAdvice
public class ExceptionHandle {private static final Logger logger = LoggerFactory.getLogger(ExceptionHandle.class);@ExceptionHandler(value = Exception.class)@ResponseBodypublic Result<User> handle(Exception e){if (e instanceof UserException){UserException userException = (UserException) e;return ResultUtils.error(userException.getCode(), userException.getMessage());}else {logger.info("【系统异常】{}", e);return ResultUtils.error(-1, "未知错误!");}}}
/**
* 异常处理类
* Created by Advancer on 2018/1/15 11:28.
* auth: lbh
*/
public class UserException extends RuntimeException {// 继承RuntimeException 有事务回滚,Exception 事务提交不会自动回滚private Integer code ;/*** Constructs a new runtime exception with the specified detail message.* The cause is not initialized, and may subsequently be initialized by a* call to {@link #initCause}.** @param message the detail message. The detail message is saved for* later retrieval by the {@link #getMessage()} method.* @param code*/public UserException(ResultEnum resultEnum) {super(resultEnum.getMsg());this.code = resultEnum.getCode();}public Integer getCode() {return code;}public void setCode(Integer code) {this.code = code;}
}
4、错误码、错误消息 统一管理
采用 枚举实现
/**
* Created by Advancer on 2018/1/15 13:49.
* auth: lbh
*/
public enum ResultEnum {UNKNOW_ERROR(-1, "未知错误!"),SUCCESS(0, "成功!"),PRIMARY_SCHOOL(100, "你可能还在上小学!"),MIDDLE_SCHOOL(101, "你可能在上初中!");private Integer code;private String msg;ResultEnum(Integer code, String msg) {this.code = code;this.msg = msg;}getter() //枚举不需要setter()方法
}
方法具体使用实现
public Integer getAge(Integer id) throws Exception{User user = userRepository.findOne(id);Integer age = Integer.parseInt(user.getAge());if (age < 10){//...throw new UserException(ResultEnum.PRIMARY_SCHOOL);}else if (age > 10 && age < 16){//...throw new UserException(ResultEnum.MIDDLE_SCHOOL);}// ..return 0;
}
Spring boot(三):Web 进阶相关推荐
- Gradle进阶:1: 结合spring boot进行web开发
在前面的文章中介绍了如何使用gradle的基础知识,这篇文章在某种程度上才是真正意义上的第一个hello world,这里使用一个简单的spring boot的例子,通过gradle进行编译和构建以及 ...
- Spring Boot学习笔记-进阶(3)
文章目录 Spring Boot学习笔记-进阶(3) 一.Spring Boot与缓存 二.Spring Boot与消息 三.Spring Boot与检索 四.Spring Boot与任务 异步任务 ...
- 精选Spring Boot三十五道必知必会知识点!
Spring Boot 是微服务中最好的 Java 框架. 我们建议你能够成为一名 Spring Boot 的专家.本文精选了三十五个常见的Spring Boot知识点,祝你一臂之力! 问题一 Spr ...
- Spring Boot Initilizr Web界面
Spring Boot Initilizr Web界面 在这篇文章中,我们将讨论Spring Boot Initilizr Web Interface及其IDE或IDE插件.在阅读帖子之前,请查看我之 ...
- Spring Boot(5) web开发(3)拦截器、文件上传、异常处理
Spring Boot(5) web开发(3)拦截器.文件上传.异常处理 学习视频: https://www.bilibili.com/video/BV19K4y1L7MT?p=49&spm_ ...
- 【spring boot】5.spring boot 创建web项目并使用jsp作前台页面
贼烦的是,使用spring boot 创建web项目,然后我再idea下创建的,but 仅仅启动spring boot的启动类,就算整个项目都是好着的,就算是能够进入controller中,也不能成功 ...
- Spring boot(web 组件,ORM 操作 MySQL,接口架构风格—RESTful,集成 Redis,集成 Dubbo,打包)
文章目录 1.3 第三章 Spring Boot 和 web 组件 1.3.1 SpringBoot 中拦截器 1.3.2 Spring Boot 中使用 Servlet 1.3.3 Spring B ...
- Spring Boot之Web开发
Web开发 简单了解 快速上手 JSON 的支持 RESTful 的支持 支持热部署 快速上手 拦截器与过滤器 自定义过滤器 示例 自定义拦截器 示例 打包部署 多环境配置 服务器配置 项目打包 简单 ...
- Spring Boot与web开发
Spring Boot与web开发 1. 2. 3. 4. 5. 6. 7. 8. 9. 0. 四.Web开发 1.简介 使用SpringBoot: 1).创建SpringBoot应用,选中我们需要的 ...
- 【spring boot】第3篇:spring boot 进行 web 开发
spring boot 对 web 静态资源的管理 经过前两篇文章我们知道spring boot最大的功能就是自动配置.主要是通过以下两个类实现该功能: xxxxAutoConfiguration : ...
最新文章
- AIの幕后人:探秘“硬核英雄”的超级武器
- C语言进行数据指定步长的区间统计
- SpringAPI手动创建代理对象——ProxyFactory
- awr报告分析 mysql_AWR报告的生成和简单分析方法
- BlueCat 批量网站查询工具,全网最快的查询工具!!
- Linux block
- micropython flask_在Python的Flask框架中实现单元测试的教程
- 报告PPT(163页):基于Python语言的课程群建设探讨与实践
- Inno Setup 检测已安装的.NET Framework 版本
- Docker Java程序镜像制作
- Tomcat的虚拟目录映射常用的几种方式
- logrotate 对某个日志的配置
- 基于Python的RRT算法实现
- pytorch 使用netron可视化
- wireshark找不到捕获接口问题和net start npf 服务器名无效、拒绝访问的解决办法
- 计算机图形学---常用颜色模型汇总(RGB,CMY,HSV)
- c++ 多边形求交集代码(凸多边形与凸多边形交集)
- 基于springboot的实验室预约管理系统(完美运行,数据库源代码,可远程调试)
- SSM智能家居产品销售管理毕业设计源码161618
- 21级pta《查找表》