- 一、配置文件
- 1. properties文件
- 2. yaml文件
- 2.1 简介
- 2.2 基本语法
- 2.3 数据类型
- 二、Web开发
- 1. 简单功能
- 1.1 静态资源访问
- 1.2 欢迎页和Favicon
- 1.3 静态资源配置原理
- 2. 请求参数处理
- 2.1 常用注解
- 3. 响应数据
- 3.1 响应JSON
- 4. 拦截器
- 6. 文件上传
- 7. 异常处理
- 三、数据访问
- 1. SQL
- 1.1 配置数据源
- 2. NoSQL
- 四、单元测试
- 五、其他特性
- 1. 环境切换
properties文件的用法比较熟悉,这里就不过多介绍
2. yaml文件 2.1 简介- YAML是“YAML Ain`t Markup Language”(是一种标记语言)的递归缩写。
- 适合用来做以数据为中心的配置文件
- key: value;k v之间有一个空格
- 大小写敏感
- 使用缩进进行层级关系
- 缩进的空格数不重要,只要相同层级的元素左对齐即可
- # 表示注释
-
字面量:当个、不可分的值。date、Boolean、String、number、null
K: v
-
对象:键值对的集合。map、hash、set、Object
# 行内写法 k: {k1:v1,k2:v2,k3:v3} k: k1: v1 k2: v2 k3: v3
-
数组:一组按次序排列的值。array、list、queue
# 行内写法 k: [v1,v2,v3] k: - v1 - v2 - v3
-
类路径下:called:/static(or /publicor /resourcesor /meta-INF/resources)
-
静态资源放到以上目录下,可以通过根目录加静态资源名的方式直接访问
-
静态资源会映射 public class LoginInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { HttpSession session = request.getSession(); Object loginUser = session.getAttribute("loginUser"); //返回true表示放行 if (!Objects.isNull(loginUser)) { return true; } request.setAttribute("msg", "请先登录"); request.getRequestDispatcher("/").forward(request, response); return false; } @Override //目标方法执行之后 public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception { } @Override //页面渲染之后 public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception { } } //配置拦截器 @Configuration public class AdminWebConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new LoginInterceptor()) //拦截的路径 .addPathPatterns(" @PostMapping(value = "/upload") public Map
upload(@RequestParam("email") String email, @RequestParam("username") String username, @RequestParam("image") MultipartFile image, @RequestParam("photos") MultipartFile[] photos) throws IOException { log.info("上传的数据:email={},username={},image={},photos={}", email, username, image.getSize(), photos.length); if (!image.isEmpty()) { String originalFilename = image.getOriginalFilename(); image.transferTo(new File("F:\test\" + originalFilename)); } if (photos.length > 0) { for (MultipartFile photo : photos) { if (!photo.isEmpty()) { String originalFilename = photo.getOriginalFilename(); photo.transferTo(new File("F:\test\" + originalFilename)); } } } HashMap res = new HashMap<>(); res.put("msg", "ok"); res.put("code", "200"); return res; } } -
配置文件
spring: servlet: multipart: # 文件上传的大小 max-file-size: 10MB # 整体文件上传的大小 max-request-size: 100MB
-
定义基础接口
public interface baseErrorInfoInterface { String getResultCode(); String getMsg(); }
-
定义异常枚举类
public enum ExceptionEnum implements baseErrorInfoInterface { SUCCESS("200", "成功"), NOT_FOUND("404", "未找资源"), SERVER_ERROR("500", "服务器内部异常"); private final String code; private final String msg; ExceptionEnum(String code, String msg) { this.code = code; this.msg = msg; } @Override public String getResultCode() { return code; } @Override public String getMsg() { return msg; } }
-
自定义异常
@Data public class MyDefinedException extends RuntimeException { private static final long serialVersionUID = 2L; protected String errorCode; protected String errorMsg; public MyDefinedException() { super(); } public MyDefinedException(baseErrorInfoInterface baseErrorInfoInterface) { super(baseErrorInfoInterface.getResultCode()); this.errorCode = baseErrorInfoInterface.getResultCode(); this.errorMsg = baseErrorInfoInterface.getMsg(); } public MyDefinedException(baseErrorInfoInterface errorInfoInterface, Throwable cause) { super(errorInfoInterface.getResultCode(), cause); this.errorCode = errorInfoInterface.getResultCode(); this.errorMsg = errorInfoInterface.getMsg(); } public MyDefinedException(String errorMsg) { super(errorMsg); this.errorMsg = errorMsg; } public MyDefinedException(String errorCode, String errorMsg) { super(errorCode); this.errorCode = errorCode; this.errorMsg = errorMsg; } public MyDefinedException(String errorCode, String errorMsg, Throwable cause) { super(errorCode, cause); this.errorCode = errorCode; this.errorMsg = errorMsg; } @Override public Throwable fillInStackTrace() { return this; } }
-
自定义数据传输类
@Getter @Setter public class ResultResponse { private String code; private String msg; private Object result; public ResultResponse() { } public ResultResponse(baseErrorInfoInterface errorInfoInterface) { this.code = errorInfoInterface.getResultCode(); this.msg = errorInfoInterface.getMsg(); } public static ResultResponse success() { return success(null); } public static ResultResponse success(Object data) { ResultResponse res = new ResultResponse(); res.setCode(ExceptionEnum.SUCCESS.getResultCode()); res.setMsg(ExceptionEnum.SUCCESS.getMsg()); res.setResult(data); return res; } public static ResultResponse error(baseErrorInfoInterface errorInfo) { ResultResponse res = new ResultResponse(); res.setMsg(errorInfo.getMsg()); res.setCode(errorInfo.getResultCode()); res.setResult(null); return res; } public static ResultResponse error(String code, String msg) { ResultResponse res = new ResultResponse(); res.setCode(code); res.setMsg(msg); res.setResult(null); return res; } @Override public String toString() { return JSON.toJSONString(this); } }
-
全局异常处理
@ControllerAdvice @Slf4j public class GlobalExceptionHandler { @ExceptionHandler(value = MyDefinedException.class) @ResponseBody public ResultResponse myDefinedExceptionHandler(HttpServletRequest request, MyDefinedException e) { log.error("业务异常:{}", e.getErrorMsg()); return ResultResponse.error(e.getErrorCode(), e.getErrorMsg()); } @ExceptionHandler(value = NullPointerException.class) @ResponseBody public ResultResponse exceptionHandler(HttpServletRequest req, NullPointerException e) { log.error("空指针异常:{}", e.getMessage()); return ResultResponse.error("501", "空指针异常"); } @ExceptionHandler(value = Exception.class) @ResponseBody public ResultResponse exceptionHandler(HttpServletRequest req, Exception e) { log.error("服务器内部异常:{}", e.getMessage()); return ResultResponse.error(ExceptionEnum.SERVER_ERROR); } }
-
导入jdbc场景
org.springframework.boot spring-boot-starter-data-jdbc -
导入数据库驱动
mysql mysql-connector-java8.0.26 -
修改配置项
datasource: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/db_test username: root password: xxxxxx
-
引入依赖
org.springframework.boot spring-boot-starter-data-redis -
配置
spring: redis: host: xxx port: 6379 password: xxxxx client-type: jedis
-
引入依赖
org.springframework.boot spring-boot-starter-testtest -
常用注解
- @Test:表示方法是测试方法。与JUnit 4的@Test注释不同,这个注释不声明任何属性,因为JUnit Jupiter中的测试扩展基于它们自己的专用注释进行 *** 作。
- @ParameterizedTest:表示方法是参数化测试。
- @RepeatedTest:表示方法是重复测试的测试模板
- @TestFactory:表示方法是动态测试的测试工厂。
- @TestInstance:用于为带注释的测试类配置测试实例生命周期。
- @TestTemplate:表示方法是为测试用例设计的模板,根据注册提供程序返回的调用上下文的数量进行多次调用。
- @DisplayName:声明测试类或测试方法的自定义显示名称。
- @BeforeEach:表示在当前类中每个@Test、@RepeatedTest、@ParameterizedTest或@TestFactory方法之前执行注释的方法;类似于JUnit 4的@Before。
- @AfterEach:表示在当前类中的每个@Test、@RepeatedTest、@ParameterizedTest或@TestFactory方法之后,都应该执行带注释的方法;类似于JUnit 4的@After。
- @BeforeAll:表示应在当前类中的所有@Test、@RepeatedTest、@ParameterizedTest和@TestFactory方法之前执行带注释的方法;类似于JUnit 4的@BeforeClass。
- @AfterAll:表示在当前类中,所有@Test、@RepeatedTest、@ParameterizedTest和@TestFactory方法都应该执行注释的方法;类似于JUnit 4的@AfterClass。
- @Nested:表示带注释的类是一个嵌套的、非静态的测试类。@BeforeAll和@AfterAll方法不能直接在 @Nested 测试类中使用,除非使用“每个类”测试实例生命周期。
- @Tag:用于在类或方法级别声明过滤测试的标记;类似于TestNG中的测试组或JUnit 4中的类别。
- @Disabled:用于禁用测试类或测试方法;类似于JUnit 4的@Ignore。
- @ExtendWith:用于注册自定义扩展。
-
application-profile功能
- 默认配置文件:application.yaml;任何时候都会加载
- 指定环境配置文件 application-{env}.yaml
- 激活指定环境
- 配置文件激活
- 命令行激活
- 默认配置和环境配置同时生效
- 同名配置项,profile配置优先
-
配置
- application.yaml文件
spring: profiles: # 指定激活的环境 active: prod
- application-prod.yaml文件
# 配置端口号 server: port: 8080
-
通过命令行切换环境
java -jar [项目名称] --spring.profiles.active=[环境]
欢迎分享,转载请注明来源:内存溢出
-
评论列表(0条)