顯示具有 Java 標籤的文章。 顯示所有文章
顯示具有 Java 標籤的文章。 顯示所有文章

2024年7月13日 星期六

Git - Git 和 GitHub 有什麼差異 What's different Git and GitHub - 2?

目的

我們常常聽到 Git 和 GitHub 在我們的工作環境,但這兩個時常讓我們搞不清楚各個功用到底是什麼?就像是 Java 和 JavaScript 有什麼關係,這是一樣的嗎?以下就讓我們了解其中的差異吧!


分析表

名詞說明
本機:個人電腦主機
雲端平台:線上硬碟( Google Drive、DropBox... etc )
協作:同時多人對同一個專案開發

特性 Git GitHub
基本概念 版本控制系統
用來跟蹤和管理程式碼的變更
雲端平台
用來存放和分享使用 Git 管理的程式碼庫
功能 基本功能
提交、分支、合併和回退等操作
除了 Git 的基本功能外
還有遠端操作項目管理工具
範圍 本機安裝的軟件
管理本機程式碼
雲端平台
可以在任何地方通過網絡訪問和管理倉庫
協作方式 本機版本控制
通過本機網絡協作
提供網絡上的協作功能,如 pull requests、code reviews 和 issues
例子 小明在自己的電腦上使用 Git 來管理程式碼 小明和小紅通過 GitHub 在不同地方一起開發項目

總結

  • Git:是一個版本控制工具,幫助開發者在本機管理程式碼的變更。
  • GitHub:是一個基於 Git 的雲端平台,提供協作和項目管理功能,使得團隊開發更加方便。

歡迎轉載,請註明出處。

Git - 為什麼要用 Git 進行版控 Why use to Git by Source Code control - 1?

目的

因為各軟體公司都把 Git 的使用都列為加分的依據,但是與其說加分,倒不如說這是在開發上的良藥,對開發者來說是有益的。

所以利用這機會寫下自己對 Git 的想法,能有機會讓分享給各位也是一個福音。

用途

在開發過程因為有可能會遇到多人共同維護同一個專案,檔案內容會因為需求、拋錯...等很多種情況而異動程式碼,但是但是,如果遇到以下的窘境,你們該怎麼做?

1. 開發完成一個需求後,過半年後,要如何和新的程式碼哪裡有差異?

2. 同一個專案有多個需求要開發,但是要分批在不同的時間上線?

3. 有問題的程式碼是誰開發的,怎麼追蹤開發紀錄?

4. 我這次開發的內容和已經上線的差異?和不同環境的程式碼差異?

5. 我和其他兩位共同開發同一份程式碼,我要如何確認對方寫的如何和我的沒衝突?


以上當然只是比較常見的案例,其實還有很多例外可循。


你 / 妳也是用檔案複製和貼上進行保存等動作嗎?其實也可以用以上的範例進行測試,看能不能是用以上的情境。


所以我們就會有一個版控工具,讓我們在開發上更加的有利也能掌握狀態。


歡迎轉載,請註明出處。

2024年7月6日 星期六

Java - 程式碼排版的好處

目的

隨著開逐漸頻繁,我們就會產生非常多的程式碼內容,之後要如何將程式碼做有效的留存?如何要轉交給下一位同仁時能夠更快能夠更快上手。

爲什麼要排版

提高可讀性

清晰的程式碼結構和一致的格式可以讓程式碼更容易理解。良好的排版使得程式碼邏輯一目了然,減少理解程式碼的時間和精力。

減少錯誤

良好的排版有助於發現和避免錯誤。整潔的程式碼可以讓潛在的錯誤更容易被發現,例如缺失的括號或錯誤的縮排。

便於合作

在團隊合作中,一致的程式碼風格能夠讓團隊成員更容易閱讀和理解彼此的程式碼,減少溝通成本和程式碼衝突。

提高維護

程式碼在維護過程中需要頻繁地被閱讀和修改。良好的排版可以使得維護人員更容易理解程式碼邏輯,從而提高維護效率。


實際範例

修改前

public class Example {
public static void main(String[] args) {
int a = 10;
int b = 20;

if (a > b) {
System.out.println("a is greater");
} else {
System.out.println("b is greater");
}
}
}

修改後

