Spring Boot从一到二

标签: Springboot 分类: Java 创建时间:2019-09-17 02:45:11 更新时间:2024-11-15 10:49:43

这是SpringBoot系列的第二篇,都是一些基础知识,写下来,其实是为了巩固自己的记忆,大部分的内容,都是网上整理的,自己的原创内容很少。

1.SpringBoot注入request和response

三种方式,第一种:通过静态方式获取(详见参考文章),第二种:通过参数直接获得。第三种:注入到类。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// 静态方式
@GetMapping(value = "")
public String center() {
ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
HttpServletRequest request = servletRequestAttributes.getRequest();
HttpServletResponse response = servletRequestAttributes.getResponse();
//...
}
// 通过参数

@GetMapping(value = "")
public String center(HttpServletRequest request,HttpServletResponse response) {
//...
}
// 注入到类
@Autowired
private HttpServletRequest myHttpRequest;

@Autowired
private HttpServletResponse myHttpResponse;

@GetMapping(value = "")
public String center() {
//refer to myHttpRequest or myHttpResponse
}

2.SpringBoot返回json数据格式

一种是通过@ResponseBody 和@RequestMapping(value = “/request/data”, method = RequestMethod.POST, produces = “application/json;charset=UTF-8”) 中的produces = “application/json;charset=UTF-8” 来设定返回的数据类型是json,utf-8编码,第二种方式,是通过response的方式,直接写到客户端对象。在Springboot中,推荐使用注解的方式。

3.静态资源处理

4.开启Gzip压缩

Gzip有什么作用,就不细说了,就是压缩传输内容啊。
(1) 启动压缩
(2) 默认只压缩超过2048字节的数据,修改server.compression.min-response-size的值可以设置该大小
(3) 压缩类型,默认为text/html、text/xml、text/plain、text/css,可以修改为:application/json

1
2
3
4
5
server:
port: 8068
compression:
enabled: true
mime-types: application/json

5.打包时跳过测试

默认情况下,使用spring boot开发,在执行:mvn clean package 会默认执行编写的测试用例,如果pom.xml中使用了:spring-boot-maven-plugin 插件,可以在pom.xml中直接添加skipTests属性,添加跳过测试的命令

1
2
3
4
<properties>
<java.version>1.8</java.version>
<skipTests>true</skipTests>
</properties>

6.解决烦人的Whitelabel Error Page

有时候编写代码的时候,编写restful风格的api时,总是出现 Whitelabel Error Page 错误:

这是什么原因呢?我都目录结构是这样的:

已经通过步骤4设置了自定义打包路径server

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<executions>
<execution>
<id>add-source</id>
<phase>generate-sources</phase>
<goals>
<goal>add-source</goal>
</goals>
<configuration>
<sources>
<!-- 可以在这里添加多个source节点,来添加任意多个源文件夹 -->
<source>src/main/app</source>
<source>src/main/server</source>
</sources>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>

而且ApiCtrl中的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package com.proheng.api;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
@ResponseBody
@RequestMapping("/")
public class ApiCtrl {

@RequestMapping("helloword")
public String helloword(){
return "HelloWord";
}
}

看起来是没啥问题,但是启动spring boot之后,就是找不到: localhost:8078/helloword ,报错:Whitelabel Error Page。
多方查找,原来是因为:@SpringBootApplication默认的扫描位置就是Application所在的同级目录和子目录
解决方式:

方法1:将controller跟启动类放在一个包中,或者在启动类所在包的子包中

方法2:在启动类上添加注解 @ComponentScan(“包名”)

这里可以查看同样时路由的Application同级的ctrl文件代码为:

1
2
3
4
5
6
7
8
9
10
11
12
13
package com.proheng.gis;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/a")
public class ctrl {
@RequestMapping("/hell")
public String h(){
return "kl";
}
}

这个 http://localhost:8078/a/hell 就可以正常的访问到,也验证了我们的说法。
中间的小插曲是,我把server下的包名改成了和application包名一至,还是扫描不到,甚至我设置了 @ComponentScan(basePackages={“com.proheng”}) 也不起作用,弄了好久,结果是因为我把包名的com.proheng写成了com.prohemg ,一字之差,竟让我浪费了很多时间。但是我同时发现了,你写basePackages时只需要写道 com.proheng 就好了,而不需要写到 com.proheng.gis,否则会告你冗余:

最后访问 localhost:8078/helloword 就正常了

小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。