how to install and use Jeddict AI Assistant on NetBeans IDE 23+

Jeddict AI Assistant 為適用於 NetBeans IDE 23 以上版本的插件,能夠連接大語言模型,協助編寫程式碼,大幅提升開發體驗,讓程式撰寫更輕鬆、更智慧。以下簡介其安裝方法及功能。

A.安裝與解除安裝

  • 安裝步驟:
    • 開啟 NetBeans IDE
    • 點選 Tools/Plugins/Available Plugins
    • 搜尋並安裝 Jeddict AI Assistant
    • 點選 Tools/Options/Jeddict AI Assistant
      Providers: OLLAMA,
      URL: http://localhost:11434,
      Model: qwen2.5-coder:7b
  • 解除安裝步驟:
    • 點選 Tools/Plugins/Installed
    • User Installed Plugins 下,選擇 Jeddict AI Assistant
    • 點擊解除作用 (Deactivate)解除安裝 (Uninstall)

B.主要功能與使用說明

Jeddict AI Assistant 提供了多種智慧功能,幫助提升程式碼品質與開發效率:

  1. 智慧程式碼補全

    (Smart Code Completion)
    • 用法: 在編輯程式碼時,按下 Ctrl+SpaceCtrl+Alt+Space 鍵,AI 會提供相關的程式碼建議。按下 Enter 鍵即可接受建議。
    • 說明: AI 會學習程式碼上下文,提供更精準的補全、變數和方法重命名,以及改進日誌訊息或註解的建議,大幅提高編碼效率。
  2. 行內提示

    (Inline Hint)
    • 用法: 在編輯程式碼行時,按下 Enter 鍵,AI Assistant 會直接在程式碼編輯器中顯示基於當前上下文的行內提示。再次按下 Enter 鍵即可確認並整合建議,或按下其他任意鍵取消。
    • 說明: 提供即時、上下文感知的建議,有效提升程式碼品質和效率,且不干擾開發流程。
  3. 為行內提示提供上下文

    (Providing Context to Inline Hint)
    • 用法:
      • 使用註解作為提示: 在程式碼中撰寫註解說明程式意圖,然後按 Enter 鍵。AI 會將註解和現有程式碼作為上下文。
      • 使用儲存的提示: 在設定中定義長提示,然後在編輯器中輸入 /prompt-id 並按 Enter 鍵來重複使用。
      • 即時擴展儲存的提示: 輸入 /{prompt-id} 加上額外上下文,AI 會同時處理儲存的提示和額外文字。
    • 說明: 可更精確地控制 AI 的建議,使其更符合當前的開發任務。
  4. 方法強化

    (Method Enhancement)
    • 用法: 反白顯示任何方法,然後點擊提示:"AI: Enhance the method"。
    • 說明: AI 會根據專案需求,改進方法的邏輯、結構或效率。
  5. Javadoc 創建與改進

    (Javadoc Creation & Improvement)
    • Javadoc 創建用法: 反白顯示任何類別、方法或介面,然後點擊提示:"AI: Create Javadoc using assistance"。
    • Javadoc 改進用法: 反白顯示任何類別、方法或介面中現有的 Javadoc 註解,然後點擊提示:"AI: Enhance existing Javadoc"。
    • 說明: AI 會自動生成符合程式碼上下文的 Javadoc,並提升其清晰度、準確性和符合最佳實踐。
  6. 變數命名建議

    (Variable Naming Suggestions)
    • 用法: 反白顯示任何變數或參數,然後點擊提示:"AI: Improve variable name using assistance"。
    • 說明: 自動建議更有意義且符合上下文的變數名稱,提升程式碼的可讀性和可維護性。
  7. 語法修正

    (Grammar Fixes)
    • 用法: 選擇任何字串文字 (例如註解、Javadoc 或其他文本),然後點擊提示:"AI: Fix grammar issues using assistance"。
    • 說明: 檢測並修正程式碼中註解、Javadoc 或其他文本內容的語法錯誤,確保文件專業且潤飾精良。
  8. 文本強化

    (Text Enhancement)
    • 用法: 選擇任何字串文字 (例如註解、文件或日誌訊息),然後點擊提示:"AI: Enhance text quality using assistance"。
    • 說明: 透過提供更簡潔、更有影響力的替代方案,提升文本內容的品質和可讀性。
  9. 程式碼行強化 (Code Line Enhancement)

    • 用法: 選擇任何單行程式碼片段,然後點擊提示:"AI: Enhance a single line of code"。
    • 說明: 建議單行程式碼的強化或最佳化,確保表達簡潔、高效和可維護。
  10. 學習類別

    (Learn about Class)
    • 用法: 反白顯示類別名稱,然後點擊提示:"AI: Learn about Class"。之後可以在聊天中繼續詢問特定問題。
    • 說明: 提供關於特定類別的深入見解和詳細解釋,包括其方法、屬性以及在專案中的用法。
  11. 生成測試案例

    (Generate Test Cases)
    • 用法: 反白顯示任何類別或方法,然後點擊提示:"AI: Generate Test for Class or Method"。
    • 說明: 根據 AI Assistant 提供的上下文提示,自動為類別或方法生成測試案例,簡化測試寫作流程。