public class Example {
    public static void main(String[] args) {
        int a = 10;
        int b = 20;
        
        if (a > b) {
            System.out.println("a is greater");
        } else {
            System.out.println("b is greater");
        }
    }
}

歡迎轉載,請註明出處。

2024年6月10日 星期一

Java-錯誤及例外處理的第一步

各位大大
想必大家想順順利利的編寫程式碼
最好都不要有任何重大的錯誤
但是
通常事與願違
在開發的過程中
只會一直遇到錯誤並且快速修正減少錯誤再次發生
然後無限迴圈
直到事前直接想到之前有遇到過相同的雷
直接去迴避它

對的
面對他才是有效解決的好辦法
最怕的是連錯誤訊息都沒有顯示
那真的讓人恐懼

我們就先簡單介紹如何快速去排除問題吧!


錯誤項目

一般錯誤排除

常常發生於直接複製程式碼、編寫程式碼打錯字、沒有引用到正確資源等。
排除方式:
1. 會在錯誤的地方文字底下有紅蚯蚓提醒


2. 在當行前面有紅色燈泡提醒 Icon 點選下去有建議調整( 排除 )方式
PS: 雖然有提供方式給你選擇,但實際方向開發者要自己知道。



例外錯誤排除( Checked and Unchecked Exception  )

通常是在執行中遇到不符合預期內容、類別...等問題
排除方式:
1. 查看 Console Log 視窗或是 *.log 檔案
2. 如有明顯錯誤內容會存在 Error 敏感文字
3. 分析該區塊文字說明( 由上而下閱讀 )
- 先找第一行的例外類別為何( 下圖中第一個紅框框 ) ? ( 可先 Google 該例外簡易說明 )
- EX: Exception in thread "main" java.lang.NumberFormatException: For input string: "一"

- 在訊息內發生問題( 錯誤 )的程式碼位置
PS: 通常我們直接從專案底下( Packages )的程式碼找起,較少機會出現在依賴的資源內。
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) 
at java.lang.Integer.parseInt(Integer.java:580) 
at java.lang.Integer.valueOf(Integer.java:766) 
at com.text.Hello.main(Hello.java:9)





歡迎轉載,請註明出處。

Maven - Java 專案管理用途 ( 一 )

這章節不談論環境相關、安裝相關等問題

前提

各位大大
想必為啥 Java 專案用 Jar 匯入專案就可以用的嚇嚇叫
為啥最後要用啥 Maven 的東西來介入該專案內
用這一個東西到底有什麼好處?
如果是有好處的的話那要怎麼閱讀?

本文

自從工作後就沒有再離開過 Maven 了
不是說離不開
而是走到哪就被使用到哪裡
這就像是一個專案已經被定義好注定

生活例子( 前 ):

蛋糕的製作( 草莓蛋糕 )
成份:
雞蛋、麵粉、牛奶、草莓...等

我相信大家看到以上菜單就一股腦兒直接去蒐集材料並且開始製作
但是
如果你是幫XX超商出的蛋糕
能夠北區、中區、南區的長相、口味、口感沒有標準嗎?
材料的來源及作法能夠自己說的算嗎?
當然不能的
所以要制定規範

生活例子( 後 ):

蛋糕的製作( 草莓蛋糕 )
成份:
雞蛋( 台南XX山烏骨雞雞蛋 )
麵粉( XX貿易商X筋麵粉 )
牛奶( 日本北海道XX鮮乳 )
....

有了以上的規範
就能讓產出的內容更加有保障
也不會因為生產地區的不同導致產出的結果不一致
這就是 Maven 專案管理主要的用意

結論

因為有管理資源的設定
所以不管是哪裡支援的工程師( 蛋糕師傅 )
都可以快速掌握並且不會因為材料來源的不同
導致產出不符預期的產品出來


官方網站: 連結

2024年4月21日 星期日

WebSite-如何匯入 Dynamic Web Project 至 Eclipse



如何載入 Dynamic Web Project 專案?
0. 下載專案並開啟 Eclipse
PS: 需要在 Eclipse 設置 Tomcat Server


1.  開啟專案
2. 選擇專案
3. 確認專案
4. 匯入專案

PS: 因為有些專案用得到 HttpServler,所以我們要針對專案進行相關設定,否則會出現一堆紅蚯蚓( 錯誤提醒 )
1. 查看專案特性
2. 確認專案內容
以此專案需要用到 Java 、 HttpServlet...etc
所以要勾選以上項目並且在 Web 項目掛載本機的 Server 才能載入相關的資源


