一、SpringBoot简介
SpringBoot是一个快速开发的框架,用来简化新Spring应用的初始搭建以及开发过程 ,它能够快速的整合第三方框架,简化XML配置,全部采用注解形式开发,内置Http服务器,SpringBoot的Web组件默认集成的是SpringMVC框架。
二、SpringBoot和SpringCloud区别
SpringBoot是一个快速开发框架,而SpringCloud依赖于SpringBoot组件,是一套完整的微服务解决框架。
三、快速入门
多说无益,先来看一个入门程序
1、新建一个maven项目,目录结构如图
2、pom.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.caofanqi</groupId>
<artifactId>stuspringboot</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<!-- 添加父工程,就能受益于maven的依赖管理功能,在项目中引入很多依赖,就不需要添加版本号了,会从parent中继承得到 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
</parent>
<dependencies>
<!-- 添加springboot web 组件依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<!-- 打包构建jar文件 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
3、IndexController
package com.caofanqi.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 因为web组件采用的是SpringMVC,所以控制层编写与SpringMVC类似。
*/
@RestController
public class IndexController {
@RequestMapping(value = {"/","/index"})
public String index() {
return "Hello SpringBoot!";
}
}
4、Application启动类
package com.caofanqi; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; /** * @SpringBootApplication = @SpringBootConfiguration + @EnableAutoConfiguration + @ComponentScan ,一个注解顶三个, * @SpringBootConfiguration:里面包含@Configuration,表示是javaConfig配置类; * @ComponentScan:扫描包; * @EnableAutoConfiguration :表示开启自动配置; */ @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
5、运行main方法可以看到如下所示,启动成功,默认服务器Tomcat,默认端口8080
访问 http://127.0.0.1:8080/ 或 http://127.0.0.1:8080/index 如下:
好啦,第一个SpringBoot程序完成了,是不是比以前的开发简单快速很多呢?
四、静态资源访问
开发Web应用的时候,需要引用大量的js、css、图片等静态资源。Spring Boot默认提供静态资源目录位置需置于classpath下,目录名需符合如下规则:
/static
/public
/resources
/META-INF/resources
我们分别在如下位置添加两张图片
访问 http://127.0.0.1:8080/1.jpg 可以正常访问到图片,但是http://127.0.0.1:8080/2.jpg 会报404。
五、渲染Web页面
在动态HTML实现上Spring Boot依然可以完美胜任,并且提供了多种模板引擎的默认配置支持,所以在推荐的模板引擎下,我们可以很快的上手开发动态网站。
Spring Boot提供了默认配置的模板引擎主要有以下几种:
- Thymeleaf
- FreeMarker
- Velocity
- Groovy
- Mustache
Spring Boot建议使用这些模板引擎,避免使用JSP,若一定要使用JSP将无法实现Spring Boot的多种特性,具体可见后文:支持JSP的配置
当你使用上述模板引擎中的任何一个,它们默认的模板配置路径为:src/main/resources/templates。
1、使用FreeMarker:
①pom中引入依赖:
<!-- 引入freeMarker的依赖包. -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
②controller
package com.caofanqi.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/freemarker")
public class freemarkerController {
@RequestMapping("/hello")
public String helloFreeMarker(Model model){
model.addAttribute("hello","Hello,FreeMarker!");
return "hello";
}
}
③在/src/main/java/resources/templates中添加模板
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8" />
<title></title>
</head>
<body>
${hello}
</body>
</html>
④启动程序,访问http://127.0.0.1:8080/freemarker/hello 如下:
六、异常处理
自定义一个异常
/**
* 在自定义类上添加@ResponseStatus 可以将异常映射为Http状态码
*/
@ResponseStatus(code= HttpStatus.NOT_FOUND,reason = "my custom exception!!!")
public class MyNotFoundException extends RuntimeException {
}
1、单个Controller范围的处理,对于@ExceptionHandler注解标注的方法来说,它能处理同一个控制器中所有处理器方法抛出的指定异常。
2、全局Controller范围异常处理, 使用@ControllerAdvice编写控制器通知,它会处理所有带有@RequestMapping注解的处理器。
代码如下:
errorController:
package com.caofanqi.controller; import com.caofanqi.exception.MyNotFoundException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.HashMap; import java.util.Map; /** * 测试异常处理器 */ @RestController public class errorController { /** * 抛出MyNotFoundException异常 */ @RequestMapping(value = "/merror") public String testMError(){ throw new MyNotFoundException(); } /** * 抛出RuntimeException */ @RequestMapping(value = "/gerror") public String testGError(){ throw new RuntimeException("测试处理全局运行时异常"); } /** * 该方法会处理该Controller类中所有的MyNotFoundException异常 */ @ExceptionHandler(MyNotFoundException.class) public Map<String,Object> exceptionHandler(){ Map<String,Object> reason = new HashMap<>(); reason.put("errorCode","404"); reason.put("errorMsg","我自定义的404异常"); return reason; } }
全局异常处理通知:
package com.caofanqi.exception;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.HashMap;
import java.util.Map;
/**
* 异常通知类,该类可以包含多个带有@ExceptionHandler注解的方法,可以指定扫描范围。
*/
@ControllerAdvice
public class GlobalExceptionHandler {
@ResponseBody
@ExceptionHandler(RuntimeException.class)
public Map<String, Object> exceptionHandler() {
Map<String, Object> map = new HashMap<String, Object>();
map.put("errorCode", "10000");
map.put("errorMsg", "全局异常!");
return map;
}
}
注意:
- 同一个异常被局部范围异常处理器和全局范围异常处理器同时覆盖,会选择小范围的局部范围处理器
- 同一个异常被小范围的异常类和大范围的异常处理器同时覆盖,会选择小范围的异常处理器
项目源码:https://gitee.com/itcaofanqi/CaoFanqiStudyRepository/tree/master/stuspringboot/