C.AI 聊天功能

Jeddict AI Assistant 提供了多種上下文感知的 AI 聊天模式,可有效解決開發問題:

  1. 感知專案上下文的 AI 聊天

    (Project Context-Aware AI Chat)
    • 用法: 在專案開啟時,右鍵點擊專案並選擇 "AI Assistant" 以啟動 AI 聊天。
    • 說明: AI 聊天會考量整個專案的上下文,提供針對專案結構和組件的全面見解和支援。
  2. 感知 Java 套件與類別上下文的 AI 聊天

    (Java Packages & Classes Context-Aware AI Chat)
    • 用法: 選擇所需的套件或類別,右鍵點擊並選擇 "AI Assistant" 以開始聊天。
    • 說明: 針對特定的 Java 套件或類別與 AI 互動,獲得反映該套件或類別上下文的見解和建議。
  3. 編輯器提供各 Java 類別專屬的 AI 聊天

    (Tailored AI Chat for Individual Java Classes from Editor)
    • 用法: 在編輯器中開啟所需的 Java 類別,右鍵點擊並選擇 "AI Assistant" 以啟動專注於該類別的對話。
    • 說明: 針對單個 Java 類別與 AI Assistant 進行有針對性的討論,接收專門針對該類別的詳細分析和改進建議。
  4. 網頁開發上下文感知的 AI 聊天

    (Web Development Context-Aware AI Chat (HTML, CSS, JS, JSF))
    • 用法: 選擇 webapp 目錄或其任何子目錄,右鍵點擊並選擇 "AI Assistant"。
    • 說明: 與 AI 針對 HTML, CSS, JavaScript 和 JSF 等網頁應用程式組件進行交流,獲得針對網頁開發的上下文感知支援和建議。
  5. 通用 AI 聊天

    (General AI Chat (No Context Required))
    • 用法: 點擊頂部工具列上的 Jeddict 按鈕。
    • 說明: 無需程式碼或專案上下文即可使用 AI 聊天功能,適用於一般查詢或不與特定程式碼元素相關的討論,更具成本效益且速度更快。

D.其他實用功能

  1. 國際化支援

    (Internationalization Support)
    • 可透過在設定面板中設定 系統訊息 (System Message) 來配置 AI 以特定語言回應,例如使用 "Respond in French"。
    • 對於某些語言,可能需要使用相容的字體來正確呈現聊天視窗和編輯器中的文本。
  2. 支援 PlantUML 和 Markdown 支援

    (PlantUML and Markdown Support in Chat)
    • 現在可以直接在聊天視窗中查看和編輯 PlantUML 圖表和 Markdown 內容。當要求圖表或格式化文本時,會即時顯示,可以在提交前預覽和進行更改。
    • 原地編輯 (Edit in-place): 只需點擊圖表或 Markdown 區塊即可直接在聊天中編輯。
    • 請注意: 所做的任何更改不會發送給 AI,直到明確地複製並貼上更新的內容到輸入框並提交。
  3. AI 式提交訊息

    AI Commit Message
    • 用法: 右鍵點擊專案並選擇 "AI Commit Message" 以自動生成提交訊息。此選項僅在 Git 檢測到更改時可見。
    • 說明: 根據 Git 儲存庫中檢測到的差異生成有意義的提交訊息,簡化版本控制流程。
  4. AI式 SQL 聊天助理

    (SQL AI Chat Assistant)
    • 用法: 導航至 Services > Databases > Register DB in Apache NetBeans。右鍵點擊資料庫連接並選擇 "AI Assistant"。
    • 說明: 這將啟動 AI 聊天視窗,提供基於資料庫的上下文。AI 將在 SQL 編輯器中生成結果,能夠在同一個聊天視窗中利用 AI 進行 SQL 查詢的智慧行內補全。
  5. AI 式 SQL 行內補全

    (SQL Inline Completion with AI)
    • 用法:Services > Databases > Register DB in Apache NetBeans 中,右鍵點擊資料庫連接並選擇 "Execute Command..."。在開啟的新視窗中撰寫 SQL 查詢,提供AI 驅動的行內補全建議。
    • 說明: 可以在同一個視窗中執行查詢並立即查看結果,簡化工作流程並減少查詢所花費的時間。