測試網址: http://localhost:8080/xxxx/


歡迎轉載,請註明出處。


2023年5月10日 星期三

Java-下載憑證放置檔案

各位大大是否有碰過連上 Https 時候出現交握失敗的錯誤訊息
主要原因在於

1. 到瀏覽器下載憑證, 並改為cer副檔名格式

2. 確認jdk路徑( 可能是系統的或是開發用的 )

3. cmd 切換到jdk底下

4. 匯入將憑證到cacerts內讓jvm能執行


 import

bin\keytool.exe -importcert -alias "www.xxx.com.tw" -file jre\lib\security\www.xxx.com.tw.cer -lkeystore jre\lib\security\cacerts -storepass changeit


check

bin\keytool.ext -list -v -alias "www.xxx.com.tw" -keystore jre\lib\security\cacerts - storepass changeit


remove

bin\keytool.exe -delete -alias "www.xxx.com.tw" -keystore jre\lib\security\cacerts -storepass chageit


常見功能說明

*.cer: 網站憑證
alias: 別名
importcacert: 匯入憑證至cacerts
file: 來源檔案路徑
keystore: 憑證庫
storepass: 憑證庫密碼


2023年5月9日 星期二

Jave-Proxy設定

各位大大再開發的時候多少有以下的經驗吧
要如何從內部網路藉由代理伺服器(Proxy)出去外網取得相關資源
如果沒設定好不管如何去執行都只會得到UnKnowHost這錯誤訊息吧
在此紀錄說明

以下當然有少很多說明
特別是 Proxy 機制
有興趣可以查維基百科

一般網路:
Local - 數據機 - Internet

企業( 特殊 ) 網路:
Local - Proxy - Internet


import java.io.IOException;
import java.io.InputStream;
import java.net.Authenticator;
import java.net.MalformedURLException;
import java.net.PasswordAuthentication;
import java.net.URL;
import java.net.URLConnection;

public class TestProxy {

	public final static String acc = "A123456789";
	public final static String pwd = "!QAZ2wsx";

	public static void main(String[] args) {

		Authenticator.setDefault(new Authenticator() {

			@Override
			protected PasswordAuthentication getPasswordAuthentication() {
				// TODO Auto-generated method stub
				return new PasswordAuthentication(acc, pwd.toCharArray());
			}

		});

		System.setProperty("http.proxyHost", "proxy.com.tw");
		System.setProperty("http.proxyPort", "80");

		System.setProperty("https.proxyHost", "proxy.com.tw");
		System.setProperty("https.proxyPort", "80");

		URL url;
		try {
			url = new URL("https://tw.yahoo.com/");
			URLConnection connection = url.openConnection();
			InputStream is = connection.getInputStream();

			int i;
			while ((i = is.read()) != -1) {
				System.out.print((char)i);
			}

		} catch (MalformedURLException e) {
			e.printStackTrace();
			
		} catch (IOException e) {
			e.printStackTrace();
			
		}
	}
}

2018年5月26日 星期六

Java - 實作 Interface

希望各位大大看到上一篇的簡述能有些希望
至少能從生活中感覺出來那道光芒
接下來就是 Interface( 接口 )

什麼是 Interface ?
我該怎麼用?

我們先模擬情境吧
現在如果你要開派對
你希望是開聖誕趴?制服趴?
派對必備用品?
所以參加你的派對都必須要遵守( 實作 )!

1 . 制定規範
/**
 * 派對必要裝扮
 * @author brian
 */
public interface DressUp {
    /** 耳環 */
    String earring();
    /** 上衣 */
    String clothes();
    /** 褲子 */
    String pants();
    /** 通關密語 */
    void password();
}


2 . 只要參加都要有此配件才可參加
/**
 * 主題:我家派對
 * @author brian
 */
public class MyParty implements DressUp {

    @Override
    public String earring() {
        // 閃亮配飾
        return "diamond";
    }

    @Override
    public String clothes() {
        // 紅色上衣
        return "redTShirt";
    }

    @Override
    public String pants() {
        // 短褲
        return "shortPants";
    }

    @Override
    public void password() {
        // 心裏通關密語
        System.out.println("內心的通關密語:Cool");
    }

