spring boot 笔记
1.配置文件
1.application.properties
2.application.yml
作用:修改spring boot的默认设置
YAML:比XML和JSON更适合做配置文件,以数据为中心
2.YAML
使用yaml语法可以将yml配置文件的属性绑定在JavaBean中,JavaBean中必须用两个注解
@Component//将JavaBean添加到容器中才能使用这个功能
@ConfigurationProperties(prefix = "person")//将yml配置文件中的person部分与JavaBean绑定
person:
name: zhangsan
age: 19
boss: false
birthday: 2021/11/11
maps: {k1: v1,k2: 12}
lists: [lisi,wangwu]
dog:
name: 小黑
age: 2
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cZooSoAi-1623409489785)(C:\Users\86130\AppData\Roaming\Typora\typora-user-images\image-20210323212940086.png)]
@PropertySource(value = {"classpath:person.properties"})
@PropertySource注解可以指定加载的配置文件,而不仅仅只从全局配置文件中加载
指定开发环境配置
在我们的开发过程中可能会有很多模式:开发模式、生产模式、测试模式
我们不同的模式可能会有不同的端口,我们可以指定不同模式使用不同的端口
一、properties文件的方式的话就是创建多个application-xxx.properties文件,不同文件有不同的端口,但是默认会使用application.properties文件的端口,如果要指定端口的话我们可以使用spring.profiles.active=xxx来指定模式
二、也可以用yml的文档语言
server:
port: 8080
spring:
profiles:
active: prod
---
server:
port: 8081
spring:
profiles: dev
---
server:
port: 8083
spring:
profiles: prod
加载组件
我们可以为组件创建一个配置类
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vhPLbhhk-1623409489787)(C:\Users\86130\AppData\Roaming\Typora\typora-user-images\image-20210325211442692.png)]
在这个配置类中用到@Configration 注解
在方法中用@Bean注解可以返回一个容器
@Configuration//注明这是一个配置器类
public class MyConfig {
//将方法的返回值添加到容器中
@Bean
public HelloServer helloServer()
{
return new HelloServer();
}
}
指定访问路径
如果我们希望请求的路径可以自己指定而不是我们的项目名可以在主配置文件中使用
server.servlet.context-path=""
配置文件的加载位置
spring.config.location=""指定配置文件位置
不同等级的配置文件会一起起作用,起一个互补功能,高优先级的配置文件只能是覆盖一部分配置,剩下没有被覆盖的配置文件依然起作用
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Of6CifgM-1623409489801)(C:\Users\86130\AppData\Roaming\Typora\typora-user-images\image-20210325212549749.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d8fVzo6j-1623409489802)(C:\Users\86130\AppData\Roaming\Typora\typora-user-images\image-20210328100045732.png)]
spring-boot自动配置原理
精髓:
1.spring-boot启动会加载大量的自动配置类
2.我们看我们需要的功能有没有spring-boot默认写好的自动配置类
3.我们再来看这个自动配置类中到底配置了哪些组件(只要我们要用的组件有,我们就不需要再来配置了)
4.给容器中自动配置类添加组件的时候,会从properties类中获取某些属性,我们就可以在配置文件中指定这些属性的值
总的思路是
首先我们先看一下xxxAutoConfiguration
然后进入xxxAutoConfiguration中看一下xxxproperties文件,打开properties文件,看它都有什么属性,我们可以根据自己的需要进行更改
自动配置报告
在application.properties 中使用debug=true
可以在控制台上打印了使用了什么自动配置类
日志框架
日志框架的接口选用:SLF4J
实现选用:logback
我们在使用日志框架的时候要先把其他的日志都替换成为slf4j框架,都在starter依赖中,spring boot已经为我们考虑到了
如果我们要引入其他的框架我们要把这个框架的默认日志依赖移除掉====
spring boot开发web
我们可以从webjars官网找到我们需要的前端框架,然后把依赖注入到pom.xml中,然后我们在访问的时候只需要写webjars下面资源的名字即可
静态资源文件夹
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VpvCO5At-1623409489802)(C:\Users\86130\AppData\Roaming\Typora\typora-user-images\image-20210328202722823.png)]
首页放在静态资源下
需要渲染的页面放在thymeleaf文件夹下
thymeleaf是一个渲染模板,可以渲染页面,比jsp更高级
thymeleaf语法
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>操作成功!</h1>
<!--th:text将div里面的文本内容设置为我们自己设置的内容 -->
<div th:text="${name}"></div>
</body>
</html>
可以使用thymeleaf的th属性来替换div中的默认的值,
<div id="div01" class="mydiv" th:id="${name}" th:class="${name}" th:text="${name}"></div>
//使用th来替换div中的id和class
thymeleaf语法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4peq8ANo-1623409489803)(C:\Users\86130\AppData\Roaming\Typora\typora-user-images\image-20210329145228308.png)]
thymeleaf表达式:
Simple expressions: Variable Expressions: ${...} Selection Variable Expressions: *{...}Message Expressions: #{...}Link URL Expressions: @{...} Fragment Expressions: ~{...}
在thymeleaf中可以遍历,使用th:each 遍历,例子
<h4 th:text="${user}" th:each="user:${users}"> </h4>这个代码的意思是,通过遍历将users中的属性保存到自定义的user变量中,如果要输出用th:text,此时输出的元素就是user(我们自定义的元素)
<h4> <span th:each="user:${users}">[[${user}]]</span></h4>//如果想要在一行中直接输出而不用th:text那么可以用 [[...]] or [(...)]
扩展springmvc 的方法,创建一个configuration类,是WebMvcConfigurerAdapter类型,不能有@EnableWebMvc注解
@Configuration//用configuration注解标注public class MyMvcConfig extends WebMvcConfigurerAdapter { //重写里面的方法 实现页面跳转机制 @Override public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController("/zd").setViewName("success"); }}
spring boot中有很多xxxconfigurer 帮助我们进行扩展配置
springboot国际化操作
通过我们的thymeleaf模板语言来进行国际化操作
首先我们需要在主配置类application.properties中,添加spring.messages.basename=包+基础名
可以使用thymeleaf的语法th:text="#{}"取出messages
通过点击链接来切换,实际上是通过请求头来控制
自己配置一个区域化解析器,然后我们还需要将他们放在自己的配置类中
public class MyLocaleResolver implements LocaleResolver { @Override public Locale resolveLocale(HttpServletRequest request) { String l = request.getParameter("l"); Locale locale=Locale.getDefault(); if(!StringUtils.isEmpty(l)) { String[] s = l.split("_"); locale=new Locale(s[0],s[1]); } return locale; }
登录的时候要配置一个拦截器,在配置拦截器之前,首先在登录控制器中参数中添加一个Httpsession对象,让它来保存一个用户名,让拦截器获取,如果获取到了就登录,获取不到就返回登陆界面重新登录,然后还要把自己写的拦截器组件在自己的配置类中注册
//登录处理器@Controllerpublic class LoginController { @PostMapping("/user/login") public String login(@RequestParam("username") String username, @RequestParam("password") String password, Map<String ,Object> map, HttpSession session) { if(!StringUtils.isEmpty("username") &&"123456".equals("password")) { session.setAttribute("LoginUser","username"); return "redirect:/main.html"; } else { map.put("msg","用户名密码错误");//这个map是向登录页面传递数据,登陆页面来获取map的数据 return "login"; } }}
//登录拦截器public class LoginInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { Object user = request.getSession().getAttribute("LoginUser"); if(user == null) { //登录失败 request.setAttribute("msg","没有权限请登录"); request.getRequestDispatcher("/").forward(request,response);//转发器 return false; } else { return true; } } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { }}
//注册拦截器public WebMvcConfigurerAdapter webMvcConfigurerAdapter() { WebMvcConfigurerAdapter adapter = new WebMvcConfigurerAdapter() { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(newLoginInterceptor()).addPathPatterns("/**").excludePathPatterns("/","/user/login"); } };return adapter;
重要知识整理
在用Spring Boot 开发web项目的时候,我们要先在main文件中创建几个包 1.controller(存放处理器) 2.config(存放配置类) 3.compoent(存放自己写的组件,比如:拦截器,区域解析器等) 4.dao类 等
错误信息定制
如果是浏览器访问的话返回的就是错误页面;如果是其他的客户端访问的话返回的就是json数据
浏览器访问返回错误页面:
有模板引擎的情况下
我们可以==在tymeleaf下新建一个error文件夹==,然后我们把我们自己定制的错误页面放在这个文件夹中。其中我们既可以定制精确状态码的错误页面,也可以定制4xx和5xx的错误页面,其中错误页面中可以自己指定的属性有
1.status :状态码==
2.timestamp :时间戳
**3.error ** :错误提示
**4.expection ** :异常对象
**5.message ** :异常消息
**6.errors ** :JSR303数据校验的错误都在这里
在模板引擎中可以用行内语法取出来 例如[[${status}]]
<main role="main" class="col-md-9 ml-sm-auto col-lg-10 pt-3 px-4"> <h1>status:[[${status}]]</h1> <h2>timestamp:[[${timestamp}]]</h2> <h2>error:[[${error}]]</h2> <h2>exception:[[${exception}]]</h2> <h2>message:[[${message}]]</h2> <h2>errors:[[${errors}]]</h2> </main>
没有模板引擎的情况下(模板引擎找不到这个错误页面)
那就在静态资源文件中找
如果都找不到错误页面,那就默认来到spring boot的默认错误提示页面
其他客户端访问返回json数据
定制返回的json数据:
在controller包中创建一个异常错误处理器
@ControllerAdvice//异常处理器需要用这个注解标注public class MyExceptionHandle { @ResponseBody @ExceptionHandler(NotUserExist.class) public Map<String,Object> handleException(Exception e,HttpServletRequest request){ Map<String,Object> map=new HashMap<>(); request.setAttribute("javax.servlet.error.status_code",404);//用来自定义错误界面,否则就是202错误 map.put("code","user.notexist"); map.put("message",e.getMessage()); return map; }}
但是这个有缺陷,上面两个方法都不能实现在浏览器访问返回错误页面,在其他客户端返回json的目的,
下面我们来实现一个自适应的错误处理机制,让它浏览器访问的时候可以返回我们自己定制的错误页面,其他客户端访问的时候可以返回我们定制的json 数据
我们要向容器中添加一个组件 MyErrorAttributes
@Componentpublic class MyErrorAttributes extends DefaultErrorAttributes { @Override public Map<String, Object> getErrorAttributes(WebRequest webRequest, ErrorAttributeOptions options) { Map<String, Object> map = super.getErrorAttributes(webRequest, options); map.put("company","com.nuc"); Object ext = webRequest.getAttribute("ext", 0);//0是取出的方式就request请求方式 map.put("ext",ext); return map; }}
一.下面我们来详细的梳理一下自定义错误处理数据
1)、 自定义浏览器访问时的错误页面
在tymeleaf文件夹下创建一个error文件夹或者静态资源文件夹下创建一个error文件夹,创建我们自己的响应代码错误页面,比如:404.html 4xx.html 5xx.html 500.html等
目录层次是:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5yAtzVSs-1623409489804)(C:\Users\86130\AppData\Roaming\Typora\typora-user-images\image-20210404211430086.png)]
2)、自定义其他客户端访问时的json数据错误页面
在controller文件夹中创建一个错误处理器,比如MyErrorHandle 在这个处理器中存放我们自定义输出的json数据,首先还需要创建一个exception文件夹,然后在这个文件夹中创建一个自己的异常类
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W4s59kIz-1623409489804)(C:\Users\86130\AppData\Roaming\Typora\typora-user-images\image-20210404212152199.png)]
package com.nuc.springweb02.exception;public class NotUserExist extends RuntimeException{ public NotUserExist() { super("用户不存在"); }}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MnQSUc6F-1623409489805)(C:\Users\86130\AppData\Roaming\Typora\typora-user-images\image-20210404211725009.png)]
@ControllerAdvice//这个注解说明是一个错误处理器public class MyExceptionHandle { @ExceptionHandler(NotUserExist.class)//指定你需要处理哪个错误类 public String myException(Exception e, HttpServletRequest request){ Map<String, Object> map=new HashMap<>();//map中放我们自定义的json数据 request.setAttribute("javax.servlet.error.status_code",404);//这里一定注意,要自己手动指定状态码,要不然就默认是200 map.put("code","123456"); map.put("message",e.getMessage());//这里的message方法就是我们自己写的错误类中的super()中的数据 request.setAttribute("ext",map);//把我们自定义的code和message传给MyErrorAttribute return "forward:/error";//注意一定要有这个,不然你自己手动定义的状态码不起作用 }}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)