how to write Java HTTP client and server for RESTful web services

供程式串接用的網頁服務 (Web Service) 分成客戶端及服務端。以 Java RESTful Web Service 為例,假設服務端點規格如下:

    http://example.com:8080/api/v1/users/123?name=John 

其中,本體區皆以 JSON 物件字串為資料交換標準,輸入參數用到路徑123,查詢字串name=John,標頭區Area: Taipei,本體區phone: 123-4567。其 POST 請求 (Request) 及回應 (Response) 如下,

Request Header and Body
POST /api/users/123?name=John HTTP/1.1
Host: example.com:8080
Accept: application/json
Area: Taipei

{ "phone": "123-4567" }
Response Header and Body
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 85

{
  "id": 123,
  "name": "John",
  "area": "Taipei",
  "phone": "123-4567"
}

以下介紹上述端點規格的服務端及客戶端寫法:

(一) 服務端寫法,將使用 JAX-RS Jersey 套件

A. Java EE 7 手動轉型寫法如下,須搭配 GlassFish 4.1.2 (Java EE 7) with JDK 8

// Old Version:
//  On NetBeans, use Tools/Server 
//    to install GlassFish 4.1.2 (Java EE 7) with JDK 8
//  Use New/RESTful Web Services from Patterns...
//    to set up ApplicationConfig.java and Resource.java
//
import javax.ws.rs.Consumes;
import javax.ws.rs.HeaderParam;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
//import javax.ws.rs.core.Response;
import com.goolge.gson.Gson;  // install gson-2.7.jar in library

@Path("/api/users")
public class UserResource {

    @POST
    @Path("{id}")
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    public String updateUser(      // 此方法名無關緊要,回傳型別建議用字串
            @PathParam("id") int id,
            @QueryParam("name") String name,
            @HeaderParam("Area") String area,
            String requestBody) {  // 請求本體區建議用字串接收,避免自動轉型出錯

        // 取出請求本體區物件
        PhoneRequest request = new Gson()
            .fromJson(requestBody, PhoneRequest.class); // 字串轉物件

        // 依據給定 id, name, area, request,執行運算邏輯

        // 建構回應物件,轉型成字串回應
        UserResponse response = new UserResponse();
        response.id = id;
        response.name = name;
        response.area = area;
        response.phone = request.phone;

        String jsonResponse = new Gson().toJson(response);  // 物件轉字串
        return jsonResponse;  // 回傳用字串

        //return Response.ok(response).build();  // 回傳用物件,可能報錯
    }

    // Request body class 請求本體物件
    public static class PhoneRequest {

        public String phone;
    }

    // Response body class 回應本體物件
    public static class UserResponse {

        public int id;
        public String name;
        public String area;
        public String phone;
    }
}

B. Jakarta EE 9.1 自動轉型寫法如下,須搭配 GlassFish 6.2.5 (Jakarta EE 9.1) with JDK 11

// New Version:
//  On NetBeans, use Tools/Server 
//    to install GlassFish 6.2.5 (Jakarta EE 9.1) with JDK 11
//  Use New/RESTful Web Services from Patterns...
//    to set up ApplicationConfig.java and Resource.java
//
import jakarta.ws.rs.Consumes;
import jakarta.ws.rs.HeaderParam;
import jakarta.ws.rs.POST;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.PathParam;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.QueryParam;
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.Response;

@Path("/api/users")
public class UserResource {

