2010年12月26日 星期日

JSP 教學 - 讀取HTML並輸出至網頁及亂碼處理

問題描述:
在部落格的自動建站中,如果使用者需要申請並建立部落格,可以將已經寫好的HTML
進行讀取並替換標籤的元素或是樣式等,並寫成一個 JSP 檔案,供使用者在網頁上瀏覽

首先先必須準備好你的HTML樣板並建立一個專們處理上述問題的類別

在使用者建立之後在後台進行呼叫,以下為 HomePageReplace.java
//import the class that you need...
public class HomePageReplace
{
    private HttpSession sess;
    private HttpServletRequest request;

    public HomePageReplace(){}
    //傳入HttpServletRequest及HttpSession 以便取得相關參數或路徑....等
    public HomePageReplace(HttpSession sess, HttpServletRequest request){
        //this.realPath = realPath;
        this.sess = sess;
        this.request = request;
    }
    //......some method

2010年12月24日 星期五

JSP 教學 - 文字段行

最近在寫部落格的模組,能讓使用者建立屬於自己的部落格

其中遇到一個問題就是如果使用者在撰寫文章時按下 Enter 鍵時,代表換行的意思

只是從後台的程式並無直接能夠知道使用者在哪邊有斷行

造成整篇文章幾乎都連在一起,以下介紹一下如何解決斷行已及偵測按下 Enter 的方法

斷行的問題在後台(例如: servlet) 可以先透過

String content = request.getParameter("參數");


content = content.replaceAll("\n", "<br />");

2010年12月22日 星期三

【C語言】Stack 堆疊實做

堆疊 .... 具有先進後出的特性,通常將資料放入推疊叫做 PUSH而將資料由堆疊中取出叫做 POP
在這邊分享一下我實做堆疊的程式


程式的實做有分三種,最簡單的是直接使用陣列製作,另一種是使用鏈結串列


而我以下的程式是以實做出 Stack (透過 struct )的方法實做堆疊的操作,如下

#define MAX_STACK_SIZE 10

typedef struct {
    int element[MAX_STACK_SIZE];
    int top;
}Stack;
//宣告 : Stack s;


以下為程式實做部份:

2010年12月21日 星期二

【C語言】二元搜尋樹的刪除實作

要考研究所,加上又是資結組的,所以無聊就來寫個.....二元搜尋樹的刪除吧

因為在書上都沒看過這類的實做,所以就實做一個吧

在刪除Binary Search Tree的某節點時,如果刪除的是樹葉節點 (Leaf) 就直接刪除

如果為非樹葉結點時 (non-Leaf) 時,就須以該刪除點為基準以左子數最大或是右子樹最小取代

以下程式的實作中,我統一以左子樹中最大的來取代刪除的點

在製作過程中較困難也最重要的是如果刪除該點後以左子樹最大取代

取代被刪除的點之後,左子樹最大的點及其父親節點和其而子結點該如何處理?

左圖為以下程式範例所建立的二元搜尋樹

以刪除20為例,程式會以左邊最大的節點15

去代 20。

2010年12月16日 星期四

十六進制轉八進制使用 C#

16進制轉成8進制,可以透過C# 的內建函數解決 Convert.toString()

如果想要實做的話就先了解如何轉換,首先 16 進制顧名思義就是遇到16就進位

所以可以表示的範圍為1 ~ 15, 但是10 ~ 15 以 A ~ F 取代

以下範例 先將 16 轉成 2 進制 > 針對每個16進制的數字 拆解成4個位元以表示2進制