    public static void main(String[] args) {
        MyParty Peter = new MyParty();
        System.out.println("Peter的配飾 : " + Peter.earring());
        System.out.println("Peter的上衣 : " + Peter.clothes());
        System.out.println("Peter的褲子 : " + Peter.pants());
        Peter.password();
    }
}

Peter的配飾 : diamond
Peter的上衣 : redTShirt
Peter的褲子 : shortPants

內心的通關密語:Cool


歡迎轉載,請註明出處。



2018年5月24日 星期四

Java - 繼承 Extends

想必有時候剛入行的大大不知道繼承
剛開始也是讓人挺頭痛的
但是以生活動的例子來說
可能就直接排出掉很多學習障礙囉
我們就拿簡單的範例來說說吧

請依照順序觀看
1 . 父母有啥外觀與您相同?(頭髮、臉蛋、身高、體重)
2 . 我自己外觀長得怎樣?(頭髮、臉蛋、身高、體重)
3 . 長大後我會有哪些轉變?(頭髮、臉蛋、身高、體重)

首先,因為會繼承我父母的基因
public class ParentBody {

    public String hairColor() {
        // 黑頭髮
        return "Black";
    }

    public int height() {
        // 身高
        return 170;
    }

    public boolean glasses() {
        // 戴眼鏡
        return false;
    }

    public String language(String language) {
        // 家人聽能辨別這兩種語言
        if ("English".equals(language)) {
            return "英文";
        } else {
            return "中文";
        }
    }
}


所以我因該會是
public class MyBody extends ParentBody {

    public static void main(String[] arg) {
        ParentBody peter = new MyBody();
        System.out.println("Peter 髮色是 " + peter.hairColor() + " 色");
        System.out.println("Peter 身高是 " + peter.height() + " 公分");
        System.out.println("Peter 戴眼鏡 " + peter.glasses());
        System.out.println("Peter 是說 " + peter.language("Chinese"));
    }

}

Peter 髮色是 Black 色
Peter 身高是 170 公分
Peter 戴眼鏡 false

Peter 是說 中文

但是因為環境改變,我認定是(@override )

public class MyBody extends ParentBody {

    @Override
    public String hairColor() {
        // 因為潮流我就染白髮
        return "white";
    }

    @Override
    public String language(String language) {
        // 但我決定是這樣
        if ("English".equals(language)) {
            return "英文";
        } else if ("Chinese".equals(language)) {
            return "台語";
        } else {
            return "聽不懂";
        }
    }

    public static void main(String[] arg) {
        ParentBody peter = new MyBody();
        System.out.println("Peter 髮色是 " + peter.hairColor() + " 色");
        System.out.println("Peter 身高是 " + peter.height() + " 公分");
        System.out.println("Peter 戴眼鏡 " + peter.glasses());
        System.out.println("Peter 是說 " + peter.language("Chinese"));
    }

}


Peter 髮色是 white 色
Peter 身高是 170 公分
Peter 戴眼鏡 false

Peter 是說 台語

歡迎轉載,請註明出處。






2017年12月30日 星期六

Java-切割、分割字串

想必各位大大對這需求一定不陌生吧
在此紀錄下來
希望大家一起分享一起交流

切割字串解析成每個字元
1 . 方法一
String s = "abcd,efgh";
System.out.println("Use String method : Char Array");
char[] a = s.toCharArray();
for (char c : a) {
    System.out.println(c);
}

Use String method : Char Array
a
b
c
d
,
e
f
g
h

2 . 方法二
String s = "abcd,efgh";
System.out.println("Use String method : String length and char At");
for (int i = 0; i < s.length(); i++) {
    char c = s.charAt(i);
    System.out.println(c);
}

Use String method : String length and char At
a
b
c
d
,
e
f
g
h

藉由特定的字串切割( Split )
1 . 字串切割
String s = "abcd,efgh";
System.out.println("Use String method : Split");
String[] strs = s.split(",");
for(String str: strs) {
    System.out.println(str);
}

Use String method : Split
abcd
efgh

2 .字串切割,但限制條件
String s = "abcd,efgh,ijkl,mnop,qrst";
System.out.println("Use String method : Split limit");
for (String retval : s.split(",", 3)) {
    System.out.println(retval);
}

Use String method : Split limit
abcd
efgh
ijkl,mnop,qrst

