# 項目初始化
Spring官方為我們提供了非常簡單的初始化器:[https://start.spring.io](https://start.spring.io/)

2.1.8為版本號,Goup一般寫自己擁有的域名,目的是防止沖突。Artifact為項目標識,在同一個Group下該名稱應該唯一,目的也是防止沖突。在Dependencies(依賴)中,我們輸入`web`后,在彈出的選項中選擇第1個`Spring Web`并點擊右方的`+`完成添加。

最后點擊`Generate the project 生成項目`將其下載的任意自己喜歡的文件夾,下載成后解壓:

Spring在推出最新的穩定的版本后,2.1.8版本將被最新的版本替換。為和教程達到一致,請[點擊下載](https://yunzhiclub.github.io/springAndAngularGuide/helloWorld.zip)教程對應版本。
# 使用命令行啟動項目
打開`shell`并進行到項目文件夾,比如:
```
panjiedeMac-Pro:springBootStudy panjie$ cd helloWorld
panjiedeMac-Pro:helloWorld panjie$ ls
HELP.md mvnw mvnw.cmd pom.xml src
```
*****
windows中使用`dir`來替待`ls`命令。如果想在windows中使用`unix`命令,可以參考[此文章](http://www.hmoore.net/yunzhiclub/thinkphp5guide/169733)來安裝`git`客戶端。
*****
執行`mvn spring-boot:run`命令來啟動程序,此時`maven`將自動的為我們下載`spring boot`所依賴的其它包,下載成功后自動啟動程序。當出現以下字樣時表示啟動成功:
```
2019-09-19 09:44:40.169 INFO 10164 --- [ main] c.y.helloWorld.HelloWorldApplication : Started HelloWorldApplication in 2.11 seconds (JVM running for 96.448)
```
>[info] 和`npm`一樣`maven`也依賴于較好的網絡環境,如果在下載包的過程中,發生了超時或是其它異常情況,大多是由于網絡原因造成的,則請參閱本節第5小節 ---- maven國內源配置。
使用`Ctrl-C`終止程序后(直接關閉shell也是可以的)我們繼續學習。
>[info] 在實際的開發過程中往往為節電腦資源及系統啟動時間,在開發前臺時我們會使用命行的形式來啟動后臺。
# 在idea中啟動項目
下面將展示如何使用IDEA來啟動`Spring Boot`項目。
打開IDEA,點擊`open`按鈕并選擇項目目錄下的`pom.xml`文件。


選擇`Open as Project` **\[很重要\]**

IDEA接下來會進行一些初始化的操作,比如進行項目索引,下載`maven`管理的包等。時間的長知取決于使用電腦的CPU頻率(與核心數無關)及網絡速度。初始化完成后,我們便可以點擊右上方的運行按鈕來啟動項目了。

*****
如果發生了如下錯誤:
```
*************************
APPLICATION FAILED TO START
***************************
Description:
The Tomcat connector configured to listen on port 8080 failed to start. The port may already be in use or the connector may be misconfigured.
Action:
Verify the connector's configuration, identify and stop any process that's listening on port 8080, or configure this application to listen on another port.
2019-09-19 10:03:24.468 INFO 26811 --- [ main] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor'
Process finished with exit code 1
```
則說明端口8080被占用了,請參考上一小節最后的內容,關閉命令行啟動的程序后重新點擊啟動按鈕。
*****
系統成功啟動后,控制臺如下:
```
2019-09-19 10:07:46.574 INFO 30351 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2019-09-19 10:07:46.577 INFO 30351 --- [ main] c.y.helloWorld.HelloWorldApplication : Started HelloWorldApplication in 1.535 seconds (JVM running for 2.016)
```
簡單解釋一下:
```
2019-09-19 10:07:46.574(574是ms 毫秒) 一般日志 進程號30351 [main線程]地球.中國.天津.河北工業大學.embedded.tomcat.TomcatWebServer : Tomcat服務于8080端口,上下文路徑為''
2019-09-19 10:07:46.577 一般日志 進程號30351 --- [main線程] 團隊.云智.helloWorld.HelloWorldApplication : 啟動HelloWorld應用程序花費了1.545秒(JVM已運行2.016秒)
```
>[success] `單位`: 小學時我們學過dm,cm,mm分別代表分米、厘米、毫米。所以`d`,`c`,`m`分別代表:`分`、`厘`、`毫`,即`0.1`, `0.01`, `0.001`。
> `日志等級`: 分為`error`錯誤,`warning`警告,`info`一般信息,`debug`調試信息,`trace`追蹤執行。
點擊停止按鈕終止程序運行:

- 序言
- 第一章:Hello World
- 第一節:Angular準備工作
- 1 Node.js
- 2 npm
- 3 WebStorm
- 第二節:Hello Angular
- 第三節:Spring Boot準備工作
- 1 JDK
- 2 MAVEN
- 3 IDEA
- 第四節:Hello Spring Boot
- 1 Spring Initializr
- 2 Hello Spring Boot!
- 3 maven國內源配置
- 4 package與import
- 第五節:Hello Spring Boot + Angular
- 1 依賴注入【前】
- 2 HttpClient獲取數據【前】
- 3 數據綁定【前】
- 4 回調函數【選學】
- 第二章 教師管理
- 第一節 數據庫初始化
- 第二節 CRUD之R查數據
- 1 原型初始化【前】
- 2 連接數據庫【后】
- 3 使用JDBC讀取數據【后】
- 4 前后臺對接
- 5 ng-if【前】
- 6 日期管道【前】
- 第三節 CRUD之C增數據
- 1 新建組件并映射路由【前】
- 2 模板驅動表單【前】
- 3 httpClient post請求【前】
- 4 保存數據【后】
- 5 組件間調用【前】
- 第四節 CRUD之U改數據
- 1 路由參數【前】
- 2 請求映射【后】
- 3 前后臺對接【前】
- 4 更新數據【前】
- 5 更新某個教師【后】
- 6 路由器鏈接【前】
- 7 觀察者模式【前】
- 第五節 CRUD之D刪數據
- 1 綁定到用戶輸入事件【前】
- 2 刪除某個教師【后】
- 第六節 代碼重構
- 1 文件夾化【前】
- 2 優化交互體驗【前】
- 3 相對與絕對地址【前】
- 第三章 班級管理
- 第一節 JPA初始化數據表
- 第二節 班級列表
- 1 新建模塊【前】
- 2 初識單元測試【前】
- 3 初始化原型【前】
- 4 面向對象【前】
- 5 測試HTTP請求【前】
- 6 測試INPUT【前】
- 7 測試BUTTON【前】
- 8 @RequestParam【后】
- 9 Repository【后】
- 10 前后臺對接【前】
- 第三節 新增班級
- 1 初始化【前】
- 2 響應式表單【前】
- 3 測試POST請求【前】
- 4 JPA插入數據【后】
- 5 單元測試【后】
- 6 惰性加載【前】
- 7 對接【前】
- 第四節 編輯班級
- 1 FormGroup【前】
- 2 x、[x]、{{x}}與(x)【前】
- 3 模擬路由服務【前】
- 4 測試間諜spy【前】
- 5 使用JPA更新數據【后】
- 6 分層開發【后】
- 7 前后臺對接
- 8 深入imports【前】
- 9 深入exports【前】
- 第五節 選擇教師組件
- 1 初始化【前】
- 2 動態數據綁定【前】
- 3 初識泛型
- 4 @Output()【前】
- 5 @Input()【前】
- 6 再識單元測試【前】
- 7 其它問題
- 第六節 刪除班級
- 1 TDD【前】
- 2 TDD【后】
- 3 前后臺對接
- 第四章 學生管理
- 第一節 引入Bootstrap【前】
- 第二節 NAV導航組件【前】
- 1 初始化
- 2 Bootstrap格式化
- 3 RouterLinkActive
- 第三節 footer組件【前】
- 第四節 歡迎界面【前】
- 第五節 新增學生
- 1 初始化【前】
- 2 選擇班級組件【前】
- 3 復用選擇組件【前】
- 4 完善功能【前】
- 5 MVC【前】
- 6 非NULL校驗【后】
- 7 唯一性校驗【后】
- 8 @PrePersist【后】
- 9 CM層開發【后】
- 10 集成測試
- 第六節 學生列表
- 1 分頁【后】
- 2 HashMap與LinkedHashMap
- 3 初識綜合查詢【后】
- 4 綜合查詢進階【后】
- 5 小試綜合查詢【后】
- 6 初始化【前】
- 7 M層【前】
- 8 單元測試與分頁【前】
- 9 單選與多選【前】
- 10 集成測試
- 第七節 編輯學生
- 1 初始化【前】
- 2 嵌套組件測試【前】
- 3 功能開發【前】
- 4 JsonPath【后】
- 5 spyOn【后】
- 6 集成測試
- 7 @Input 異步傳值【前】
- 8 值傳遞與引入傳遞
- 9 @PreUpdate【后】
- 10 表單驗證【前】
- 第八節 刪除學生
- 1 CSS選擇器【前】
- 2 confirm【前】
- 3 功能開發與測試【后】
- 4 集成測試
- 5 定制提示框【前】
- 6 引入圖標庫【前】
- 第九節 集成測試
- 第五章 登錄與注銷
- 第一節:普通登錄
- 1 原型【前】
- 2 功能設計【前】
- 3 功能設計【后】
- 4 應用登錄組件【前】
- 5 注銷【前】
- 6 保留登錄狀態【前】
- 第二節:你是誰
- 1 過濾器【后】
- 2 令牌機制【后】
- 3 裝飾器模式【后】
- 4 攔截器【前】
- 5 RxJS操作符【前】
- 6 用戶登錄與注銷【后】
- 7 個人中心【前】
- 8 攔截器【后】
- 9 集成測試
- 10 單例模式
- 第六章 課程管理
- 第一節 新增課程
- 1 初始化【前】
- 2 嵌套組件測試【前】
- 3 async管道【前】
- 4 優雅的測試【前】
- 5 功能開發【前】
- 6 實體監聽器【后】
- 7 @ManyToMany【后】
- 8 集成測試【前】
- 9 異步驗證器【前】
- 10 詳解CORS【前】
- 第二節 課程列表
- 第三節 果斷
- 1 初始化【前】
- 2 分頁組件【前】
- 2 分頁組件【前】
- 3 綜合查詢【前】
- 4 綜合查詢【后】
- 4 綜合查詢【后】
- 第節 班級列表
- 第節 教師列表
- 第節 編輯課程
- TODO返回機制【前】
- 4 彈出框組件【前】
- 5 多路由出口【前】
- 第節 刪除課程
- 第七章 權限管理
- 第一節 AOP
- 總結
- 開發規范
- 備用