目錄
Spring Boot
其並不是對Spring功能上的增強,而是一種快速使用Spring的方式
Spring Boot特性
- 創建獨立的Spring應用程序
- 嵌入的Tomcat,無需部署WAR文件
- 簡化maven配置
- 自動配置Spring
- 提供生產就緒型功能,如指標,健康檢查和外部配置
- 開箱即用,沒有代碼生成,也無需XML配置。
三種創建方式
- 從官網創建
- idea腳手架創建
- maven創建
SpringBoot HelloWorld
1、POM文件
1.1 繼承
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.0.RELEASE</version>
<relativePath></relativePath>
</parent>
SpringBoot的父級依賴,只有繼承他項目纔是SpringBoot項目
1.2 依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.2.0.RELEASE</version>
</dependency>
包含了web開發的所有啓動器,打包依賴,這裏不必指定version,會遵從父級。
1.3 插件
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
spring-boot-maven-plugin插件是將springboot的應用程序打包成jar包的插件,將所有應用程序啓動運行所需的jar包都包含進來。
2、啓動類
其作用是啓動springboot項目(不同於啓動器),是基於main方法運行,啓動時會做註解掃描(@Controller、@Service....),掃描的位置是同包或者子包下的註解,所以啓動類的位置應放在包的根下。
/**
* 啓動類*/
//1、啓動類必須加這個註解
@SpringBootApplication
public class SpringBootTestApplication
{
public static void main(String[] args)
{
SpringApplication.run(SpringBootTestApplication.class,args);//2、必須要有
}
}
@SpringBootApplication和 SpringApplication.run(啓動類類名, args)是固定寫法,標識啓動類。
2.1 啓動類和啓動器區別
- 啓動類是一個class,是項目的啓動入口
- 啓動器是jar包的座標
3、啓動器
SpringBoot將所有的功能場景都抽取出來,做成一個個starter(啓動器),要用什麼功能就導入什麼場景,只需要在項目裏引入這些starter,相關場景的所有依賴都會導入進來,最終實現一站式開發。
其中spring-boot-starter是核心啓動器。一般官方啓動器命名格式spring-boot-starter-xx。
4、配置文件
SpringBoot提供一個名爲application的全局配置文件,支持兩種格式:properteis和YAML。兩種配置文件作用一樣,但是書寫格式不同。
4.1、properteis格式
比如配置內嵌的tomcat的監聽端口
server.port=8080
4.2、YAML格式
擴展名爲yaml或者yml。
server:
port:8080
4.3 存放位置
- 當前根目錄或者其下的config目錄中
- 項目的resourc或者其下的config目錄中
4.4 配置文件的加載順序
- 不同格式:properties格式高於yml,且同一屬性取最先讀取的,後面的不覆蓋前面的。
- 不同位置:項目根目錄/config > 根目錄 > reource/config > resource
4.5 配置文件中的佔位符
語法:${}
作用:
- 獲取框架提供的方法中的值,如random.int
- 獲取配置文件中的鍵的值賦給另一個鍵作爲值
server:
value:8080
port: ${server.value} //port:${random.int(1024-9999)}
4.6 bootstrap配置文件
SpringBoot有兩種上下文:
- bootstrap : 應用程序的上下文
- application
bootstrap是aplication的父對象,且加載優先級bootstrap > bootstrap。兩者共用一個環境
5、SpringBoot核心註解
5.1 @SpringBootApplication
是SpringBoot的啓動類,是很多註解的組合。
5.2 @SpringBootConfiguration
相當於Spring中的@Configuration,標註這個類是一個配置類。
5.3 @Configuration
通過對bean對象的操作替代spring中的xml文件。
5.4 @EnableAutoConfiguration
SpringBoot自動配置
5.5 @AutoConfigurationPackage
自動注入主類下所在包下所有的加了註解的類。
5.6 @Import
5.7 @ComponentScan
組件掃描,可自動發現和裝配一些bean。
5.8 @ConfigurationPropertiesScan
掃描配置屬性
6、SpringBoot在Controller中的常用註解
6.1 @RestController
相當於@Controller + @ResponsBody, 直接返回return的內容
6.2 @GetMapping
是@RequestMapping(method = RequestMethod.GET)的縮寫
6.3 @PostMapping
6.4 @PutMapping
6.5 @DeleteMapping
7、HelloWorld
1、創建一個maven工程
2、修改pom文件,引入依賴,變成SpringBoot項目
<?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>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.0.RELEASE</version>
<relativePath></relativePath>
</parent>
<groupId>xiaobin_springboot</groupId>
<artifactId>spring-boot-test</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
3、修改tomcat監聽端口
默認8080,也可以不修改,僅以此演示配置文件的使用。創建配置文件:
server.port=8080
4、創建啓動類
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* 啓動類*/
//1、啓動類必須加這個註解
@SpringBootApplication
public class SpringBootTestApplication
{
public static void main(String[] args)
{
SpringApplication.run(SpringBootTestApplication.class,args);//2、必須要有
}
}
5、創建Controller
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 處理請求controller*/
@RestController //@Controller + @ResponsBody 直接返回json串
public class HelloWorldController
{
@RequestMapping("/helloWorld")
public String showHelloWorld()
{
return "HelloWorld";
}
}
到此helloworld編寫完了。
啓動啓動類,出現下圖說明啓動成功
在瀏覽器鍵入http://localhost:8888/helloWorld,出現:
至此,第一個helloworld就成功了。
SpringBoot整合web層技術
1、整合Servlet方式一
通過註解掃描完成Servlet組件的註冊
1.1 創建Servlet
/**
* 整合Servlet方式一
* */
@WebServlet(name = "FirstServlet",urlPatterns = "/first")
public class FirstServlet extends HttpServlet
{
public void doGet(HttpServletRequest request, HttpServletResponse response)
{
System.out.println("第一個Servlet...");
}
}
1.2 修改啓動類
/**
* 啓動類*/
//1、啓動類必須加這個註解
@SpringBootApplication
@ServletComponentScan //在SpringBoot啓動時會掃描@WebServlet註解,並將該類實例化
public class SpringBootTestApplication
{
public static void main(String[] args)
{
SpringApplication.run(SpringBootTestApplication.class,args);//2、必須要有
}
}
在瀏覽器輸入http://localhost:8888/first即可在控制檯輸出"第一個Servlet...",即成功。
2、整合Servlet方式二
通過方法完成Servlet組建的註冊
2.1 創建Servlet
/**
* 整合servlet方式二
* */
public class SecondServlet extends HttpServlet
{
public void doGet(HttpServletRequest request, HttpServletResponse response)
{
System.out.println("第二個Servlet...");
}
}
2.2 創建Servlet配置類
//Servlet配置類,該方法也可以放到啓動類當中
@Configuration
public class ServletConfig
{
//完成Servlet組件的註冊
@Bean
public ServletRegistrationBean getServletRegistrationBean()
{
ServletRegistrationBean bean = new ServletRegistrationBean(new SecondServlet());
bean.addUrlMappings("/second");
return bean;
}
}
在瀏覽器輸入http://localhost:8888/first即可在控制檯輸出"第二個Servlet...",即成功。
3、整合Filter方式一
通過註解掃描完成Filter組件註冊
3.1 創建Filter
//整合Filter方式一
@WebFilter(filterName = "FirstFilter",urlPatterns = "/first")
public class FirstFilter implements Filter
{
public void destroy()
{
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException
{
System.out.println("進入Filter...");
chain.doFilter(req, resp);
System.out.println("離開Filter...");
}
public void init(FilterConfig config) throws ServletException
{
}
}
3.2修改啓動類
/**
* 啓動類*/
//1、啓動類必須加這個註解
@SpringBootApplication
@ServletComponentScan //在SpringBoot啓動時會掃描@WebServlet,@WebFilter註解,並將該類實例化
public class SpringBootTestApplication
{
public static void main(String[] args)
{
SpringApplication.run(SpringBootTestApplication.class,args);//2、必須要有
}
}
在瀏覽器鍵入http://localhost:8888/first,控制檯出現下圖則成功:
4、整合Filter方式二
通過方法完成Filter組件註冊
4.1 創建Filter
//整合Filter方式二
public class SecondFilter implements Filter
{
public void destroy()
{
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException
{
System.out.println("進入第二個Filter...");
chain.doFilter(req, resp);
System.out.println("離開第二個Filter...");
}
public void init(FilterConfig config) throws ServletException
{
}
}
4.2 創建Filter配置類
//Filter配置類
@Configuration
public class FilterConfig
{
@Bean
public FilterRegistrationBean getFilterRegistrationBean()
{
FilterRegistrationBean bean = new FilterRegistrationBean(new SecondFilter());
bean.addUrlPatterns("/second");
return bean;
}
}
5、整合Listener方式一
通過註解掃描
5.1 創建Listener
//整合Listener方式一
@WebListener
public class FirstListener implements ServletContextListener
{
public void contextDestroyed(ServletContextEvent event)
{
}
public void contextInitialed(ServletContextEvent event)
{
System.out.println("Listener 初始化...");
}
}
5.2 修改啓動類
/**
* 啓動類*/
//1、啓動類必須加這個註解
@SpringBootApplication
@ServletComponentScan //在SpringBoot啓動時會掃描@WebServlet,@WebFilter,@WebLisener註解,並將該類實例化
public class SpringBootTestApplication
{
public static void main(String[] args)
{
SpringApplication.run(SpringBootTestApplication.class,args);//2、必須要有
}
}
6、整合Listener方式二
通過方法,和前面組件類似,只不過不需要addUrl...不一一贅述。
SpringBoot訪問靜態資源
在項目目錄並沒有WebContent目錄,springboot默認在static下存放靜態資源,templates下存放動態頁面(推薦Thymeleaf)。
也可以自定義位置。
SpringBoot整合動態資源(Thymeleaf)
1、添加依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
2、創建Controller和Html
//頁面跳轉controller
@Controller
public class PageController
{
//頁面跳轉方法
@GetMapping("/show")
public String showPage(Model model)
{
model.addAttribute("msg","Hello Thymeleaf");
return "indexThymeleaf";
}
}
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<head>
<meta charset="UTF-8">
<title>XB</title>
</head>
<body>
<span th:text="你好XB"></span>
<hr>
<span th:text="${msg}"></span>
</body>
</html>
3、SpringBoot中配置Thymeleaf
spring.thymeleaf.prefix=classpath:/templates/ #默認路徑
spring.thymeleaf.suffix=.html
spring.thymeleaf.encoding=utf-8
SpringBoot 整合jdbc和mybatis
SpringBoot異常處理
五種處理方式
1、自定義錯誤頁面
如果要所有異常都跳轉到統一頁面則需要在src/main/resources/templates目錄下創建error.html(名稱必須爲error.html)
2、通過@ExceptionHandler註解處理異常
創建Controller
@Controller
public class UsersController
{
@RequestMapping("showInfo")
public String showInfi()
{//人爲製造異常
String str = null;
str.length();
return "ok";
}
//處理空指針異常
@ExceptionHandler(value = {NullPointerException.class})
public ModelAndView nullpointExceptionHandler(Exception e)
{
ModelAndView mv = new ModelAndView();
mv.addObject("err",e.toString());
mv.setViewName("error1"); //異常下跳轉
return mv;
}
}
3、通過@ControllerAdvice和@ExceptionHandler處理異常(全局處理)
這種方式異常和處理方法不必在同一類下
@ControllerAdvice
public class GlobalException
{
@ExceptionHandler(value = {NullPointerException.class})
public ModelAndView nullpointExceptionHandler(Exception e)
{
ModelAndView mv = new ModelAndView();
mv.addObject("err",e.toString());
mv.setViewName("error1.html");//異常下跳轉
return mv;
}
}
4、通過SimpleMappingExceptionResolver
處理類
@Configuration
public class GlobalException2
{
public SimpleMappingExceptionResolver getException()
{
SimpleMappingExceptionResolver resolver = new SimpleMappingExceptionResolver();
Properties properties = new Properties();
//參數1:異常全名 參數2:跳轉視圖
properties.put("java.lang.NullPointerException","error1");
properties.put("java.lang.NullPointerException","error2");
resolver.setExceptionMappings(properties);
return resolver;
}
}
5、通過HandlerExceptionResolver接口自定義異常處理類(最好)
@Configuration
public class GlobalException3 implements HandlerExceptionResolver
{
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
//必須實現該方法
ModelAndView mv = new ModelAndView();
//判斷不同類型異常
if(ex instanceof NullPointerException)
{
mv.setViewName("error1");
}
if(ex instanceof ArithmeticException)
{
mv.setViewName("error2");
}
mv.addObject("error", ex.toString());
return mv;
}
}
更新中......