YT影片:Java Basics — Crash Course
簡單心得 — 透過基礎的介紹,認識一下編輯器IntelliJ跟常用的語法,除了口音是印度腔之外,無可挑剃!簡單易懂,看影片的時候都在用已經熟悉的JS來類推Java的用法,覺得還蠻有趣的。
第一次接觸強型別的語言,蠻新鮮的,雖然有稍微摸過TS,但平常開發跟工作專案都沒有使用,不是很熟悉,感覺如果寫習慣的話,好像也不會太麻煩?
物件導向的部分,由於在工作的專案上,大多數都是用class的寫法,也稍微有接觸一點,適應起來還算可以。
YT影片:Full Stack Spring Boot and React CRUD 1.5 hours Course | Full Stack Web App | MySQL | Hibernate
簡單心得 — 根據之前的學習經驗,決定直接找簡單的專案CRUD熟悉,會比較有成就感,先選了一個影片比較短的來看看。
小亂流-免費仔需要自己設定Config
參考文章:How to run Spring Boot Applications on IntelliJ IDEA For Free?
DB用之前Docker建好的MySQL
DB 圖像操作介面GUI 用工作上常用的Dbeaver
前端CLI工具用vite
其餘都照著教學操作
蠻有成就感的,對Spring Boot CRUD有個概念了,都用node.js的經驗類推,套件引入方式、檔案擺放位置不太一樣,語法有些差異,但原則跟node.js開發上差不多。
意外地複習React一波,好久沒有用React-router-dom,工作上的專案UI 框架用bootstrap,有種熟悉感。
想說部署上雲端,放上作品集先擋一下,在完成攀岩網站改版前,沒想到Java後端不能直接在vecel部署,真是大驚。
查了關鍵字java spring boot deploy,發現有render的部署教學,竟然是用docker,真是太酷了。
DEPLOY SPRING BOOT NO RENDER
另外有使用到MySQL,找到一個網站可以線上使用的MySQL資料庫
Create Free MySQL Database Online
部署完,重新修改前後端URL,就完成拉。
YT教學:Spring Boot 3 + Spring Security 6 — JWT Authentication and Authorisation [NEW] [2023]
用到一個蠻特別的語法Enum
目前理解有點像是Js的Map,是一種類似Key-Value Pair的物件的樣子,或是資料結構中的hash table雜湊表。
可以使用Enum去做資料存取,影片範例是用來做權限角色分類,用法是全大寫。
有前輩推薦一個Enum文章:深度挖掘Java列舉(enum)
User.builder()一直讀取不到,後來高人指點是沒有裝lommbok套件
就可以順利看到底下的builder囉
跟著教學後,Security config一直沒有生效,請大神們debug後,壓縮程式碼給大神們測試,是可以正常生效的。最後清除IDEA快取後,會自動重新開啟IDEA,就可以使用了。
專案練習法
用自己的專案來跟著操作CRUD,目前規劃把攀岩網站的後端改成用Java開發,原本是用Firebase的BAAS來實現後端跟資料庫功能。
待開發的功能
- 一般登入
- 第三方登入google\line
- 個人資料:新增、讀取、更新、刪除
- 小人物誌:新增、讀取、更新、刪除
- 文章 : 新增、讀取、更新、刪除
- 攀岩場:新增、讀取、更新、刪除
- log紀錄
- Swagger
- 單元測試
資料庫目前計劃用MySQL,網站跟DB部署用zeabur
嘗試練習的過程,第一個遇到的亂流
安裝了一個dependency Java-security
這是一個奇妙的dependency,等等就會知道。
在我跟著前面的教學還有chatgpt的協助下,建立了一個Articles的API,正當我開心的要來用postman測試時,悲劇就上演了。
401 Unauthorized!!!
我沒印象有設置auth啊?這是哪來的,對照之前練習的專案,程式碼都沒有太大差異,最後對照dependency,把沒有一樣的刪了,但還是一樣。
而且打開http://localhost:8080,還出現了這個頁面,會自動導向/login
貼log給cahtgpt,給的建議是要去檢查有哪邊設置auth,此路不通。
最後google關鍵字SpringBoot 401 UnAuthorized ,找到這篇SpringBoot 401 Unauthorized问题,答案揭曉…就是Java-security…
才意外發現原來Java spring boot 會自動執行dependency,即便我沒有引用…
原本以為刪掉就好了,但還需要在資料上點選Rebuild Module,才會重新載入設定。
亂流二
測試API,內容輸入中文,MySQL資料庫無法讀取,最後發現需要將資料欄位格式改成UFT-8,就可以存中文字。
開發的紀錄
使用者跟文章的CRUD已經完成了,還差小人物誌跟攀岩場,不過不急先往後放,參考YT教學:Full Stack Spring Boot and React CRUD 1.5 hours Course | Full Stack Web App | MySQL | Hibernate
研究登入功能,看起來會用到Spring Boot Security,目前有點頭昏,因為這個套件預設就是一大包,有很多規則要理解,最後順利完成拉,參考YT教學:Spring Boot 3 + Spring Security 6 — JWT Authentication and Authorisation [NEW] [2023]
另外找了github上幾個類似的source code來參考
blog-application-spring-boot-rest-api
spring-boot-tutorials-blog-series
autentica-o-full-stack-postgreSQL-GoogleOAUTH2-Java-Spring-Boot-React-TS
逛到一個有點猛的JAVA課程
測試
YT影片:JUnit Tests: How To Write JUnit Test Case With Examples | Writing first JUnit test
YT影片:Java Unit Testing with JUnit — Tutorial — How to Create And Use Unit Tests
YT影片:Spring Boot Unit Testing REST APIs Tutorial
Java常見的測試套件是Junit,在node.js有寫過測試,感覺蠻類似的,一直都覺得難的不是寫測試,是想測試的case,還有模擬的資料。
資料夾結構
spring-boot-project
|-- src
| |-- main
| | |-- java
| | | |-- com
| | | | |-- example
| | | | | |-- myproject
| | | | | | |-- controller
| | | | | | |-- model
| | | | | | |-- repository
| | | | | | |-- service
| | | |-- resources
| | | | |-- static
| | | | |-- templates
| | | | |-- application.properties (or application.yml)
| |-- test
| | |-- java
| | | |-- com
| | | | |-- example
| | | | | |-- myproject
|-- target
|-- mvnw
|-- mvnw.cmd
|-- pom.xml
src
: 存放主要程式碼的目錄。main
: 目錄包含主要的程式碼。java
: Java程式碼根目錄。com/example/myproject
: 專案結構標準目錄。controller
: 存放控制器類別。model
: 存放實體類別或資料模型。repository
: 存放資料存取層的類別。service
: 存放業務邏輯層的類別。resources
: 存放非 Java 程式碼的資源文件。static
: 存放靜態資源文件,例如 CSS、JavaScript、圖片等。templates
: 存放模板文件,用於 Spring MVC 的視圖層。application.properties
(或application.yml
): 存放應用程式的配置文件,包含各種配置屬性。test
: 這個目錄包含測試程式碼。java
: 測試用的 Java 源代碼文件。com/example/myproject
: 測試程式碼的目錄結構,與主程式碼的結構相對應。target
: 這是用於存放編譯後的類別文件和打包後的 JAR 文件目錄mvnw
和mvnw.cmd
: 這是 Maven Wrapper 的腳本,用於在專案中使用 Maven 而無需手動安裝 Maven。pom.xml
: Maven 項目配置文件,其中包含專案的依賴項目、插件配置等信息。
Udemy : Java from Zero to First Job, Practical Guide, 2000+ examples
後來查了查,還是買了這門課,除了有project,也比較完整且涵蓋基礎知識,有時候覺得要自己東拼西湊,不如跟著一門課直接上完,會比較有效率。
型別認識
原來資料型態有大小之分,之前JS都沒這麼注意型態。
Java的資料型態有Cache緩存機制,在Integer/Long/Short/Byte這四個wrapper class包裝的類別,有各自pool, 數值在-128 to 127,會是存在stack,這時候做一樣的資料做型別判斷會是相等的,但如果超過的話,是存在heap,就是參考值,一樣的資料做型別判斷會是不相等的。String 也有pool,String 存在stack,New String是存在heap,判斷同上。
SOLID原則
Single Responsibility Principle
一個class只負責一種任務
Ooen/Closed Principle
運用abstract/interface實現對擴展開放,對修改封閉
Liscov Substitution Principle
父子層calss與子層class結構與目的要相同,如果繼承後method 名字雖然一樣,但要達到的目的在子層被改掉,這樣就違反原則。
Interface Segregation Principle
建立需要的interface,避免依賴不需要使用的interface
Dependency Inversion Principle
calss之間引用依賴於abstract/interface,而不是實作功能
Coursera課程 : Java Programming and Software Engineering Fundamentals
因為看到course 5 recommend system推薦系統很有興趣,但算了算實在太花時間,決定暫時擱置,之後再來看。
差3個小時忘了取消訂閱,被扣款了,決定還是把它看完,用一個月的時間,現在想想也是蠻有趣的,免費的課程不一定會想看完,但已經付錢的課程,卻會想看完。
Course 1 Programming Foundations with JavaScript, HTML and CSS
這門課是前端基礎,目前覺得蠻有趣的是用圖片操作來做範例,而且整個course的主題跟題目範例都圍繞在圖片、圖像、色彩操作。
另外程式碼教學都是使用var,不知道是不是錄製的教學年代久遠,沒有跟著更新,後來發現年代相當久遠是2015年。
Course 2 Java Programming: Solving Problems with Software
蠻大的收穫是對algorithm的看法不一樣了,一開始一直覺得algorithm演算法就應該是很複雜、很有名的那些才稱得上演算法,沒想到就是簡單的字串處理、CSV資料處理,都叫做algorithm。
week1
主題是以point與圖形作為題目與範例
介紹基礎觀念
- 學習資源、學習技巧、如何有效提問、物件導向簡介
- 語法介紹 : 變數型態、數學運算符號、函式、if else、class、型別、for each 迴圈
- 解決程式問題的七步驟
week2
主題是以gene基因作為題目與範例
介紹Strings
string position
string buildt-in method :substring\indexOf
build an algorithm to find genes
week3
主題CSV處理
csv
格式轉換Integer.parseInt
null type:null
primitive type 不可以是null
object type 可以是null
refactor 重複的程式碼,獨立出來給其他method共用
week4
主題mini project - baby name/grayscale image
讀取csv 檔案,針對資料做計算
讀取照片檔案,將照片改成灰階,並重新命名儲存成新檔案
Course 3 Java Programming: Arrays,Lists,and Structured Data
week1
介紹加解密的歷史,透過簡單的加解密來操作,使用Caesar Cipher當作範例,將訊息使用陣列與字串操作,透過Caesar Cipher規則作轉換,蠻有趣的。
透過前面的實際範例來介紹OOP
week2
用一篇自我介紹的短文章來舉例,如何將名詞、動詞、形容詞做替換