2011年7月20日 星期三

Java 資料物件首部曲 - POJO

在 Java 物件導向程式設計中, 一直存在一個很重要的主角, 那就是 Java 資料物件, 這類物件主要是作為資料的容器 (PO : Persistent Object) 或載具 (DTO : Data transfer object ).

在本文中, 先來認識 POJO (Plain Old Java Object) 這簡易資料物件規範, POJO 資料物件只有變數 (Field) 及 getter、setter 這二個方法, 不具有永久儲存性.

如下程式範例中, 共宣告二個變數 (Field), 每一個變數均擁有 getter、setter 這二個方法. 變數均必須宣告 private, getter、setter 這二個方法一定要宣告 public, 這樣的程式設計又稱為 Information hiding

Mongo.java
public class Mongo {

    private String type;
    private String company;

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getCompany() {
        return company;
    }

    public void setCompany(String company) {
        this.company = company;
    }
   
}

Mongo 資料物件的使用, 程式範例如下 :

MongoTest.java
public class MongoTest {

    public static void main(String[] args) {

        Mongo x = new Mongo();
        x.setCompany("Donzai");
        x.setType("Trolling");
       
        System.out.println(x.getCompany());
        System.out.println(x.getType());

    }

}
先產生 Mongo 資料物件, 然後呼叫 setCompany() 及 setType() 這二個方法, 去設定 Mongo 資料物件內容. 然後再呼叫 getCompany() 及 getType() 這二個方法, 去顯示 Mongo 資料物件內容

2011年7月18日 星期一

Java Bean 的 XML 資訊檔

使用 java.beans 套件中的 XMLEncoder 及 XMLDecoder 這二個類別程式, 轉換 Java 物件資料 (Field) 與 XML 資訊檔

1. 程式撰寫
BeanEncoder.java
import java.io.FileNotFoundException;
import java.io.FileOutputStream;

public class BeanEncoder {

