引入依赖:
pom.xml:
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
dependency>
在file—>setting—>plugin中搜索lombok并安装
使用示例:
@Data //添加get、set方法
@NoArgsConstructor //添加无参构造器
@AllArgsConstructor //添加全参构造器
@ToString //添加ToString
@EqualsAndHashCode //添加Equals和HashCode方法
@ConfigurationProperties(prefix = "mycar")
public class Car {
private String brand;
private Integer price;
}
在Controller层中添加注解:
@Slf4j
public class HelloController {
之后就会允许在这个Controller类中进行日志的操作,例如:
log.info("输出信息")
就会在执行这个语句时在控制台中输出后面的String语句
添加依赖:
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-devtoolsartifactId>
<optional>trueoptional>
dependency>
依赖添加完成后,使用Ctrl+F9进行刷新就可以在不需要重新部署的情况下刷新
若经费足够就使用付费的JRebel进行热部署以及热启动。
静态页面和Java代码都可以通过devtools进行热部署
在创建项目时使用Spring Initializr进行项目生成,会帮助创建项目结构,添加依赖信息,完成配置。
SpringBoot支持的文件类型除了Properties还有yaml
yaml很适合进行以数据为中心的开发方式,其基本语法:
在resources文件夹中使用yaml进行数据绑定,即向类的实例化对象中传值
使用yaml进行数据配置的示例:
Application.yml:
person:
userName: Zhangsan
boss: true
birth: 2019/12/9
age: 18
# 数组的写法
# interests: [篮球,足球]
interests:
- 篮球
- 足球
- 18
animal: [阿猫,阿狗]
# Map的写法
# score: {english:80,math:90}
score:
english: 80
math: 90
salarys:
- 9999.98
- 9999.99
# 传入对象的写法
pet:
name: 阿狗
weight: 66.66
# 传入多个对象的写法:
allPets:
sick:
- {name: 阿狗,weight: 99.99}
- name: 阿猫
weight: 66.66
- name: 阿虫
weight: 77.77
health:
- {name: 阿猪,weight: 899.99}
- {name: 阿鼠,weight: 1.99}
- {name: 阿鸟,weight: 19.99}
两个Bean示例:
Pet.java:
@ToString
@Data
public class Pet {
private String name;
private Double weight;
}
Person.java
@ConfigurationProperties(prefix = "person")
@Component
@ToString
@Data
public class Person {
private String username;
private Boolean boss;
private Date birth;
private Integer age;
private Pet pet;
private String[] interests;
private List<String> animal;
private Map<String, Object> score;
private Set<Double> salarys;
private Map<String, List<Pet>> allPets;
}
但yml文件中有的时候会不提示,要提示的话就可以在pom.xml文件中添加依赖并重新打包(maven—>lifecycle—>package):
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-configuration-processorartifactId>
<optional>trueoptional>
dependency>
在创建时勾选LomBok(快速创建JavaBean以及日志)、DevTools(热部署)、Configuration Processor(配置处理器、提示属性信息)、Web
其中生成的文件中:.mvn文件夹,.gitgnore,HELP.md,mvnw,mvnw.cmd文件都可以删除掉
其中在类路径下的META-INF、public、resources、static文件夹中用来存放静态资源,这些静态资源可以直接被访问。
注意,如果静态资源的名称与请求重名,会优先访问请求(先在controller层中尝试寻找请求,无法找到时再去静态资源中寻找资源)
所以在尝试寻找静态资源时,应该在配置文件中配置静态资源的固定前缀,例如在下面文件:
application.yml
spring:
mvc:
static-path-patetrn: /res/**
这样之后,静态资源就只能通过在前面加入/res/资源名 才可以进行访问了
其中,静态资源的路径也可以改变,添加下面的代码,静态资源就只能在以下文件夹下找到
spring:
resources:
static-locations: classpath:/zheli
注意在访问默认页面index.html时不能添加静态资源访问前缀,但是通过controller访问
在静态资源下找到Favicon.ico文件,会将其作为网页图标
下面的add-mapping可以设置静态资源的访问,true代表允许访问静态资源。false代表不允许访问静态资源
spring:
resources:
add-mapping: true
同时还有缓存控制,设置缓存时间。
普通风格使用 / getUser 获取用户 / deleteUser 删除用户 / editUser 修改用户 / saveUser 保存用户
Rest风格使用Http协议的不同请求方式来操作业务:所有的请求都是/user GET-获取用户 DELETE-删除用户 PUT-修改用户 POST-保存用户
使用HiddenHttpMethodFilter来实现Rest风格的代码编写
注意,SpringBoot在底层默认将开启RestFul风格编程的选项设置为了false,我们要使用RestFul风格编程的话就需要再配置文件中设置:
application.yml:
spring:
mvc:
hiddenmethod:
filter:
enabled: true
@PathVariable注解加在形参之前,用来给形参赋值,将请求信息中的同名参数赋值给标注了这个注解的形参,另外,也可以将所有的参数赋值给一个Map对象,举例如下:
@GetMapping("/car/{id}/owner/{username}")
public Map<String, Object> getCar(@PathVariable("id") Integer id,
@PathVariable("username") String name,
@PathVariable Map<String, String> pv){
Map<String, Object> map = new HashMap<>();
map.put("id", id);
map.put("name", name);
map.put("pv", pv);
return map;
}
调用:
<a href="/car/3/owner/lisi">测试@PathVariablea>
@RequestHeader注解用来获取请求头信息,可以获取单个的某个参数,也可以将所有的信息转换成一个map获取,同样是在形参的位置获取。
@RequestHeader("User-Agent") String userAgent,
@RequestHeader Map<String, String> header
@RequestParam用来获取浏览器上?后面的参数,传给注解的value属性其键值就可以获取他的具体值,如果有很多个值,就使用一个List进行存储。
@GetMapping("/car/{id}/owner/{username}")
public Map<String, Object> getCar(@RequestParam("age") Integer age,
@RequestParam("inters") List<String> inters,
@RequestParam Map<String, String> params){
Map<String, Object> map = new HashMap<>();
map.put("age", age);
map.put("inters", inters);
map.put("Params", params);
return map;
}
传入的请求:
<a href="/car/3/owner/lisi?age=18&inters=basketball&inters=game">测试@PathVariablea>
使用@CookieValue获取Cookie值
cookie.getName和cookie.getValue来获取名称和Value,但必须要在@CookieValue中添加Cookie名
@GetMapping("/car/{id}/owner/{username}")
public Map<String, Object> getCar(@CookieValue("Idea-cd4fc388") Cookie cookie){
Map<String, Object> map = new HashMap<>();
System.out.println("CookieName = " + cookie.getName() + "====>" + cookie.getValue());
return map;
}
@RequestBody来获取请求体,注意只有Post请求才有请求体,其请求体中存储的一般是表单中的键值对,使用String获取,是由键值对组成的字符串。
@PostMapping("/save")
public Map<String, Object> getRequestBody(@RequestBody String requestBody){
Map<String, Object> map = new HashMap<>();
map.put("requestBody", requestBody);
return map;
}
前台表单:
测试ResponseBody获取数据【POST】
<form action="/save" method="post">
<input type="text" name="username" value="请输入用户名" /><br>
<input type="text" name="email" value="请随意输入邮箱" /><br>
<input type="submit" value="提交">
form>
使用goToPage向request域中存储数据,再通过@RequestAttrbute注解获取数据,或者通过request直接拿(转发,同一个请求)
@Controller
public class RequestController {
@GetMapping("/goto")
public String goToPage(HttpServletRequest request){
request.setAttribute("msg", "成功了");
request.setAttribute("code", 200);
return "forward:/success"; //转发到/success请求
}
@ResponseBody
@GetMapping("/success")
public Map success(@RequestAttribute("msg") String msg,
@RequestAttribute("code") Integer code,
HttpServletRequest request){
Object msg1 = request.getAttribute("msg");
Map<String, Object> map = new HashMap<>();
map.put("annotation_msg", msg);
map.put("request_msg", msg1);
return map;
}
}
正常请求是这样的:/cars/{path}?xxx=xxx,这种叫做queryString 查询字符串
矩阵变量是这样的:/cars/{path;low=34;brand=byd,audi,yd}
一道经典的面试题:Cookie被禁用了怎么获取session中的数据
cookie被禁用之后,就没办法通过请求携带cookie的方式获取cookie的JsessionId从而获取session中的数据了,我们可以通过url重写的方式获取JSessionId从而获取Session中的数据(矩阵变量获取)例如:/abcdefg/jsessionid=xxxx(将cookie中的值通过矩阵变量进行传递)
注意,SpringBoot默认是禁用矩阵变量的
因为SpringBoot对于路径的处理都是通过UrlPathHelper进行解析的,而这个帮助器默认在解析时会把分号去掉(removeSemicolonContent)(移除分号内容)
进行手动开启,编写配置类:
@Configuration(proxyBeanMethods = false)
public class WebConfig {
@Bean
public WebMvcConfigurer webMvcConfigurer() {
return new WebMvcConfigurer(){
//重写WebMvcConfigurer的路径解析方法
@Override
public void configurePathMatch(PathMatchConfigurer configurer){
//创建一个新的关闭了分号移除的帮助器对象
UrlPathHelper urlPathHelper = new UrlPathHelper();
//关闭分号移除功能
urlPathHelper.setRemoveSemicolonContent(false);
//将新的帮助器返回给配置
configurer.setUrlPathHelper(urlPathHelper);
}
};
}
}
然后使用@MatrixVariable注解获取矩阵变量中的值
// /car/sell;low=34;brand=audi,byd,yd
@GetMapping("/car/{path}")
public Map carsSell(@MatrixVariable("low") Integer low,
@MatrixVariable("brand") List<String> brands,
@PathVariable("path") String path){
Map<String, Object> map = new HashMap<>();
map.put("low", low);
map.put("brands", brands);
map.put("path", path);
return map;
}
当要传入多个对象的相同属性时,要添加如下参数,注意必须有{},矩阵变量才可以被解析:
//测试相同键值时的矩阵传值
@GetMapping("/boss/{bossId}/{empId}")
public Map boss(@MatrixVariable(value = "age", pathVar = "bossId") Integer bossAge,
@MatrixVariable(value = "age", pathVar = "empId") Integer empAge) {
Map<String, Object> map = new HashMap<>();
map.put("bossAge", bossAge);
map.put("empAge", empAge);
return map;
}