歡迎轉載,請註明出處。




2017年12月26日 星期二

Java-網頁憑證轉為 JKS 格式

1 . 命令提示字元目標移至 C:/.../jdk/bin
2 . 將下載好後的 *.cer 憑證放置此路徑下
3 . 更改以下指令檔案名稱並且執行
keytool -importcert -file <changedCertName>.cer -keystore <exportName>.jks -alias changeit
4 . 產生出來的 jks 會產生再此路徑底下

2017年12月2日 星期六

Android-Logger 和 Log4j 的使用與差異

注意:目前 Log4j 有一些尚未完成,敬請見諒。

此篇語法為 Kotlin,宣告方法類似 Java ,只是順序不同

大家在開發程式的過程中
想必可能要了解或者是要更清楚流向
會用到 System.out.println、Logger、Log4j
此篇用談到如何在 AndroidStudio 用 Java Logger 和 Log4j

1 . 一般 Java Logger 方法
package com.light.blue.log.activity

import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import java.util.logging.Level.*
import java.util.logging.Logger

class MainActivity : AppCompatActivity() {

    private val logger: Logger? = Logger.getLogger("MainActivity");

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // SEVERE   嚴重(特高級別)
        // WARNING  注意
        // INFO     訊息

        logger?.info("info message");
        logger?.log(SEVERE, "Server message");
        logger?.log(WARNING, "WARNING message");
        logger?.log(INFO, "INFO message");
        
    }
}









2017年11月12日 星期日

Java-數字千分位和小數處理

想必大家都有遇過數字算出來
卻要讓使用者辨別單位
只好把 千分位、小數點 發揮得淋漓盡致
在此也把遇到的情況記錄下來

try {
    Double number = 123456789.00000;
    NumberFormat numberFormat1 = NumberFormat.getNumberInstance();
    // 一般千分位,小數預設三位(四捨五入)
    System.out.println(numberFormat1.format(number));
    
    // 取消千分位,小數預設三位(四捨五入)
    numberFormat1.setGroupingUsed(false);
    System.out.println(numberFormat1.format(number));

    // 設置小數點後最大位數
    numberFormat1.setMaximumFractionDigits(8);
    System.out.println(numberFormat1.format(number));

    // 設置小數點後最小位數
    numberFormat1.setMinimumFractionDigits(0);
    System.out.println(numberFormat1.format(number));
    
} catch (IllegalArgumentException e) {
    System.err.println("資料無法轉換");
}



參考資料:java 千分位的添加和去除
參考資料:利用NumberFormat 設定小數點輸出至多、至少位數

2017年2月17日 星期五

JAVA-Struts2 入門初體驗 ( 三 )__註記型

此次 Struts2 配置用註解來完成
所以以此篇來說
就不用放置設定檔
首先在放置 pom.xml 放置用得到的 jar
並且設置完基本的 web.xml 設定
連結:設定前置動作




















註記型的 struts.xml 不用添加

在講述之前
先快速說明一下要如何進入此情境
以便於日後快速回想
( 缺圖 )

概述
一般頁面
一般頁面但有多個導頁或計算
一般頁面但有多個方法

此次註解說明:
@Namespace : 空間配置
@ResultPath : 默認情況下,它會找到結果頁在 WEB-INF/content/ 文件夾
@Result : 結果參照
@Action : 對應動作
results : 多種結果集合
location : 資源位置

一般頁面
http://localhost:8080/ProjectName/User/hello.action
說明:/User/hello.action 執行 hello 底下的 execute 方法
        返回的結果對應到上方 Result 所宣告的頁面
package com.brian.example.action;

import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.ResultPath;

@Namespace("/User")
@ResultPath(value="/")
@Result(name="success",location="/WEB-INF/jsp/hello.jsp")
public class HelloAction {
    
    @Action(value="hello")
    public String execute(){
        return "success";
    }

}


一般頁面但有多個導頁或計算
http://localhost:8080/HelloStruts2Ann/User/userData.action
說明:執行對應的 userData 方法,但可能內部有邏輯判斷影響輸出的頁面
         我們就會用此結果導致對應頁面。
package com.brian.example.action;

import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.ResultPath;

@Namespace("/User")
@ResultPath(value = "/")
public class UserDataAction {

