[Java] Java / Spring Boot Web 開發環境與語言架構指南

安裝 | Quick Start | Package套件管理 | Logging | 開發工具 | Spring Boot Web | 部署 | Template Engine | Concurrency | Appendix

Intro

Java programming language

JVM

JVM (Java Virtual Machine - Java虛擬機),能夠執行Java位元組碼且以堆疊結構機器實做的虛擬機器。它有自己的硬體架構,如處理器、堆疊、暫存器等,還具有相應的指令系統。
JVM 封鎖了與具體作業系統平台相關的資訊,使得Java程式只需生成在 JVM 上執行的目的碼(位元組碼),就可以在多種平台上執行。通過對中央處理器(CPU)所執行的軟體實作,實現能執行編譯過的Java程式碼 (Applet與應用程式)。

(References: Wikipedia & JVM Architecture Diagram)


JRE & JDK安裝

1. 安裝JRE:

# Ubuntu
$ sudo apt install default-jre

驗證JAVA版本:

$ java -version

2. 安裝JDK (一般會包含JRE)

Oracle JAVA (JRE/JDK) Download

# Ubuntu
$ sudo apt install default-jdk

使用JAVAC驗證版本:

$ javac -version

管理與選擇JAVA版本

若有安裝不同版本JAVA則可以透過update-alternatives指令選擇預設版本:

$ sudo apt install openjdk-{version}-jdk openjdk-{version}-jre

$ sudo update-alternatives --config java
$ sudo update-alternatives --config javac

Java version history Table


Quick Start

HelloWorld編譯測試

測試撰寫一支HelloWorld.java檔案以供編譯:

public class HelloWorld {
    public static void main (String[] args) {
        System.out.printf("Hello World");
    }
}

使用javac指令編譯該程式檔案:

$ javac HelloWorld.java

使用java執行編譯產生出來的Class(HelloWorld.class)名稱:

$ java HelloWorld

常用函數

System.out.println("HelloWorld");
System.exit(0);

語言特性

  • Java class main() method: JVM 啟動調用 class 預設呼叫的 method,故須為 public。

  • Command-Line Arguments: main() 的 arguments 可透過 command line 帶入,IDE 則設定 Run/Debug Configuration for Application 時可設定 arguments。


JAVA Package套件管理

Maven Central Repository

Maven Dependencies - Wiki

POM.xml - MVN 套件設定檔

Maven Central支援多種Dependency工具,對應工具的安裝方法可以參考官網,例如套件:org.apache.httpcomponents.client5:httpclient5:5.1

Namespace 規則:{Group ID/Artifact ID}:{Package name} (與 Github 無關聯)

Maven Project

Apache Maven - Wiki

Maven專案使用專案物件模型(Project Object Model,POM)來組態。 專案物件模型儲存在名為 pom.xml 的檔案中。

Maven 專案 user setting file 設定可以參考:Settings Reference - Maven

Gradle

Gradle - Wiki

Gradle是一個基於Apache Ant和Apache Maven概念的專案自動化建構工具,預設來源套件庫一樣使用mavenCentral()

可以透過安裝並指令執行Gradle以建立專案,或直接用IDE建立: Building Java Applications Sample

手動安裝 Gradle

透過修改build.gradle設定dependencies,完成後 Load Gradle Changes 時即會更新套件:Managing Dependencies of JVM Projects


Logging

Java built-in java.util.logging


Config / Properties

Confidential Properties

如果為 confidential Properties

  1. .gitignore 加入要載入的檔案 path/to/credential.properties
  2. 另外可以建立 path/to/credential-sample.properties 作為 Preperties 範例檔

開發工具 (JetBrains - IntelliJ IDEA)

Create New Project (建立全新專案)

Project JDK 版本請選擇環境上所偵測到的 JAVA 路徑。 以及選擇 build system (如 Maven 和 Gradle) 建立專案進行撰寫與執行輸出即可。

Spring Boot Web

Spring Boot 也可以搭配 IntelliJ IDEA Community 版本開發,可以利用線上版 Spring Initializr 產生下載 Project 檔案以供匯入專案進行開發。

Spring Quick Start: https://spring.io/quickstart

Dependencies 選擇 Spring Web (org.springframework.boot:spring-boot-starter-web)

匯出 zip 檔解包後,將資料夾使用 IntelliJ Open project,進入後會自動 Build Project, Project 完成可用後可以從左側導覽列點進資料夾路徑src/main/java/{project-domain}找 Application 檔案右鍵執行Run來測試啟動 Spring Boot Web, 可以看到預設會在localhost:8080上啟動服務(Tomcat initialized with port(s): 8080 (http))。

若要自建 Spring Boot Web 專案,主要需要依照專案添加 Spring Boot Build Tool Plugins 後,再引入套件 org.springframework.boot:spring-boot-starter-web,之後參考 Spring Quick Start 建出 Application 啟動點。

Controller 建立

Spring Initializr 專案預設沒有 Controller,可以在左側導覽點選資料夾路徑src/main/java/{project-domain}並點開滑鼠右鍵選單: New > Java Class, 建立一個 Controller 例如HelloController,Class 內容會自動填好 package,往下自行來撰寫Code,範例如下:

package com.example.demo;
import org.springframework.web.bind.annotation.*;

@RestController
public class HelloController {
    @GetMapping("/")
    public String index() {
        return "Welcome to Spring Boot!";
    }

    @GetMapping("/hello")
    public String hello() {
        return "Hello";
    }
}

部署

JAVA 專案的打包(package)格式主要區分為兩種:

  • JAR (Java Archive)
  • WAR (Web Application Archive)
    是一種JAR檔案,其中包含用來分發的JSP、Java Servlet、Java類、XML檔案、標籤庫、靜態網頁(HTML和相關檔案),以及構成Web應用程式的其他資源。在搭配 Web server 的架構下一般都是使用 WAR 文件運行。

Spring-boot 這種內嵌式 Tomcat Web server 整包框架則可直接使用 JAR 文件運行實現

JAR

打包可執行的JAR檔需要設定 Manifest 檔案,流程與範例可以參考 Java™ Tutorials - Setting an Application's Entry Point

Lesson: Packaging Programs in JAR Files (The Java™ Tutorials > Deployment)

Gradle 打包可以參考:Building Java Projects with Gradle
SpringBoot project 可以直接在專案根目錄執行 Shell gradle build 完成打包,透過 java -jar project.jar 啟動執行。


Template Engine

這裡以 Thymeleaf 搭配 Spring 快速 Demo:

  1. 引入 Thymeleaf Dependency,Gradle範例如下:

    implementation 'org.thymeleaf:thymeleaf-spring6'
  2. 在預設路徑 src/main/resources/templates 下建立View檔案,例如hello.html:

    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head>
        ...
    </head>
    <body>
        <h1 th:text="${headerName}"> </h1>
    </body>
    </html>
  3. 建立 Controller:

    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.*;
    import org.springframework.ui.Model;
    
    @Controller
    public class DemoController {
        @GetMapping("/hello")
        public String hello(Model model) {
            model.addAttribute("headerName", "Hello Thymeleaf");
            return "hello";
        }
    }

Concurrency (並發/並行)

Diagram

JAVA 原生 liberaries:

Introduction to Thread Pools in Java

References


Appendix

HTTP Client

JAVA HTTP Client範例程式碼:JAVA HTTP Client Sample codes

Spring Boot Setting

Leave a Reply

Your email address will not be published. Required fields are marked *