1.在yml中查看生效和失效的自动配置类在yml文件中debug=true.
2.yml中加单引号会将\n作为字符串输出,双引号会将\n作为换行输出
3.springMVC之中返回字符表示页面跳转,在响应体当中加入responbody表示作为响应体返回
在类中加上,表示整个都作为响应体
4.@Restcontriller相当于@Responbody加@controller
5.
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
</build>
该代码表示运行将springboot程序打包成一个项目进行的一个插件
6.依赖冲突:一般出现ClassNotfind、方法找不到, 安装mavenHelper插件,点击pom文件,点击DependencecyAnalyer查看confilcts冲突的依赖,查看是否有爆红的依赖,进行exclusion
7.自己指定相关依赖可以根据加入<version>版本号<version>,官方的依赖的版本号已经指定,非官方的版本号需要我们必须去手动的去指定相关的版本
8.yml文件当中驼峰命名和**-**一样的效果
yml集合表示
list:
- sang
- geng
students:
-name: sanggeng
gge:18
-name: caotang
age:12
9yml.占位符表示¥{port}
10.springboot读取yml文件
@Value注解:表示读取简单的值 @Value(${字段})---加了@Value的类必须嫁给容器管理
@ConfigurationProperties表示读取对象的配置
将实体类交给容器在容器上加上@ConfigurationProperties(prefix+"yml种文件对象的名称")
spring-boot-configuration-processor加入这个依赖可以对yml文件做出响应的提示信息
11.整合junit(添加依赖)
测试的包目录结构不同,整合junit在@springBootTest(class=......Application.class)
yml种注释用#
12.整合mybatis
a.引入mybatis启动器依赖和mysql驱动器依赖指定版本号参考官网
b.配置数据库的连接,mybatis的相关
mybatis:
mapper-locations: classpath*:mapper/*.xml
type-aliases-package: com.example.hxds.dr.db.pojo #配置那个包下的类有 默认的别名
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
map-underscore-to-camel-case: true
13.springboot项目下的静态资源放在resources下的static目录
14.设置请求头
@RequestMapping(value = "/testConsumes",method = RequestMethod.POST,consumes = "multipart/from-data")
public String testConsumes(){
System.out.println("testConsumes处理了请求");
return "/success.jsp";
}
15.路径参数@Pathvariable
16.前端传入集合参数:[{"":""},{"":""}]
17.如果需要使用@RequestBody来获取请求体中Json并且进行转换,要求请求头 Content-Type 的值要为: application/json 。
18.
如果接口的参数是使用QueryString的格式的话,我们也可以使用SpringMVC快速获取参数。
我们可以使用@RequestParam来获取QueryString格式的参数。
在方法中定义方法参数,方法参数名要和请求参数名一致,这种情况下我们可以省略@RequestParam注解。
@RequestMapping("/testRquestParam")
public String testRquestParam(Integer id, String name, String[] likes){
System.out.println("testRquestParam");
System.out.println(id);
System.out.println(name);
System.out.println(Arrays.toString(likes));
return "/success.jsp";
}
如果方法参数名和请求参数名不一致,我们可以加上@RequestParam注解例如:
@RequestMapping("/testRquestParam")
public String testRquestParam(@RequestParam("id") Integer uid,@RequestParam("name") String name, @RequestParam("likes")String[] likes){
System.out.println("testRquestParam");
System.out.println(uid);
System.out.println(name);
System.out.println(Arrays.toString(likes));
return "/success.jsp";
}
也可以将参数封装成一个对象接收
19.required
代表是否必须,默认值为true也就是必须要有对应的参数。如果没有就会报错。
如果对应的参数可传可不传则可以把去设置为fasle
@RequestMapping("/testRquestParam")
public String testRquestParam(@RequestParam(value = "id",required = false) Integer uid,@RequestParam("name") String name, @RequestParam("likes")String[] likes){
System.out.println("testRquestParam");
System.out.println(uid);
System.out.println(name);
System.out.println(Arrays.toString(likes));
return "/success.jsp";
}
如果对应的参数没有,我们可以用defaultValue属性设置默认值。
@RequestMapping("/testRquestParam")
public String testRquestParam(@RequestParam(value = "id",required = false,defaultValue = "777") Integer uid,@RequestParam("name") String name, @RequestParam("likes")String[] likes){
System.out.println("testRquestParam");
System.out.println(uid);
System.out.println(name);
System.out.println(Arrays.toString(likes));
return "/success.jsp";
}
19.返回的数据大括号表示的是一个对象,中括号表示的是集合数组对象。
出现XMLHttpRequest可能是出现了跨域问题
20.解决跨域问题
a.在类上加注解@crossOrigin,该类的所有方法都可以跨域(比较麻烦)
b.常用的方式
@Configuration
public class CorsConfig implements WebMvcConfigurer {
/* @Value("${custom.file-path.save.parent}")
private String path;*/
@Override
public void addCorsMappings(CorsRegistry registry) {
//设置允许跨域的的路径
registry.addMapping("/**")
//设置允许跨域请求的域名
.allowedOriginPatterns("*")
//设置允许的请求方式
.allowedHeaders("*")
//设置允许的请求方式
.allowedMethods("*")
//是否允许cookie
.allowCredentials(true)
//设置允许跨域的时间
.maxAge(3600);
}
}
21.登录接口可以在用户登录成功之后返回一个token。用户访问接口的时候将token传过来
jwt工具类的生成,依赖的导入
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.0</version>
</dependency>
package com.myblog.utils;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
import java.util.Date;
import java.util.UUID;
/**
* JWT工具类
*/
public class JwtUtil {
//有效期为
public static final Long JWT_TTL = 24*60 * 60 *1000L;// 60 * 60 *1000 一个小时
//设置秘钥明文
public static final String JWT_KEY = "sangeng";
public static String getUUID(){
String token = UUID.randomUUID().toString().replaceAll("-", "");
return token;
}
/**
* 生成jtw
* @param subject token中要存放的数据(json格式)
* @return
*/
public static String createJWT(String subject) {
JwtBuilder builder = getJwtBuilder(subject, null, getUUID());// 设置过期时间
return builder.compact();
}
/**
* 生成jtw
* @param subject token中要存放的数据(json格式)
* @param ttlMillis token超时时间
* @return
*/
public static String createJWT(String subject, Long ttlMillis) {
JwtBuilder builder = getJwtBuilder(subject, ttlMillis, getUUID());// 设置过期时间
return builder.compact();
}
private static JwtBuilder getJwtBuilder(String subject, Long ttlMillis, String uuid) {
SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
SecretKey secretKey = generalKey();
long nowMillis = System.currentTimeMillis();
Date now = new Date(nowMillis);
if(ttlMillis==null){
ttlMillis=JwtUtil.JWT_TTL;
}
long expMillis = nowMillis + ttlMillis;
Date expDate = new Date(expMillis);
return Jwts.builder()
.setId(uuid) //唯一的ID
.setSubject(subject) // 主题 可以是JSON数据
.setIssuer("sg") // 签发者
.setIssuedAt(now) // 签发时间
.signWith(signatureAlgorithm, secretKey) //使用HS256对称加密算法签名, 第二个参数为秘钥
.setExpiration(expDate);
}
/**
* 创建token
* @param id
* @param subject
* @param ttlMillis
* @return
*/
public static String createJWT(String id, String subject, Long ttlMillis) {
JwtBuilder builder = getJwtBuilder(subject, ttlMillis, id);// 设置过期时间
return builder.compact();
}
public static void main(String[] args) throws Exception {
String token = "eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJjYWM2ZDVhZi1mNjVlLTQ0MDAtYjcxMi0zYWEwOGIyOTIwYjQiLCJzdWIiOiJzZyIsImlzcyI6InNnIiwiaWF0IjoxNjM4MTA2NzEyLCJleHAiOjE2MzgxMTAzMTJ9.JVsSbkP94wuczb4QryQbAke3ysBDIL5ou8fWsbt_ebg";
Claims claims = parseJWT(token);
System.out.println(claims);
}
/**
* 生成加密后的秘钥 secretKey
* @return
*/
public static SecretKey generalKey() {
byte[] encodedKey = Base64.getDecoder().decode(JwtUtil.JWT_KEY);
SecretKey key = new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");
return key;
}
/**
* 解析
*
* @param jwt
* @return
* @throws Exception
*/
public static Claims parseJWT(String jwt) throws Exception {
SecretKey secretKey = generalKey();
return Jwts.parser()
.setSigningKey(secretKey)
.parseClaimsJws(jwt)
.getBody();
}
}
22.配置拦截器的步骤
a.
@Component
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String token = request.getHeader("token");
if (!StringUtils.hasText(token)) {
response.sendError(HttpServletResponse.SC_UNAUTHORIZED);
return false;
}
return true;
}
}
b.
@Configuration
public class LoginConfig implements WebMvcConfigurer {
@Autowired
private LoginInterceptor loginInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginInterceptor)//添加拦截器
.addPathPatterns("/**")//配置拦截路径
.excludePathPatterns("/user/login");//配置排除路径
}
}
23.统一异常的处理
@ControllerAdvice
@ResponseBody
public class MyControllerAdvice {
@ExceptionHandler(RuntimeException.class)
public ApiResult handerException(Exception e) {
String message = e.getMessage();
ApiResult<Object> result = new ApiResult<>(300, message, null);
return result;
}
}
24.获取原生的request和respon对象HttpServletRequest,HttpServletResponse,HttpSession,只需要在在方法上直接获取即可。
25自定义参数解析(从请求头中获取参数)
@RestController
@ResponseBody
public class UserController {
@GetMapping
public void getUser(@CurrentUserId String id) {
System.out.println();
}
}
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface CurrentUserId {
}
@Component
public class UserIdResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter parameter) {
return parameter.hasParameterAnnotation(CurrentUserId.class);
}
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
String token = webRequest.getHeader("token");
return token;
}
}
26.springboot中事务直接使用注解@Transactional
27.springboot中的aop
a。添加依赖
b.创建接口和切面类
c.方法上添加定义的aop注解
28.模版引擎的使用(类似jsp)
a.导入依赖
b. 环境配置:
29.环境切换
a。编写不同环境下的yml配置文件
b。在主要的yml中的进行配置spring-profiles-active
30.springboot开启打印日志
debug: true
logging:
level:
com.honson: debug
31.springboot指标监控
a.引入依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
访问接口查看信息
图形化界面的信息查看可以使用相关依赖