    public static void main(String[] args) {
        Address address = new Address("123 Main Street", "San Jose", "CA", "95000-0000");
        Contact contact = new Contact("Doe", "Joe", address);
      
        try {
            FileOutputStream fos = new java.io.FileOutputStream(args[0]);
            java.beans.XMLEncoder encoder = new java.beans.XMLEncoder(fos);
            encoder.writeObject(contact);
            encoder.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
}
BeanDecoder.java
public class BeanDecoder {

    public static void main(String[] args) {

        java.io.FileInputStream fis;
        try {
            fis = new java.io.FileInputStream(args[0]);
            java.beans.XMLDecoder decoder = new java.beans.XMLDecoder(fis);
            Contact contact = (Contact) decoder.readObject();
            decoder.close();
            (new XMLWriter()).write(contact, null);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

2. 執行程式
> java BeanEncoder d:\temp\abc.xml
執行後會在 d:\temp 目錄產生 abc.xml 資訊檔

> java BeanDecoder d:\temp\abc.xml
<?xml version = "1.0" encoding = "UTF-8"?><contact><name><fname>Doe</fname><lname>Joe</lname></name><address><street>123 Main Street</street><city>San Jose</city><state>CA</state><zip>95000-0000</zip></address></contact>

2011年7月17日 星期日

認識 JSF 網站開發架構

JavaServer Faces 於 2004 年三月 1.0 版正式提出,清楚的將 Web 2.0 網站的開發者劃分了三個角色:

1. 網頁設計人員
2. 應用程式設計人員
3. 網頁互動元件開發人員

從使用的角度 來看,網頁設計人員與應用程式設計人員可以他們所熟悉的方式開發程式,而不用侵入彼此的工作範圍,而網頁互動元件開發人員可以獨立的開發個別元件,細節的部份 留給了他們來處理。

總而言之,JavaServer Faces 協助了職責的分別,讓不同屬性的開發人員可以彼此合作,而又互不侵擾,網頁互動 (UI) 元件的開發搭配整合開發環境(IDE)或是所視即可得的網頁編輯程式,讓 Web 2.0 網站的開發得以簡單且迅速,藉此提高應用程式開發效率。

JavaServer Faces 2 (JSF 2) 是以 Java EE 為基礎的網頁互動 (UI) 應用架構技術,符合 MVC 架構,設定上跟其他架構相比算是較簡單些,也改進了第一代 JSF 的一些不足,Annotation 取代了原本的 xml 設定檔,使得設定相當容易,同時也提供彈性不錯的 Ajax 標籤。

參考文章
1.JSF 學習筆記
http://caterpillar.onlyfun.net/Gossip/JSF/JavaServerFaces.htm
2.Rational Application Developer for WebSphere Software V8 Programming Guide
http://my.safaribooksonline.com/book/-/0738435597/firstchapter

3.Apache MyFaces
http://myfaces.apache.org/
4. Why can't I get a larger heap with the 32-bit JVM?
http://www.oracle.com/technetwork/java/hotspotfaq-138619.html
5. How do you merge multiple VMware 2GB disk files to single monolithic vmdk file?

JSF 官方網址 : http://www.oracle.com/technetwork/java/javaee/javaserverfaces-139869.html

2011年7月13日 星期三

Java 文字終端機 - 密碼輸入 (會出現 *)

Java 對於文字終端機的支援是非常貧乏,  例如 : 密碼輸入螢幕上只出現 '*', 這樣的功能, JDK 並沒有支援, 如需這樣的功能, 你必須使用第三方套件來完成.

在此為你介紹 Jline 這套件, 如何完成 密碼輸入螢幕上只會出現 '*',
實作步驟如下 :

1. 下載 JLine 套件
http://sourceforge.net/projects/jline/files/

2. 撰寫程式
import jline.*;
import java.io.*;

public class PasswordReader {

    public static void main(String[] args) throws IOException {
        ConsoleReader reader = new ConsoleReader();

        String line = null;
        do {
            line = reader.readLine("enter password> ", '*');
            System.out.println("Got password: " + line);
        } while(line != null && line.length() > 0);
    }
}

3.編譯程式
> javac -cp jline-1.0.jar PasswordReader

4. 執行程式
> java -cp .;jline-1.0.jar PasswordReader
enter password> **********
Got password: qqqqqqqqqq
enter password>
Got password:

JLine 官方網址 : http://jline.sourceforge.net/

2011年7月10日 星期日

Java 與 費式數列 (Fibonacci)

Fibonacci 為1200年代的歐洲數學家,在他的著作中曾經提到:「若有一隻免子每個月生一隻小免子,一個月後小免子也開始生產。起初只有一隻免 子,一個月後就有兩隻免子,二個月後有三隻免子,三個月後有五隻免子(小免子投入生產)......」。 


範例程式
public class Fibonacci {
    public static void main(String[] args) {
        int[] fib = new int[20]; 
        fib[1] = 1; 
        for(int i = 2; i < fib.length; i++) 
            fib[i] = fib[i-1] + fib[i-2]; 
        for(int number : fib) 
            System.out.print(number + " ");  
        System.out.println();
    }
}

參考網站 :  http://caterpillar.onlyfun.net/Gossip/AlgorithmGossip/FibonacciNumber.htm

2011年7月9日 星期六

Java 浮點數內部格式

Java 浮點數內部格式採用 IEEE 754 二進位浮點數算術標準

浮點數而又分為單精度 (float) 與倍精度 (double) :單精度為 32bits,倍精度為 64bits

float 變數內部格式




double 變數內部格式




例如 :  -12.625 使用 IEEE 754 單精度 表示浮點數

第一步驟:不管正負號直接將數值轉為二進制
12.625 => 1100.101 = 1.100101 × 2^3

第二步驟:計算指數
127+3=130 => 10000010

第三步驟:填入數值置於浮點數規格中
S E      M
1 10000010 100101 0000 0000 0000 0000 0


撰寫研究程式 1 - MyIEEE754.java

public class MyIEEE754 {
    public static void main(String[] args) { 
        System.out.println(Integer.toHexString(Float.floatToRawIntBits(2.25f)));
        System.out.println(Integer.toHexString(Float.floatToRawIntBits(5.625f))) 
    }
}

程式中 Float.floatToRawIntBits(2.25f) 會將 float 浮點數內部格式, 以 int 傳回, 然後以十六進位格式顯示, 以下為執行結果 :

40100000
40b40000

執行結果, 使用下圖為你解釋 :


1. 先計算指數部份 : 128-127=1 (如是 double, 則減去 1023)
2. 移動小數點 : 指數為正數 1, 所以向右移動一位
3. 計算整數 : 小數點左邊為 10 (二進位), 2*1+2*0 = 2
4. 計算小數 : 查表得知 小數點右邊  01 (二進位) 為 0.25
5. 將整數加上小數得到結果 : 2 + 0.25 = 2.25

撰寫研究程式 2 - MyIEEE754_2.java
public class MyIEEE754_2 {
    public static void main(String[] args) {
        System.out.println(Float.toHexString(1.0f));
        System.out.println(Float.toHexString(5.25f));
        System.out.println(Float.toHexString(0.625f));
        System.out.println(Float.toHexString(5.3f));
        System.out.println(Float.toHexString(-5.25f));           
    }
}

以下為執行結果 :

0x1.0p0
0x1.5p2
0x1.4p-1
0x1.533334p2
-0x1.5p2

2011年7月6日 星期三

一級憤怒 - jAG105

class MyBug06 {
  public static void main(String[] arg) {
   
     for(int i=0; true ; ++i)
        System.out.println(i);

     System.out.print('end');
  }
}

這簡單程式, 幾個 "編譯憤怒" ?

一級憤怒 - jAG104

public class MyBug09 {

   public static void main(String[] args){
  
       byte o = 200;
       for(int x=2;x<7;x++){
         if(x==5) break v;
         o=o+x;
       }
       v:
       System.out.println(o);
  }
}

這簡單程式, 幾個 "編譯憤怒" ?