    @Action(value="userData", results={
            @Result(name="success",location="/WEB-INF/jsp/userData.jsp"),
            @Result(name="fail",location="/WEB-INF/jsp/fail.jsp")
        })
    public String userData(){
        String aaa = "123";
        if("aaa".equals(aaa)){
            // doSomething
            return "fail";
        }
        return "success";
    }

}


一般頁面但有多個方法
http://localhost:8080/HelloStruts2Ann/User/userData1.action
or
http://localhost:8080/HelloStruts2Ann/User/userData2.action
說明:藉由不同對應的 uri 對應到對應的方法。
package com.brian.example.action;

import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.ResultPath;

@Namespace("/User")
@ResultPath(value = "/")
public class UserDataAction {

    @Action(value="userData1", results={
            @Result(name="success",location="/WEB-INF/jsp/userData.jsp")
        })
    public String userData1(){
        return "success";
    }

    @Action(value="userData2", results={
            @Result(name="success",location="/WEB-INF/jsp/hello.jsp"),
            @Result(name="fail",location="/WEB-INF/jsp/fail.jsp")
        })
    public String userData2(){
        // return "fail";
        return "success";
    }
    
}





參考資料:Struts 2
歡迎轉載,請註明出處。

JAVA-Hibernate ( 一 )__說明

參考資料:hibernate的好处

2017年2月16日 星期四

JAVA-Struts2 攔截器 Interceptor ( 二 )__實作

上一篇 : JAVA-Struts2 攔截器 Interceptor ( 一 )__說明

此篇是實作上篇所說明的程式碼
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>

    <constant name="struts.enable.DynamicMethodInvocation" value="false" />
    <package name="user" namespace="/User" extends="struts-default">
    
        <!-- 攔截器 -->
        <interceptors>
            <!-- (單一)宣告自定義攔截器 -->
            <interceptor name="MyInterceptor" class="com.brian.example.interceptor.MyInterceptor"></interceptor>
            
            <!-- (組合)定義其他攔截器,可引用其他攔截器 -->
            <interceptor-stack name="defaultInterceptorStack">
                <interceptor-ref name="MyInterceptor"></interceptor-ref>
                <interceptor-ref name="i18n"></interceptor-ref>
                <interceptor-ref name="defaultStack"></interceptor-ref>
            </interceptor-stack>
            
            <!-- (組合)定義其他攔截器,可引用其他攔截器 -->
            <interceptor-stack name="defaultInterceptorStack111">
                <interceptor-ref name="defaultStack"></interceptor-ref>
            </interceptor-stack>
            
        </interceptors>
        
        <!-- 以下功能是針對 "全部" action ,所以只要經過 struts.xml 就一定會先經過他-->
        <!-- 如果有部分頁面或功能不需要到,就不要使用此功能 -->
        <default-interceptor-ref name="MyInterceptor"></default-interceptor-ref>

        <!-- 全部對應 result 頁面 -->  
        <global-results>  
          <result name="block">/WEB-INF/jsp/block.jsp</result>  
        </global-results>  
        
        <action name="hello" class="com.brian.example.action.HelloAction"
            method="execute">
            <result name="success">/WEB-INF/jsp/hello.jsp</result>
        </action>
        
        <action name="data" class="com.brian.example.action.DataAction"
            method="execute">
            <interceptor-ref name="MyInterceptor"/>
            <result name="success">/WEB-INF/jsp/data.jsp</result>
        </action>
        
    </package>

</struts>

以下是自定義攔截器
package com.brian.example.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;

public class MyInterceptor implements Interceptor {

    private static final long serialVersionUID = 1L;

    @Override
    public void destroy() {
        System.out.println("-----攔截器銷毀-----");
    }

    @Override
    public void init() {
        System.out.println("-----攔截器生成-----");
    }

    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        System.out.println("---------攔截器---------");
        HttpServletRequest request = ServletActionContext.getRequest();
        HttpServletResponse response = ServletActionContext.getResponse();
        HttpSession session = request.getSession();
        // 判斷某事件,例如:Token. Record 記錄是否存在
        if (session.getAttribute("token")!= null) {
            // 建議
            System.out.println("Hello" + session.getAttribute("token"));
            // 如果存在,直接略過此攔截
            return invocation.invoke();
        } else {
            // 如果不存在,則導至某頁面
            return "block";
        }
    }
}


歡迎轉載,請註明出處。