 F > 1111 , 8 > 1000

最後再將 2 進制轉成 8 進制 > 針對二進位中從尾巴開始數每三個數字及組合成一個8進制數字
如果不足及補零

10101100 每三個分隔 > 10|101|100 > 不足則補零 > 010|101|100 > 轉8進制 > 254

以下為程式實做

2010年12月15日 星期三

2010年12月11日 星期六

Java 程式 - 螺旋矩陣

問題描述 :
螺旋矩陣是一個短陣,其中每個cell都填滿整數,且每個整數以螺旋的方式排列。

下圖為二個size = 8的螺旋矩陣。圖(a),數字由1開始,以逆時鐘的方向,螺旋狀地往中心排列。

而圖(b)則是一個順時鐘的螺旋矩陣,和圖(a)不一樣之處在於其數字的旋轉方向為順時鐘旋轉。


輸入說明:

輸入為一行字串,包含了兩個數值,每個數值以逗點隔開。
第一個數值為size,其值介於1到30間(i.e., 1 <= size <= 30)。
第二個數值為方向,1為順時鐘方向,2為逆時鐘方向。

2010年12月9日 星期四

JSP 教學 - 檔案下載

關於檔案下載,以下就直接以一個範例來下載一個檔案

當然這只是個最簡單的範例,其餘應用就靠各位自己發揮吧

首先在 JSP 或 HTML 可以用一個連結或是 form 請求後進入後台處理

以下為我以 C 槽的檔案進行下載
package fsc.regLogIdent.controller;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class getFile extends HttpServlet
{
    public void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException
    {
        java.io.File file = new java.io.File("C:\\bike_up.jpg");  //建立需下載檔案的 File 物件
        long length = file.length();   //取出該檔案長度
        java.io.FileInputStream fi = new java.io.FileInputStream(file);   //建立該檔案的輸入串流
        //取得客戶端的輸出流, 這邊以 OutputStream 為輸入串流的物件
        java.io.OutputStream os = response.getOutputStream();   
        //設定 response 封包中的標頭
        response.setHeader("Content-Disposition", "attachment; filename=" + "bike_up.jpg"); 
        //設定欲下載檔案的 ContentType
        response.setContentType("image/jpeg");
        //設定該檔案的長度
        response.setHeader("Content_Length", Long.toString(length));
        int r = 0;
        //將檔案讀入 FileInputStream  並寫入 OutputStream
        while((r =  fi.read()) != -1)
        {
            os.write(r);
        }
        os.close();
        fi.close();
    } 
}

2010年12月4日 星期六

JSP 教學 - 多檔上傳

前一篇介紹了檔案上傳,但是只能一次上傳一個檔案

而且做法是簡單說就是邊讀傳流的資料邊判斷編寫入,過程其實不好控制,也複雜

更重要的是也很難實現多檔上傳,所以那個方法並非非常理想,但也是個選擇

而這篇介紹的多檔上傳就是一次把串流的資料讀完再去做分檔即寫入的動作

還記得上傳的本文內容吧,以下來看看如果是多檔上傳時他的本文內容是啥樣子


------WebKitFormBoundaryGq7bBR8Pb4HYPKfp
Content-Disposition: form-data; name="uploadFile"; filename="m.txt"
Content-Type: text/plain

內容一內容一內容一內容一
 ------WebKitFormBoundaryGq7bBR8Pb4HYPKfp
Content-Disposition: form-data; name="uploadFile"; filename="m1.txt"
Content-Type: text/plain

內容二內容二內容二內容二
------WebKitFormBoundaryGq7bBR8Pb4HYPKfp-- 

2010年11月28日 星期日

JSP 教學 - 檔案上傳

檔案上傳廣泛運用在網路硬碟上,提供使用者一個空間儲存資料,接下來介紹一下檔案上傳的一些關鍵點

首先是 HTML 的部份,通常都會用一個 form 來執行,而讓使用者選擇檔案的標籤則是 input type="file",看看底下的HTML片段吧
<form action="/regLogIdent/upload.do"method="post"
                                        enctype="multipart/form-data" >
            <input type="file" name="uploadFile" />
            <input type="submit" value="submit" />
</form>
以上的 form 標籤中有一個要點即是 enctype="multipart/form-data",這是上傳文件時須加載的屬性,所以 form 送出請求時的封包格式會有些差異
以下來看看上傳檔案時封包所顯示的格式,以下為程式片斷,觀察封包的標頭及值


//透過 HttpServletRequest 的 getHeaderNames() 取得所有標頭,注意型態為 Enumeration
Enumeration e = request.getHeaderNames(); 

while(e.hasMoreElements()){
    String headername = (String)e.nextElement(); //取得標頭
      out.println(headername + " : " + 
        request.getHeader(headername) + "<br />");//用 getHeader(String headerName) 取得該標頭值
}

2010年11月21日 星期日

JSP 教學 - PreparedStatement 的使用

在一般的 Java 程式裡如果要插入一筆資料到資料表中,最基本的方法都是用 java.sql.Statement 去做,譬如:
Statement state = connection.createStatement();
state.executeUpdate("SQL 語法");
通常上面的 SQL 語法會寫的太凌亂,譬如太多的單引號和雙引號交錯導致可讀性不易,例如


state.executeQuery("INSERT INTO temp(account, user, password) VALUES('" + account + "','" + username + "','" + password + "')"); //以上的三個變數都為字串
以上有個替代方法就是利用 java.sql.PreparedStatement
可以很簡單的表示成以下


String sql = "INSERT INTO temp(account, user, password) VALUES(?, ? ,?)";
PreparedStatement prestate =  connection.prepareStatement(sql); //先建立一個 SQL 語句並回傳一個 PreparedStatement 物件
prestate.setString(1, account); //對應到第一個問號
prestate.setString(2, user); //對應到第二個問號

2010年11月15日 星期一

JSP 教學 - JavaMail 電子郵件處理

我們可以透過 JavaMail API 來進行電子郵件的處理,首先必須先去下載 JavaMail 套件

可以到 http://www.oracle.com/technetwork/java/javamail-1-4-2-141075.html

下載最新的 JavaMail 1.4.2 API ,可以選擇下載壓縮檔,下載完成並解壓縮後

我們需要的是 mail.jar 即可,如果需要處理附加檔案的話則還要另外下載

JavaBeans Activation FrameworkJAF來配合 JavaMail
接下來介紹一下 JavaMail 的用途,在寫 JSP 的登入的時候如果使用者忘記密碼


那就是用到 JavaMail 的時候了,我以 NetBeans 為例實現寄送電子郵件的功能


首先將剛剛下載的 mail.jar 匯入到 project 中,在側邊欄的 Liberaries 點擊右鍵 > Add Library

接下來可以在一個 Servlet 中進行郵件處理,在這之前可能需要先讓使用者

2010年11月13日 星期六

JSP 教學 - 圖文驗証碼製作

概述:在登入或是註冊的時候加上驗證碼,可以防止有心人批量的註冊或登入或是到取別人的
帳密。

圖形驗證碼的製作以 Java 2D 為基礎,透過 Servlet 動態產生驗證碼

這邊作法有兩種,一種是已經事先產生好大量的驗證碼再去隨機取一張,另一種是如上述的方法

動態產生一張圖形驗證碼,這樣是比較安全的狀況,如果把驗證的圖放在某目錄下又沒加以保護

很容易讓人直接以URL取得你的所有圖檔,

以 Xuite 為例就是如此,在我這製作專題的過程中就是碰到類似問題幸好.....Xuite 不是動態產生,不然專題早掛摟....

首先先配置一個 Servlet 吧,以下為 SignalPage.java

2010年10月27日 星期三

Hibernate 教學 - 值型別的 Component (二)

上一篇所說到的 Component 中,我們是以一個一對多的例子來說明

最重要的觀念就是針對 Value Type 實作出一個類別,以及在組態檔中的設定,先來看看之前組態檔的寫法

用上一篇的 Employee 組態檔來說明

<set name="photos" table="photoOne">
    <key column="employee_fk" />
    <composite-element class="MapPOJO.PhotoOne">
        <property name="photoFileName" column="photo_file_name"
                                       not-null="true" />
        <property name="width" column="width" not-null="true" />
        <property name="height" column="height" not-null="true" />
    </composite-element>
</set>

以上是一對多中 再一的這一方(Empolyee) 在指定 Employee 的 photos 屬性時的寫法

用 <composite-element> 帶出實做值型別的類別並以 <property> 子標籤指定該類別所需之屬性

2010年10月26日 星期二

Hibernate 教學 - Eclipse 環境配置

以 Eclipse 開發 Hibernate 時,首先先下載 Hibernate 的文件

此為下載的網址 http://sourceforge.net/projects/hibernate/files/hibernate3/

選一個最新的下載即可,而我以下示範是以 3.5.2 ,下載完成並解下縮後

在根目錄下的  hibernate3.jar 當然是必備的,還有 lib 資料夾下的類別庫

但是基本上其實只需要 lib 下的 required 資料夾裡的類別庫即可

接下來啟動 Eclipse 之後先行建立一個 Java WEB 的專案 testHibernate,完成後

如下將 Hibernate 類別庫加入到 Eclipse 的環境中

Window > Preferences > New > 輸入一個新的名稱 (ex: Hibernate-3.5.2)


之後點擊剛剛新建的 Libraries > Add JARs > 把 Hibernate3.jar 和 required 裡的東西加入

最後需要將我們剛剛建立的 Libraries 加入到 testHibernate 專案中

在左邊欄點擊 testHibernate 右鍵 > properties > Add Library > User Library > 選取 Hibernate-3.5.2 


最後請看下一篇

Hibernate 教學 - Hibernate 基礎簡介 http://programer-learn.blogspot.com/2011/02/hibernate.html

2010年10月23日 星期六

Java 程式教學 - System

關於 System 類別的是屬於 java.lang.System 下,先介紹它最重要的 static 變數

1.err    
   System.err 會回傳一個 PrintStream 物件
   主要是用來顯示出錯誤訊息例如提醒使用者該輸入的參數

2.in     
   System.in 會回傳一個 InputStream 物件
   此 InputStream 已經開啟(open),直接可以應用在輸入資料上
   例如: java.util.Scanner sc = new java.util.Scanner(System.in);

3.out   
   System.out 會回傳一個 OutputStream 物件
   這就是大家最常拿來用的輸出語法,System.out.println("");

2010年10月16日 星期六

Struts 教學 - 國際化處理

Struts 對於WEB有支援國際化的應用

通常在台灣地區 瀏覽器是設定為 zn_TW 繁體中文的

以 IE 為例可以選擇工具列上的 工具 > 網際網路選項 > 語言

在這底下可以設定你的偏好設定,可以點選新增來增加其他語系

並將預設的語言移動最上面即可

接下來看一下 Struts 對於國際化的支援

首先如果我們要做到支援繁體中文(zn_TW)和英文(en_US)的WEB網頁

第一步必須先定義這兩個的資源文件

以 Netbeans 在一個有選擇Struts framework 的 WEB App 為例

2010年10月7日 星期四

Hibernate 教學 - 一對多 (Value Type)

介紹一下有關值型別(Value Type) 的一對多關係映射

在之前已經討論過值型別與個體型別的差異了

以本文為例舉個例子,在一對多當中如果多的這一方並不需要一個實際的類別

例如說該資料只是一個字串,但這筆資料必須存入到資料庫當中

這時候就可以以一對多的(Value Type) 的關係映射來實現本案例

我們以一個人(Person)有多個信箱 email 來舉例

顯然的人(Person)是一,而 email 是多,而且 email 僅以字串格式儲存

來看一下 Person.java

2010年10月6日 星期三

Struts 教學 - DispatchAction 運用

在 Struts 處理請求過程中,處理請求的過程通常都是透過組態檔(struts-config.xml)

找到所設定的路徑並分派到所指定的 Action 處理。

如果你有一連串或是較相關的動作須執行,假如有四個動作

那你就可能必須分別撰寫四個 Action 來處理不同的動作....是有點麻煩

不過如果透過 DispatchAction 的話就會變的更加容易

首先運作原理是透過繼承 Action 的子類別 DispatchAction


緊接著你不必覆寫 execute() 這個 method

你可以透過請求參數決定你要的實際操作方法

簡單說如果你有個動作需要登入,那你可以在 form 標籤的 action 這樣寫

2010年10月2日 星期六

Hibernate 教學 - Entity Type 與 Value Type

之前文章出現過很多 Entity Type,例如 一對多 (Entity Type) ....等

Entity Type 可以看成是"個體型別"的意思,Value Type 則是"值型別"

區分他們的方法很簡單,以之前一對多....等 的例子來看

Room 和 Student 類別都有一個屬性 id,透過這個 id 我們可以識別不同的物件

在資料庫的領域裡,如果要識別不同的資料可以透過主鍵


這時候如果在類別中有一個可以識別物件的屬性且又對應到資料庫的主鍵時


則這個類別就是 個體型別 (Entity Type)


反之如果不存在任何一個屬性能對應到主鍵時則稱之為 值型別 (Value Type)

2010年9月30日 星期四

ActiveX 控制項建立

本來專題要用 ActiveX,結果失敗了 不過再這邊分享一下如何建置你的第一個 ActiveX 控制項

首先我是用 Microsoft Visual Basic 6.0

檔案 > 建立新專案 > ActiveX 控制項 > 確定

在右邊的的專案欄可以看到一個 UserControl1 (UserControl.ctl)   應該就是你目前看到的頁面了

接下來再做左邊的工具欄拖選 Command Button 到你的 UserControl1

再拖選一個 TextBox (Text1)即可,一樣直覺的對 Command Button 點兩下 XD

Public Function setText(txt As String)
    Text1.Text = txt
End Function


Private Sub Command1_Click()
    MsgBox Text1.Text 
End Sub


2010年9月29日 星期三

Hibernate 教學 - 雙向一對一 (雙向主鍵)

對於上一篇所提及的一對一當中,我們是以多對一的角度,並限制多的一芳外鍵唯一

即可達到一對一的效果,接下來簡單說明一下另外一個一對一的用法

想法即是讓多對一中,"一"的這一方的主鍵成為外來鍵,這樣多的這方即可不用再有外鍵關連到一的這方

以上一篇的例子來說明,Customer & Address (多對一)

即可以將 Customer 的外鍵 address_id 取消,並以 Address 的主鍵當做外鍵即可

那在這兩個類別的寫法都不變,同樣都是有關連到彼此的雙向關係

唯一不同的救是組態檔的設定,稍微來看一下

Customer.hbm.xml

<class name="MapPOJO.Customer" table="Customer">

2010年9月26日 星期日

Hibernate 教學 - 雙向一對一 (外鍵唯一)

Hibernate 再一對一當中有兩種情況,本篇先介紹 外鍵唯一的情況

在此情況中,我們可以看成 "多對一" 中,每個多的一方限制只能關連到唯一 一個 "一方"

這樣的情況下只要讓多的一方在資料表中的外鍵設定為唯一即可!!

以下舉一個 Customer 和 Address 的雙向例子,讓彼此都可參考到彼此

2010年9月23日 星期四

Struts 教學 - ActionForm

ActionForm (org.apache.struts.action.ActionForm) 基本上是個 JavaBean

擁有與 JavaBean 相同的一些規則,譬如對於屬性都須有 get/set method

而一般你建立一個 ActionForm 時都必須繼承 org.apache.struts.action.ActionForm

並且必須在組態檔 struts-config.xml 中的 <form-beans> 標籤裡建立 <form-bean>



<form-beans >
        //以下是一個 name 為 Member 並指定 type 為你繼承 ActionForm  的類別        
        <form-bean name="Member" type="fsc.useActionForm.Member" >
</form-beans >

其中有一些方法你可以覆寫它,這部份之後再多做說明。

2010年9月18日 星期六

Struts 教學 - 流程簡介

再上一篇介紹到第一個 Struts 程式,在這篇在繼續介紹他的工作原理

還記得大致上的流程以及重點吧,以下以一張簡圖說明之

2010年9月15日 星期三

Struts 教學

Struts 目前是 Apache Jakarta 的一個開源軟體,Struts 針對了 JSP, Servlet 改進

簡單說他的目的就是要減少運用 MVC model 開發的 WEB AP 的時間

在學習上這個 Framework 比較容易,比起 Hibernate 和 Spring 來說......

針對

1. Controller,Struts 統一將所有的請求不論是GET 或 POST 一律轉送到      ActionServletActionServlet 則透過組態檔 Struts-config.xml 
   來進行各個請求的配置


2. View,Struts 同樣提供了很多的 JSP 標籤庫


3. Model,主要分為 Action Form、JavaBean or EJB、Action

2010年9月11日 星期六

Java 網路程式 - Socket

java.net.Socket 類別是 Java 拿來進行用戶端 TCP 操作的一個基礎類別

首先來看看兩個比較常見的 Socket 建構式

1. public Socket(String host, int port)
       throws UnknownHostException, IOException
    參數 host 代表一個主機的名稱,而參數 int 是代表遠端連線的通訊埠
    例如:Socket socket = new Socket("tw.yahoo.com", 80);
    以上會建立一個TCP socket 並連接到所指定的遠端主機及通訊埠


2.public Socket(InetAddress host, int port)
       throws IOException
   這邊比較不同的是 host 是一個 InetAddress 物件
   例如:
   InetAddress host = InetAddress.getByName("tw.yahoo.com");
 Socket socket = new Socket(host, 80);

2010年9月9日 星期四

Hibernate 教學 - 多對多

這篇要來介紹一下在 Hibernate 中的多對多關聯

設計模式通常是採用仲介 Table 的方式來聯繫其他兩個個體間的關係

所以通常須設計三個 Table 來實現資料庫的多對多關係

在物件和物件中,盡量避免設計出多對多的關聯

我也有點同感,的確多對多關係是有那嚜一點沒必要

但是既然物件和物件有這樣的關聯那就必須去理解了

接下來說明的是多對多關聯(雙向),雙向就是彼此都認得彼此。

2010年9月6日 星期一

Java 網路程式 - 利用 URLConnection 模擬 HTTP request

以下我是利用 JSP 先撰寫一個請求表單(form),再利用 Java 的 java.net.URLConnection

模擬 form 送出的 HTTP 請求和所代之參數,最後在取得回傳網頁的內容。

先來介紹一下 URLConnection 這個抽象類別,首先

它針對了與伺服器(HTTP伺服器)的互動提供了更多的方法和一些控制

通常都是透過 URL 的 openConnection() 取得 URLConnection,例如以下:
try{
     URL url = new URL("http://tw.yahoo.com");
     URLConnection conn = url.openConnection();
}
catch(MalformedURLException e){...}
catch(IOException e){...}

2010年9月4日 星期六

Hibernate 教學 - 雙向關聯

在前兩篇有介紹到 Hibernate 的"一對多"和"多對一"關聯

而本篇的雙向關聯顧名思義就是雙方都認得對方,拿之前的資料為例子

一對多是宿舍(Room)認得好幾位學生(Student)

多對一則是好幾個學生住在同一個房間

所以先來看看的雙向關聯中  Student 和 Room 類別的寫法

基本上 Student 的寫法跟"多對一"的 Student一樣,而 Room 的寫法則同 "一對多" 的 Room

程式如下:

Java 網路程式 - InetAddress

Java 對於主機的 IP 定址以及主機名稱的相關訊息主要就是透過  java.net.InetAddress 


特別的是  InetAddress 沒有建構子

但是可以透過以下三個類別方法來取得 InetAddress 的實例

1. getLocalHost()   他會回傳目前本地端主機的 InetAddress 實例