    @POST
    @Path("{id}")
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    public Response updateUser(      // 此方法名無關緊要,回傳型別 Response
            @PathParam("id") int id,
            @QueryParam("name") String name,
            @HeaderParam("Area") String area,
            PhoneRequest requestBody) {  // 請求本體區物件型別 PhoneRequest

        // 依據給定 id, name, area, requestBody,執行運算邏輯

        // 建構回應物件
        UserResponse response = new UserResponse();
        response.id = id;
        response.name = name;
        response.area = area;
        response.phone = requestBody.phone;

        return Response.ok(response).build();  // 回傳成功狀態 Response 物件
        // Response.status(Response.Status.BAD_REQUEST) // 其他錯誤狀態回傳法
        //       .entity("Invalid input")
        //       .build();
    }

    // Request body class 請求本體物件
    public static class PhoneRequest {

        public String phone;
    }

    // Response body class 回應本體物件
    public static class UserResponse {

        public int id;
        public String name;
        public String area;
        public String phone;
    }
}

(二) 至於客戶端有如下三種常用寫法,可供比較選用:

  • JAX-RS 適合用於 Java/Jakarta EE 或 Jersey 等 RESTful 應用。
  • HttpURLConnection 是最基本的方式,無需額外套件,但較繁瑣。
  • HttpClient (JDK 11+) 是現代化且功能強大的選擇,須 JDK11以上才支援。

 A.使用 JAX-RS Client API

// On NetBeans, use New/RESTful Java Client... 
//   to add JAX-RS libraries which support javax/jakarta.ws.rs.* packages
//   and set up NewJerseyClient.java
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Entity;
import javax.ws.rs.client.Invocation;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

public class JaxRsClientExample {
    public static void main(String[] args) {
        Client client = ClientBuilder.newClient();
        WebTarget target = client
            .target("http://example.com:8080/api/users/123")
            .queryParam("name", "John");

        Invocation.Builder builder = target
            .request(MediaType.APPLICATION_JSON)
            .header("Area", "Taipei");

        String jsonBody = "{ \"phone\": \"123-4567\" }";

        Response response = builder.post(
            Entity.entity(jsonBody, MediaType.APPLICATION_JSON));

        String responseBody = response.readEntity(String.class);
        System.out.println("Response: " + responseBody);
        response.close();
        client.close();
    }
}

B.使用 java.net.HttpURLConnection

import java.io.BufferedReader;
import java.io.IOException;  // thrown by httpURLConnection.openConnection()
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException; // thrown by URL()
import java.net.URL;

public class HttpURLConnectionExample {
    public static void main(String[] args) throws IOException, MalformedURLException {
        URL url = new URL("http://example.com:8080/api/users/123?name=John");
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();

        conn.setRequestMethod("POST");
        conn.setRequestProperty("Accept", "application/json");
        conn.setRequestProperty("Area", "Taipei");
        conn.setRequestProperty("Content-Type", "application/json");
        conn.setDoOutput(true);  // needed before writing the request body

        String jsonInput = "{ \"phone\": \"123-4567\" }";
        // use try with resource block without catch block
        //   output stream will be auto closed when leaving the block
        //   any exception in the block will be passed upward to the calling method
        try (OutputStream os = conn.getOutputStream()) {
            os.write(jsonInput.getBytes());
            os.flush();
        }

        BufferedReader br = new BufferedReader(
            new InputStreamReader(conn.getInputStream()));
        String line;
        StringBuilder response = new StringBuilder();
        while ((line = br.readLine()) != null) {
            response.append(line);
        }

        System.out.println("Response: " + response.toString());
        conn.disconnect();
    }
}

C.使用 java.net.http.HttpClient (JDK 11+)

// JDK 11 above is required
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpRequest.BodyPublishers;
import java.net.http.HttpResponse;
import java.net.http.HttpResponse.BodyHandlers;

public class HttpClientExample {
    public static void main(String[] args) throws IOException, InterruptedException {
        HttpClient client = HttpClient.newHttpClient();

        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("http://example.com:8080/api/users/123?name=John"))
            .header("Accept", "application/json")
            .header("Area", "Taipei")
            .header("Content-Type", "application/json")
            .POST(BodyPublishers.ofString("{ \"phone\": \"123-4567\" }"))
            .build();

        HttpResponse<String> response = client.send(request, BodyHandlers.ofString());

        System.out.println("Response: " + response.body());
    }
}
    參考資料
  1. 對應各 Java/Jakarta EE 版本,與其相容的 GlassFish, JDK 版本可參考下址
    Version history of Java EE, JSF, GlassFish, JDK, and NetBeans

