Spring-boot 简介
Spring Boot提供了一种新的编程范式,能在最小的阻力下开发Spring应用程序。有了它, 你可以更加敏捷地开发Spring应用程序,专注于应用程序的功能,不用在Spring的配置上多花功夫,甚至完全不用配置。以前配置都是复杂并且模板化,而在springboot中这些都自动为我们做好了,让开发人员更加专注于业务需求的开发。
优点:
1.去除了大量的xml配置文件
2.简化复杂的依赖管理
3.配合各种starter使用,基本上可以做到自动化配置
4.快速启动容器
5.配合Maven或Gradle等构件工具打成Jar包后,Java -jar 进行部署运行还是蛮简单的,
创建独立Spring应用程序,嵌入式Tomcat,Jetty容器,无需部署WAR包,简化Maven及Gradle配置,
尽可能的自动化配置Spring,直接植入产品环境下的实用功能,比如度量指标、健康检查及扩展配置等,
无需代码生成及XML配置。
缺点:
1.从原来的xml配置方式转换到JAVA配置方式变化有点大,不太适应
2.感觉Spring Boot 比较适合做微服务,不适合做比较大型的项目。
一 . 如何在idea中搭建一个简单的springboot
二. 结构:
- controller(控制层负责页面访问级传值)
- service/biz(负责业务逻辑)
- pojo/domain(实体类)
- utils(工具类,一些公共的类)
- main/resources
- static(目录存放web访问的静态资源,js,css,图片等)
- templates(目录存放页面模板)
- application.properties(项目的配置信息)
- banner.txt(可替换项目启动时的图画)
三. pom.xml中依赖的jar
//支持web模块
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
//项目核心模块,包括自动配置支持,日志和YAML
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
//springboot 启动项目插件
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
注:
- 问题: springboot中包结构没有在Application类同级而导致404找不到
- 解决:需要在Application类上添加@ComponentScan(“扫描的位置包”)
@SpringBootApplication
//@ComponentScan("com") // 添加注解 规定要扫描的包结构
public class BootApplication {
public static void main(String[] args) {
SpringApplication.run(BootApplication.class, args);
}
}
四. 启动方式:
1.spring-boot 中内嵌的tomcat
2.pom.xml 中依赖的插件
五. 写一个简单的controller 测试
/**
* Created by Administrator on 2019/1/11.
*
* @RestController 代表返回的是json字符串 可以省略不写@ResponseBody
* 也可以写springmvc 中 @Controller 在方法上仍然加上@ResponseBody
*/
@RestController
public class TestController {
@RequestMapping("test1")
/**
* @ResponseBody
*/
public String test1(){
return "success";
}
@RequestMapping("test2")
public String test2(){
return "error";
}
}
六. 如何改变项目启动时的图画
注:
问题:在访问的时候肯定加上了项目名称,结果肯定是404
解决:SpringMVC的运行方式是将打成的war包放到tomcat中运行,这种情况下访问需要在url中加入项目名。SpringBoot同样可以打成war包部署,但也提供了另一种方式:直接执行public static void main()函数并启动一个内嵌的应用服务器(取决于类路径上的依赖是Tomcat还是jetty)来处理应用请求,这时是不需要添加项目名的。
1.创建banner.txt
2.在文件中添加自己想要的效果
七. application.properties 配置 (第一种)
- 修改访问项目的端口(tomcat端口号)
server.port=8082 (端口号) - 修改访问项目的路径
server.servlet.context-path=/xf(自定义项目名) - 修改编码
server.tomcat.uri-encoding=UTF-8(编码格式) - session 失效时间
server.servlet.session.timeout=30(时间) - 自定义配置
1) application.properties 中添加自定义的配置
2)Controller 层
3)页面显示
application.yml (第二种)
注:springboot官方推荐使用这种文件,树状结构,层次感强,少写了很多代码,
在使用是 : 后必须跟一个空格,不然会认为是自动以配置,而不是文件本有的配置
八. 数据验证
注: 在公司用到数据验证的, 一般都需要前后台验证两次
注:注解要对应相应的属性
1. springboot 注解验证参数
注解 | 作用类型 | 解释 |
@NotNull | 任何类型 | 属性不能为null |
@NotEmpty | 集合 | 集合不能为null,且size大于0 |
@NotBlanck | 字符串、字符 | 字符类不能为null,且去掉空格之后长度大于0 |
@AssertTrue | Boolean、boolean | 布尔属性必须是true |
@Min | 数字类型(原子和包装) | 限定数字的最小值(整型) |
@Max | 同@Min | 限定数字的最大值(整型) |
@DecimalMin | 同@Min | 限定数字的最小值(字符串,可以是小数) |
@DecimalMax | 同@Min | 限定数字的最大值(字符串,可以是小数) |
@Range | 数字类型(原子和包装) | 限定数字范围(长整型) |
@Length | 字符串 | 限定字符串长度 |
@Size | 集合 | 限定集合大小 |
@Past | 时间、日期 | 必须是一个过去的时间或日期 |
@Future | 时期、时间 | 必须是一个未来的时间或日期 |
@Email | 字符串 | 必须是一个邮箱格式 |
@Pattern | 字符串、字符 | 正则匹配字符串 |
- 简单验证效果
1)创建一个实体类,添加相对应的注解
@Data
public class Student {
@NotNull(message = "ID不能为空")
private Integer stuId;
@Max(value = 25,message = "不能超过25")
@Min(value = 18,message = "不能小于18")
private Integer stuAge;
@NotEmpty(message = "用户名不能为空")
private String stuName;
}
2)Controller层
@RequestMapping("valid")
public String valid(@Valid Student stu, BindingResult result){
System.out.println(stu);
if(result.hasErrors()){ //验证有错误
List<ObjectError> errors = result.getAllErrors(); //获取一个错误的集合
for (ObjectError error : errors) { // 循环错误信息 并打印在控制台 (foreach循环在idea中快捷键 iter)
System.out.println("错误信息为-->"+error.getDefaultMessage()+"错误码-->"+error.getCode());
}
}
return "ok";
}
3)客户端访问
注:访问不传递参数 可能会导致错误信息不全
4)控制台信息
5)客服端传参的情况:
6)对应控制台信息:
九. springboot junit4 单选测试(ApplicationTests)
/**
* SpringBoot1.4版本之前用的是SpringJUnit4ClassRunner.class
*/
@RunWith(SpringRunner.class)
/**
* SpringBoot1.4版本之前用的是@SpringApplicationConfiguration(classes = Application.class)
*/
@SpringBootTest
/**
* 测试环境使用,用来表示测试环境使用的ApplicationContext将是WebApplicationContext类型的
*/
@WebAppConfiguration
public class BootApplicationTests {
private MockMvc mvc = null;
@Before
public void before(){
mvc= MockMvcBuilders.standaloneSetup(new TestController()).build();
}
@Test
public void test() throws Exception{
/**
* 1、mockMvc.perform执行一个请求。
* 2、MockMvcRequestBuilders.get("XXX")构造一个请求。
* 3、ResultActions.param添加请求传值
* 4、ResultActions.accept(MediaType.TEXT_HTML_VALUE))设置返回类型
* 5、ResultActions.andExpect添加执行完成后的断言。
* 6、ResultActions.andDo添加一个结果处理器,表示要对结果做点什么事情
* 比如此处使用MockMvcResultHandlers.print()输出整个响应结果信息。
* 5、ResultActions.andReturn表示执行完成后返回相应的结果。
*/
MvcResult mvcResult= mvc.perform(MockMvcRequestBuilders.get("/valid")
.param("name","zxf")
.accept(MediaType.TEXT_HTML_VALUE))
.andExpect(MockMvcResultMatchers.status().isOk()) //等同于Assert.assertEquals(200,status);
// .andExpect(MockMvcResultMatchers.content().string("hello lvgang")) //等同于 Assert.assertEquals("hello lvgang",content);
.andDo(MockMvcResultHandlers.print())
.andReturn();
/**int status=mvcResult.getResponse().getStatus(); //得到返回代码
String content=mvcResult.getResponse().getContentAsString(); //得到返回结果
Assert.assertEquals(200,status); //断言,判断返回代码是否正确
Assert.assertEquals("hello lvgang",content); //断言,判断返回的值是否正确*/
}
@Test
@Ignore // 忽略测试方法
public void contextLoads() {
}
}