學習記錄-邁向後端之路的Java菜雞

vincentxu
14 min readJan 8, 2024

--

全端開發一年多,對後端比較有興趣,經過職缺調查後,發現以三種語言為大宗,C# / Java / PHP,Java的教學資源比較多,也可以加了解OOP,國外職缺也比較多,就選Java囉。這邊簡單記錄一下學習Java的過程,邊學邊紀錄好像比較好,不然到後面都會懶惰就沒有留下記錄了。

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,就完成拉。

https://fullstack-frontend-ashen.vercel.app/

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套件

參考文章idea使用lombok不生效的解决办法

就可以順利看到底下的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來參考

spring-boot-react-blog

Spring-Boot-Blog-REST-API

blog-application-spring-boot-rest-api

ThoughtHub

API_for_blogWeb_SPRING-BOOT

spring-boot-tutorials-blog-series

react-spring-boot-blog

autentica-o-full-stack-postgreSQL-GoogleOAUTH2-Java-Spring-Boot-React-TS

SplitwiseAppClone

spring-boot-oauth2.0-google

medical-invoice-app

逛到一個有點猛的JAVA課程

in28minutes

測試

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 文件目錄
  • mvnwmvnw.cmd: 這是 Maven Wrapper 的腳本,用於在專案中使用 Maven 而無需手動安裝 Maven。
  • pom.xml: Maven 項目配置文件,其中包含專案的依賴項目、插件配置等信息。

Udemy : Java from Zero to First Job, Practical Guide, 2000+ examples

後來查了查,還是買了這門課,除了有project,也比較完整且涵蓋基礎知識,有時候覺得要自己東拼西湊,不如跟著一門課直接上完,會比較有效率。

型別認識

List of Java keywords

原來資料型態有大小之分,之前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

用一篇自我介紹的短文章來舉例,如何將名詞、動詞、形容詞做替換

--

--

vincentxu
vincentxu

Written by vincentxu

熱愛學習、戶外運動,關心教育,曾任公部門主計,教育工作者/軟體工程師_嘗試將科技與使用者經驗設計導入教育_共同創辦一個線上教育平台,推廣自主學習與民主教育https://www.daoedu.tw/

No responses yet