how the http protocol may support crud database operation

RESTful Web Service 為現在流行,用來存取資料庫記錄的 API 設計形式。以下以 JSON 資料交換格式為例,展示幾種對記錄進行增查改刪 (CRUD, Create, Read, Update, Delete) 運算時,常用的 HTTP 請求及回應範例。

設計 RESTful API 時,請求參數如果量小,可以利用 Path Parameter, Query String Parameter, Header Parameter, Body Parameter using application/json, Body Parameter using application/x-www-form-urlencoded 等參數傳遞法。如果參數量大,包含檔案,則可利用 Body Parameter using multipart/form-data 參數傳遞法。

同樣的,回應結果如果量小,可以利用 application/json 結果回傳法。如果量大,包含檔案,則可利用 multipart/mixed 結果回傳法。

以下透過 MS Copilot 生成幾種可能的 HTTP 請求及回應長相,如下。

(一) 利用 HTTP 進行新增查詢記錄的幾種作法如下:
A. 請求(Request)訊息格式
A1: Path Parameter 由路徑上的id,查詢某人基本資料
GET /api/users/123 HTTP/1.1
Host: example.com
Accept: application/json
A2: Query String Parameter 由查詢字串上的id,查詢某人基本資料
GET /api/users?id=123 HTTP/1.1
Host: example.com
Accept: application/json
A3: Header Parameter 由標頭區的id,查詢某人基本資料
GET /api/users HTTP/1.1
Host: example.com
Accept: application/json
id: 123
A4: Body Parameter using application/json 由本體區的id,查詢某人基本資料
POST /api/users HTTP/1.1
Host: example.com
Accept: application/json
Content-Type: application/json
Content-Length: 18

{
  "id": 123
}
A5: Body Parameter using application/x-www-form-urlencoded 新增某人基本資料
POST /users/updateProfile HTTP/1.1
Host: example.com
Accept: application/json
Content-Type: application/x-www-form-urlencoded
Content-Length: 27

id=123&name=John+Doe&email=johndoe%40example.com
A6. Body Parameter using multipart/form-data 新增某人基本資料,含照片
POST /users/uploadProfile HTTP/1.1
Host: example.com
Accept: application/json
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Length: [length]

------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="metadata"
Content-Type: application/json

{
  "id": 123,
  "name": "John Doe",
  "email": "johndoe@example.com"
}
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="profileImage"; filename="profile.jpg"
Content-Type: image/jpeg

[image data here]
------WebKitFormBoundary7MA4YWxkTrZu0gW--
B. 回應(Response)訊息格式 B1. application/json格式,回傳某人基本資料
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 85

{
  "id": 123,
  "name": "John Doe",
  "email": "johndoe@example.com"
}
B2. multipart/mixed格式,回傳某人基本資料,含檔案
HTTP/1.1 200 OK
Content-Type: multipart/mixed; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Length: [total length]

------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Type: application/json

{
  "id": 123,
  "name": "John Doe",
  "email": "johndoe@example.com"
}
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Type: application/octet-stream
Content-Disposition: attachment; filename="example.txt"

[file data here]
------WebKitFormBoundary7MA4YWxkTrZu0gW--
(二) 利用 HTTP 進行修改刪除記錄的作法如下: A. 修改記錄 Request:
PUT /api/users/123 HTTP/1.1
Host: example.com
Accept: application/json
Content-Type: application/json
Content-Length: 58

{
  "name": "Jane Doe",
  "email": "janedoe@example.com"
}
Response:
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 85

{
  "id": 123,
  "name": "Jane Doe",
  "email": "janedoe@example.com",
  "status": "updated"
}
B.刪除記錄 Request:
DELETE /api/users/123 HTTP/1.1
Host: example.com
Accept: application/json
Response:
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 45

{
  "id": 123,
  "status": "deleted"
}

how to install and use Jeddict AI Assistant on NetBeans IDE 23+

Jeddict AI Assistant  為適用於  NetBeans IDE 23 以上版本的插件,能夠連接大語言模型,協助編寫程式碼,大幅提升開發體驗,讓程式撰寫更輕鬆、更智慧。以下簡介其安裝方法及功能。 A.安裝與解除安裝 安裝步驟: ...

總網頁瀏覽量