这是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() { }
|
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>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 就正常了