    範例:InetAddress myHost = InetAddress.getLocalHost();


2. getByName(String)  會回傳指向傳入參數的主機之 InetAddress 實例   


    範例:InetAddress addr = InetAddress.getByName("192.168.x.yy");

2010年9月3日 星期五

Hibernate 教學 - cascade

本篇主要是說明在組態檔中所使用的 cascade 選項

在之前的 "一對多"和"多對一"教學裡面都有出現過

那它主要的用意就是所謂的 "連鎖效應",以之前的程式作為例子

在一對多的 Room.hbm.xml 中

<set name="students" table="student" cascade="all" >....</set>


如果有以上的設定時,在 JSP 中模擬了三筆學生(Student)資料和兩筆宿舍(Room)資料

分別為 student1、student2、student3 和 room1、room2

最後在用 session.save() 將 room1 和 room2 關連到資料庫

2010年9月1日 星期三

JSP - package org.apache.taglibs.standard.tag.rt.core does not exist

今天無聊在寫個討論區當練習

結果遇到了一個莫名奇妙的問題

在 compile 的時候出錯的,狀況如下:

Compiling 1 source file to C:\Documents and Settings\Administrator\My Documents\NetBeansProjects\useJSTL\build\generated\classes
C:\Documents and Settings\Administrator\My Documents\NetBeansProjects\useJSTL\build\generated\src\org\apache\jsp\index_jsp.java:93: package org.apache.taglibs.standard.tag.rt.core does not exist
org.apache.taglibs.standard.tag.rt.core.OutTag _jspx_th_c_005fout_005f0 = (org.apache.taglibs.standard.tag.rt.core.OutTag) _005fjspx_005ftagPool_005fc_005fout_0026_005fvalue_005fdefault_005fnobody.get(org.apache.taglibs.standard.tag.rt.core.OutTag.class);

2010年8月31日 星期二

Java 執行緒 - wait¬ify

繼上一篇,繼續說明 synchronized 的用法

首先,我們必須分為實體方法與類別方法

實體方法簡單說就是 non-static method,而類別方法就是 static method

其中實體方法可以寫成兩種表示式

1. synchronized void method(){..........}


2. void method(){
           synchronized (this){  //鎖定的是 this, 代表的是這個物件

2010年8月28日 星期六

Java 網路程式 - URL

在 Java 程式裡一切有關網路方面的類別都包含在 java.net 裡面
對於一般我們看到的網址即是 URL,對於 Java 來說可以透過 URL 類別將網址以字串來建立一個物件。

URL sun = new URL("http://java.sun.com");

以上的 http://java.sun.com 我們可以稱之為 "絕對URL",如果要建立"相對URL",說明如下:

譬如今天你寫了一張網頁 MyPage.html,如果在這網頁裡有一些連結可以前往其他頁面
這些頁面都是和 MyPage.html 在相同的主機以及相同的目錄之下
如:MyAlbum.html 和 MyHomework.html(如下)

2010年8月25日 星期三

Hibernate 教學 - 多對一 (Entity Type)

在上一篇談到得是一對多的關連,對於多對一來說

可以想像成一些學生會住在宿舍的同一間房間,

或是一間公司中,會有好幾個員工有同一個上司等等了。

那我還是以上一篇的多對一例子的資料表來實做多對一的關係映射

思考一下多對一的關係,即是很多個學生認得一間寢室

所以在學生 (Student) 類別裡,就必須引用所屬的寢室(Room)

程式如下:

2010年8月21日 星期六

Hibernate 教學 - 一對多 (Entity Type)

接下來會介紹很多關於 O-R Mapping,譬如一對多、多對一、一對一等

其中 在 Hibernate 對於物件的觀點,有分為 Entity type 和 Value Type

這部份我之後再詳細介紹,先來說說物件關係映射 (O-R Mapping)

在這篇要介紹的是 一對多 的關係映射

在日常生活的例子中,一對多就毫比如在宿舍裡,一間寢室有好幾個學生、或是一個使用者會有好幾個信箱。以宿舍的例子為例,我們必須記錄學生和寢室的資料

那資料表的內容及如下:


2010年8月18日 星期三

Java 程式教學

1. 將乘法表由檔案讀入,存放於集合或陣列中
2. 將集合內的元素還原成乘法表的矩陣
3. 將結果列印至螢幕

這是三上 SCJP 的作業
主要是要去讀取一個檔案
裡面存的是一個 n*m 的值(1 &lt= n,m &gt= 9),譬如說:

1 2 3 4 5 6 7 8 2 4 6 8 10 12 14 16 3 6 9 12 15 18 21 24

以上是一個 3*8 的乘法表,每個值中間都會有一個空格

那題目主要是讀取檔案並存入集合或陣列再將每個值還原成 n*m 的格式 

以下是我的程式:

2010年8月17日 星期二

Java 視窗滑鼠事件實作

在任何視窗程式中,都會有很多關於滑鼠的 Event

譬如:按下或放開滑鼠左鍵、右鍵,或是移入某特定區之類的

以下的程式主要是以一個視窗為底

那當使用者滑鼠移入視窗內時會把始窗的背景色換成黃色

並且在左上方顯示進入視窗的位置

如果在視窗內按下滑鼠左或右鍵 會在點擊處印出 DOWN

放開則會在事件發生處印出 UP

當移出視窗時則會將被景色換成白色

2010年8月15日 星期日

Hibernate 教學

今年暑假在學 Hibernate

ㄧ個 J2EE 持久層下的 framework

運用 Hibernate 可以大幅減少 JDBC 的程式複雜度

這也確實拉,起碼我寫到現在能稍微體會了 

以上是從簡化 JDBC 的角度來看 Hibernate,接下來說點更抽象的東西

在一個系統中,商業邏輯層(Business Layer) 中最核心的物件和資料庫中的 table 可並不全然是一對一的對應,而 Hibernate 可以消彌這兩者之間的不對稱

這部份還有很多東西要說,改天再一一介紹,先來說說第一個 Hibernate 的程式


首先要讓你的系統能開發 Hibernate 必須先到官方網站下載

2010年7月24日 星期六

7月24號 - 感想

現在是過渡時期

我必須要共體時艱

最近兩件事讓我 很頭痛

一是MySQL 二是 Hibernate


MySQL 我一開始在用的時候 都是用 command line client 來輸入指令

就是在一個黑漆漆的畫面輸入 SQL 語法.....

接著好多問題就來了

先來介紹一下 MySQL 好了

我是用 MySQL 5.1 一開始他的基本語系是 latin1

2010年7月21日 星期三

J2EE - JSP 檔案讀取

在 JSP 中讀取檔案,不會很難 但可能會遇到一些編碼的問題

讀檔的這個動作可能在你開發系統的時候

可以把一些數值,譬如說總瀏覽人數、或是一些紀錄存在文字檔案裡

當然總瀏覽人數你也可以透過 servletContext 或是資料庫去做

最常見的也有可能是讀取一個 PDF 檔或文字檔了

基本過程如下:

2010年7月19日 星期一

J2EE - 資料庫讀取

我一般使用的資料庫是 MySQL

先介紹一些基本的SQL語法:

建立一個名為 demo 的資料庫:

CREATE DATABASE demo;

使用 demo 資料庫:

USE demo;

建立名為 book 的資料表:

2010年7月8日 星期四

Java 執行緒 - synchronized

第二部份的東西可能會比較難揣摩,我也是這樣學過來的,尤其是在執行緒共用互斥這方面等,需要花很多時間來理解。

首先先說明 JAVA 在執行緒中互斥的概念

大家最常看到的應該就是有一個銀行的範例了,
程式大致上是說有三個執行緒模擬了三個人(甲,乙,丙)會對同一個銀行帳戶近行提款或匯款的動作

用程式的角度看,是不是覺得三個人共用一個資源感覺有點危險?

2010年7月6日 星期二

J2EE - JSP 運算式語言(EL)

JSP 2.0 引入一個新概念 -- 運算式語言,簡稱 EL。

它可以和 JSTL 或是 Scriptles 結合使用,在我平常撰寫 JSP 時也大量運用到 EL
因為比起再 JSP 裡寫一大堆雜亂的 Scriptlets 實在是不怎美觀
所以盡量能用 EL 就盡量用,但也是有些部份是 EL 沒辦法表達的,那還是要回歸到 Scriptlets。

特點:

EL 通常都長這個樣子 > ${Mybean}

2010年7月3日 星期六

J2EE - session 會話監聽

透過監聽 HTTP 會話活動,可以明瞭目前在 WEB 上的 session 數量,或是屬性建立刪除時都可以得知。這章的繪畫監聽主要是針對當使用著第一次對本伺服器請求時建立一個 HttpSession 物件,以保持對該使用者的聯繫。

當你執行 HttpServletRequest 的 getSession 方法時,如果你已經不是第一次請求,也就是說使用者送出請求時的 cookie 已經有了第一次請求的 JSESSIONID,這時候就會從 WEB 容器就會透過這個 JSESSIONID 取出你的 Session 物件。

Java 執行緒 - Thread

對於 JAVA 的多執行緒方面,基本項目上都不難理解,執行緒的基本名詞解釋幾介紹在書上一定都會有詳細的說明,但還是要透過一些簡單的程式理解。

而執行緒的應用也相當廣泛,譬如在網路程式、IO處理、GUI、多個用戶端的服務等

首先 JAVA 的執行續有兩種啟動的方法:
1.繼承 Thread 類別並呼叫 run 方法
2.實作 Runnable 介面並呼叫 run 方法


2010年6月29日 星期二

關於我

我目前剛生大四

還在想到底要唸研究所

還是學更多技術性的東西

興趣 - 寫程式

學 JAVA 大約有兩年

部落格以後會放上很多關於程式的東西