文章目錄
- 發展歷程
- 項目創建
- 項目結構
- 入門案例
- 配置文件的兩種方式:只能使用一種
- 創建項目二
- 入門案例
- 常用知識及注解
- @Controller:類上面加,SpringMVC的注解
- @GetMapping:方法上面加
- Spring框架的兩項核心功能
- @Component:組件。控制反轉,加在業務類上面:比如SudentServiceImpl
- @Autowired:依賴注入:spring框架自動將容器中的實例,自動賦值給需要的類。是Spring的注解
- @Resource注解:依賴注入,不是Spring的注解
- @Component 和@Service,@Repository (倉儲),@Controller ,@RestController一樣,自動創建唯一實例
- @XXXMapping:用在方法上面
發展歷程
SpringBoot環節:主力,要掌握,熟練使用
發展歷程:
之后同一期出現的三種:
SSH1:
servlet+jsp,這是初級階段。mvc三層架構。m:model,v:view,c:controller
struct 1.0 起初解決mvc 擴展名為.do的網站
spring 1.0:專注于幫程序員創建對象(程序員new對象容易失控)。單例對象(只創建一次對象就行了,屬性類沒有必要重復使用)
hibernate 1.0 :orm關系映射。將數據庫中的結果集轉換為Java對象,無需自己寫sql。
之后發展:
SSH2:
struct 2.0 .action擴展名
spring 2.0 加入aop功能,面向切面功能
mybaits:orm 輕量級,需要程序員自己寫sql
hibernate 2.0+
SSM:需要使用xml配置
springMVC:解決MVC,替代struct2.0。容易
Spring 3.0+ 增加更多功能,模塊化
mybaits 3.0+ 替代hibernate
微服務:把一個大項目拆分成小的項目,然后根據需要進行整合。(例如:微信上面的小程序)規模小。
SprigBoot:不是一個框架。是一個快速開發腳手架。快速開發,在一定程度上限制了自由性。有固定的目錄結構,有約定俗成的配置。約定大于配置(配置越少越好,快速開發)。SpringBoot用于整合SSM。
項目創建
項目創建完成后首先檢查編碼,配置maven
項目結構
xml配置文件說明:
以spring-boot-starter開頭的包,叫啟動器。對項目進行自動化配置。
<?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 https://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>3.4.8</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.situ</groupId><artifactId>demo01</artifactId><version>0.0.1-SNAPSHOT</version><name>demo01</name><description>demo01</description><properties><java.version>21</java.version></properties><dependencies><!-- thymeleaf啟動器--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency>
<!-- SpingMVC啟動器--><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></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
入門案例
根包。所有的自己寫的java部分寫在根包下:約定大于配置
主啟動類。
在類上面加上Controller表示這個類是一個控制器類。
在方法上加上GetMapping注解表示這個方法可以接收請求,指定請求的路徑。
如果方法上面不加GetMapping注解表示這個方法就是普通方法。
package com.situ.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;@Controller//表明這是一個控制器類
public class HelloWorldController {@GetMapping("/hello")//方法的路徑public String hello(){System.out.println("hello");return "hello";}
}
<!doctype html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport"content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Document</title>
</head>
<body>
<p>你好</p></body>
</html>
啟動:
配置文件的兩種方式:只能使用一種
創建項目二
創建的時候加入:
以spring-boot-starter開頭的包,叫啟動器。對項目進行自動化配置。
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies>
入門案例
根包。所有的自己寫的java部分寫在根包下:約定大于配置
主啟動類。
在類上面加上Controller表示這個類是一個控制器類。
在方法上加上GetMapping注解表示這個方法可以接收請求,指定請求的路徑。
如果方法上面不加GetMapping注解表示這個方法就是普通方法。
list.html:
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>學生信息列表頁面</title>
</head>
<body><h1>學生信息列表頁面</h1><table><thead><tr><th>姓名</th><th>性別</th><th>出生日期</th></tr></thead></table></body>
</html>
結果展示:
常用知識及注解
@Controller:類上面加,SpringMVC的注解
在類上面加上Controller表示這個類是一個控制器類。
@GetMapping:方法上面加
在方法上加上GetMapping注解表示這個方法可以接收請求,指定請求的路徑。
如果方法上面不加GetMapping注解表示這個方法就是普通方法。
Spring框架的兩項核心功能
控制反轉: Spring:將創建對象的權限交給spring框架,稱之為控制反轉 Inverse Of Control 簡稱ioc
依賴注入:Spring框架自動將容器中的實例,自動賦值給需要的類,DI
@Component:組件。控制反轉,加在業務類上面:比如SudentServiceImpl
Spring:將創建對象的權限交給spring框架,稱之為控制反轉。Inverse Of Control,簡稱Ioc。
加上這個注解,spring在啟動的時候會自動掃描根包下面的所有帶這個注解的類,如果發現就會創建唯一實例(控制反轉),是單例的
創建出來的唯一實例放在了哪里?創建出來了如何獲取?
手動獲取:
創建出來的唯一實例放在了容器對象里面, 然后將容器對象放在全局域中:
package com.situ.controller;
import com.situ.model.Student;
import com.situ.service.StudentService;
import jakarta.servlet.ServletContext;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import java.util.List;
import java.util.Map;@Controller//控制器類
public class StudentController {private StudentService studentService;@GetMapping("/student/list")//訪問路徑,能夠接收請求。public String list(Map<String, Object> map, HttpServletRequest request){//這個方法只能使用反射的方式調用:因為參數可以加,不確定多少個//手動獲取實例:ServletContext ctx = request.getServletContext();//全局域//spring的應用上下文對象。容器 。創建的唯一實例會放在容器里面,然后放在全局域中:ApplicationContext ac = WebApplicationContextUtils.findWebApplicationContext(ctx);studentService = ac.getBean(StudentService.class);//取出指定類型的唯一實例List<Student> students = studentService.findAll();//調用方法:map.put("students", students);//放到請求域中:底層自動進行參數校驗return "student/list";//return就是請求轉發,請求轉發到templates下面的student/list文件}
}
但是手動獲取比較麻煩,所以出現了依賴注入:
@Autowired:依賴注入:spring框架自動將容器中的實例,自動賦值給需要的類。是Spring的注解
依賴關系:實現類實現接口,實現類就依賴于這個接口。讓Spring去解決依賴關系。
依賴注入的三種方式:
1.字段注入:加在字段上面,不推薦使用,不方便測試
@Autowiredprivate StudentService studentService ;
2.setter注入
@Autowiredpublic void setStudentService(StudentService studentService) {this.studentService = studentService;}
3.構造器注入
構造器注入可以省略Autowired注解
@Autowired //構造器注入可以省略此行注解public StudentController(StudentService studentService){this.studentService= studentService;}
@Autowired
1.默認按類型匹配 使用頻率比較高
當有多個實現類匹配時,可以使用@Primary注解表示優先
2.按名稱匹配:需要搭配 @Qualifier()注解,同時指定Bean的名稱,bean名稱可以在@Component(“i2”)中指定,要是括號中不指定,則默認以類名(首字母小寫)為bean名稱
@Resource注解:依賴注入,不是Spring的注解
也是依賴注入
1.默認按名稱注入 按name值
@Resource(name = "i1")
2.按類型注入:通過type屬性
@Component 和@Service,@Repository (倉儲),@Controller ,@RestController一樣,自動創建唯一實例
其中,@RestController 是Controller的別名,
@Controller 和@RestController還會被識別出控制器,是不同于上面的額外作用。@Controller 和@RestController一般不用于創建唯一實例。
他們都是自動創建唯一實例的,但是 @Component 比較中性,不能見名知意。所有我們在Servcie層一般使用@Service,在Dao層數據處理層一般使用@Repository創建唯一實例
創建唯一實例:
注入依賴:
@XXXMapping:用在方法上面
在Controller中,一個方法只有指定@XXXMapping,才能接收請求。如果一個方法上面不加注解,那么他就是一個普通方法。
常見方式:
@GetMapping 接收get類型的請求
@PostMapping 接收post類型的請求
@PutMapping 接收put類型的請求
@PatchMapping 接收patch類型的請求
@DeleteMapping 接收delete類型的請求
@RequestMapping:接收任意類型的請求,但可以手動指定請求類型。
produces屬性指定響應內容的類型。
@RequestMapping(value = "/student/list",method = RequestMethod.GET)
@XXXMapping也可以添加到類上面:添加到類上,表示所有方法以類上定義的方法作為公共前綴。表示全局統一定義。@GetMapping("/student/list")
參數:是通過反射調用的,數量,順序可以任意。
1.可以HttpServletRequest,HttpSerlvetResponse,HttpSession
2.基本數據類型,以及包裝類,BigDecimal,BigInteger,String。用于接收請求中的參數。
搭配 @RequstParam注解、搭配@PathVariable注解(路徑變量)。通過這個注解可以指定獲取參數和傳輸參數名字不一樣的情況。這兩個都是定義在參數位置上的。
3.javabean,普通類。將請求參數通過反射,設置到javabean實例中。即Spring會自動映射,獲取參數,轉類型、賦值一系列全部搞定。
4.Map,Model,ModelMap:充當請求域。map最常用。
5.加@RequestParam注解的map,此map不再作為請求域,而是用于存儲請求參數。
6.以上類型的任意組合。
map:
返回值:
1.當返回的是字符串且響應內容類型為text/html,返回值即模板文件名。在滿足1的基礎上,返回"forword:/xxx",表示請求轉發。在滿足1的基礎上,返回"redirect:/xxx",表示重定向。
2.ModelAndView:即可以指定視圖名稱,同時可以當請求域使用。前三種本質上也會被包裝成ModelAndView
3.如果指定響應內容類型為josn,并且添加了@ResponseBody注解,無論返回值是什么類型,都會序列化成json字符串。
4.返回ResponseEntity類型,僅限于響應json格式。同時封裝了業務數據,以及響應的狀態碼。