Hiển thị các bài đăng có nhãn Java. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn Java. Hiển thị tất cả bài đăng

Thứ Năm, 12 tháng 2, 2009

Tổng quan API JavaFX 1.2.1

javafx.animation : định nghĩa một bản đồ thời gian để các giá trị cho các biến, mục tiêu của nó là chuyển tiếp giữa các giá trị đã được liệt kê.

javafx.animation.transition : Cung cấp các thiết lập của các tầng lớp để quá trình chuyển đổi dễ sử dụng dựa trên hình ảnh động. Nó cung cấp một framework đơn giản để kết hợp các hình động lên một thời gian biểu nội bộ. Nó cũng cung cấp cho trình độ cao để xây dựng, sáng tác những tác động của nhiều hình ảnh động.

javafx.async : Gói này cung cấp khả năng chạy mã ứng dụng trên đề khác với thread JavaFX. Khả năng kiểm soát việc thực hiện và theo dõi sự tiến bộ của mã ứng dụng.

javafx.data:
javafx.data.feed javafx.data.feed :
javafx.data.feed.atom javafx.data.feed.atom : Gói này có tất cả các cấu trúc dữ liệu cho một phân tích tài liệu Atom.

javafx.data.feed.rss : Gói này có tất cả các cấu trúc dữ liệu cho phân tích một tài liệu RSS.

javafx.data.pull :
javafx.data.xml javafx.data.xml :
javafx.date javafx.date :
javafx.ext.swing javafx.ext.swing : Cung cấp các thiết lập của các tầng lớp người sử dụng thành phần giao diện đồ họa , đến mức độ tối đa có thể, làm việc như nhau trên tất cả các nền tảng.


javafx.fxd : Cung cấp chức năng để tải các tập tin nội dung JavaFX (FXD và định dạng FXZ) được tạo ra bởi JavaFX sản xuất Suite JavaFX nội dung. Định dạng văn bản có chứa các mô tả của nội dung đồ họa của ứng dụng JavaFX. Mô tả được nạp bởi gói này vào ứng dụng trong thời gian chạy JavaFX nội dung. Định dạng tồn tại trong hai hình thức, FXD và FXZ. FXD là một định dạng văn bản bằng cách sử dụng các đối tượng cùng một cú pháp chữ như JavaFX Script, vì vậy nó có thể sao chép và dán các mô tả từ FXD tập tin trực tiếp vào mã JavaFX Script (với một số ngoại lệ ghi ở phần cuối của tài liệu này).

javafx.geometry : Cung cấp các thiết lập của các lớp 2D để xác định và thực hiện các hoạt động trên các đối tượng liên quan đến hình hai chiều.

javafx.io :
javafx.io.http javafx.io.http :
javafx.lang javafx.lang : Gói này cung cấp cho JavaFX Script Thời gian chạy API
Builtins : Lớp này được tự động imported cho tất cả các Script JavaFX
FX : Lớp FX chứa một số điểm vào tĩnh cho một vài bộ API khác nhau được cung cấp bởi JavaFX Script.
Application Model : JavaFX Script API được phân loại thành các cấu hình sau đây.
  • Common Profile : API này là phổ biến trên tất cả các nền tảng.
  • Desktop Profile : API này chỉ có sẵn trong môi trường máy tính để bàn
  • Mobile Profile : API này chỉ có sẵn trong môi trường di động.
Argument or Parameter Handling: JavaFX Script có thể có đối số hoặc tham số trong các hình thức khác nhau:
  • Name : Tham số tên đi theo hình thức Tên một, cặp giá trị thường từ HTML, JAD hoặc JNLP tập tin. They can also be passed as a commandline argument in the form of "name=value". Họ cũng có thể được thông qua như là một đối số commandline trong các hình thức "giá trị = tên". Sử dụng getArgument () api cho các tham số có tên trong.
  • UnName : Chưa đặt tên đối số luôn luôn được thông qua ngày commandline này. Sử dụng FX.getArguments () api cho các tham số có tên trong

javafx.reflect : Cung cấp truy cập đến JavaFX phản chiếu các loại giá trị. Gói này định nghĩa một API Java (chứ không phải là một API JavaFX), vì vậy nó có thể được sử dụng từ cả hai Java và mã JavaFX Một tương lai JavaFX API có thể được phân tầng trên đầu trang này.

Các đối tượng trong gói này là trực tiếp hay gián tiếp tạo ra từ một FXContext. Trong trường hợp mặc định có một FXContext đơn dụ có sử dụng Java reflection.
  • Bạn nhận được một trong những bằng cách thực hiện: FXLocal.Context ctx = FXLocal.getContext ();
  • Ngoài ra, bạn có thể làm: FXContext ctx = FXContext.getInstance ();
DangTrung.

Chạy ứng dụng JavaFX Emulator Mobile với Eclipse IDE

Phần này cho thấy như thế nào để chạy một ứng dụng JavaFX trên Emulator Điện thoại di động bằng cách sử dụng IDE Eclipse, trong đó có các plugin JavaFX cài đặt. Các JavaFX Mobile Emulator được đi kèm với SDK JavaFX và hiện đang có sẵn trên nền tảng Windows chỉ.

Các ứng dụng JavaFX giao diện lập trình (API) bao gồm máy tính để bàn và các cấu hình chung. Cấu hình máy tính để bàn có máy tính để bàn-lớp học cụ thể mà không thể chạy trong các ứng dụng di động. Khi bạn sử dụng cấu hình chung để xây dựng các ứng dụng JavaFX của bạn, bạn đảm bảo rằng các ứng dụng của bạn có thể chạy trên cả máy tính để bàn và các thiết bị di động.


Trong phần trước, bạn xây dựng một ứng dụng JavaFX gọi là FirstJavaFXApp và chạy nó như là một ứng dụng desktop bằng cách sử dụng cấu hình máy tính để bàn cho các ứng dụng đang chạy. Trong phần này, bạn sẽ tìm hiểu để chạy các ứng dụng cùng một mã số trên một màn hình khác nhau bằng cách sử dụng JavaFX Mobile Emulator.

  • Bắt đầu IDE Eclipse, nếu chưa bắt đầu.
  • Mở các dự án FirstJavaFXApp rằng bạn đã tạo trong phần trước, nếu không đã được mở ra.
  • Mở rộng FirstJavaFXApp > src > gstutorial nút trong cửa sổ Package Explorer.
  • Nhấp chuột phải vào nút Main.fx và chọn Run As> Run Cấu hình.
  • Trong hộp thoại Run Configurations, nhấp thả xuống mũi tên trong Profile - Mục tiêu hộp combo và chọn Mobile Profile - Khởi trong Emulator từ danh sách, như được hiển thị trong hình dưới đây.

Lưu ý là sau khi bạn chọn các hồ sơ di động, một hộp thoại cảnh báo xuất hiện, như được hiển thị trong hình dưới đây. Nó sẽ cho bạn biết rằng dự án này đã được biên dịch trước đó theo cấu hình máy tính để bàn. Khi bạn thay đổi cấu hình hoạt động của một dự án, nó được khuyến khích là bạn cũng thay đổi các dự án biên dịch hồ sơ thời gian để phù hợp với cấu hình chạy bạn đang cố gắng sử dụng. Nếu không, các dự án có thể không chạy như mong đợi.


Thay đổi biên dịch hồ sơ thời gian để di động.
  • Nhấp vào dự án Cấu hình biên dịch kết cấu thời gian, mà là vòng tròn màu đỏ trong hình 2 ở trên.
  • Trong tiết cho JavaFX Hệ thống hộp thoại Thư viện, chọn Điện thoại di động như các hồ sơ, như trong hình 3, và nhấn OK.
  • IDE biên dịch với cấu hình mới. Nếu có bất kỳ lỗi nào hiển thị, bạn cần phải đảm bảo rằng các dự án biên dịch thành công với các biên dịch mới-cấu thời gian trước khi thử khởi động dự án một lần nữa.

Quay lại trong Cấu Hình hộp thoại Run, chọn Run.

IDE biên dịch các dự án và chuẩn bị các file cần thiết để chạy các ứng dụng bằng cách sử dụng các mô hình di động thực hiện hồ sơ. Khi dự án được biên dịch thành công, một mặt cầu động được hiển thị trên màn hình của thiết bị di động trong Emulator Điện thoại di động, như trong hình 4.


Bạn đã chỉ cần chạy ứng dụng JavaFX đầu tiên của bạn trên Emulator Mobile.

DangTrung.

Thứ Tư, 11 tháng 2, 2009

Bắt đầu với Công nghệ JavaFX Sử dụng Eclipse IDE (Phần 3)

Trong phần này, bạn thêm opacity và hình ảnh động mà thay đổi các mặt cầu của opacity.
Trong trình soạn thảo mã nguồn, và thêm những biến opacity ở đầu nguồn tập tin và đặt giá trị ban đầu của nó đến 1.0, như được hiển thị ở đây in đậm.

import javafx.scene.paint.Color;
import javafx.scene.paint.RadialGradient;
import javafx.scene.paint.Stop;

var opacity = 1.0;

Biến này được sử dụng trong thời gian hoạt hình mà bạn tạo sau này.

Thêm biến dụ opacity cho đối tượng Circle sơ thẩm và ràng buộc này để biến các biến toàn cầu opacity như được in đậm trong ví dụ mã sau đây.

Circle {
    centerX: 100,
    centerY: 100,
    radius: 90,
    opacity: bind opacity
    fill: RadialGradient {
          centerX: 75
          centerY: 75
          radius: 90
          proportional: false
          stops: [
               Stop {
                    offset: 0.0
                    color: Color.web("#3B8DED")
               },
          Stop {
                offset: 1.0
                color: Color.web("#044EA4")
          }
      ] // stops
    } // RadialGradient
} //Circle

Mở rộng phần Ảnh động trong xem đoạn, chọn Thời gian biểu, và kéo đoạn mã Thời gian biểu cho dòng ngay trên các khối mã Stage như thể hiện trong hình dưới đây.



Hoạt hình xảy ra cùng một thời gian, đại diện bởi một đối tượng javafx.animation.Timeline Dòng thời gian chứa một hay nhiều khung chính, đại diện bởi các đối tượng javafx.animation.KeyFrame Để biết thêm thông tin về hoạt hình,. Thấy Tạo đối tượng hoạt hình, một bài học trong xây dựng giao diện ứng dụng với JavaFX.

Trong hộp thoại Insert Tiêu bản cho Thời gian biểu, thay đổi giá trị của các biến Ví dụ time từ 1s đến 5s và nhấn Insert.

Các Timeline tượng chữ xuất hiện như được hiển thị ở đây.

Timeline {
        repeatCount: Timeline.INDEFINITE,
        keyFrames : [
             KeyFrame {
                    time : 5s,
                    canSkip: true
             } // KeyFrame
        ] // keyFrames
} // Timeline


Dòng thời gian này lặp đi lặp lại vô thời hạn trên một năm thứ hai khoảng. Giá trị của các biến Ví dụ time năm giây, xác định thời gian trôi qua mà tại đó các giá trị trong khung chính sẽ được đặt trong một chu trình đơn của các đối tượng Timeline. Hai người tiếp theo của các bước của hướng dẫn này xác định những giá trị mà sẽ được thiết lập.

Kéo Ảnh động> clip mã giá trị từ các đoạn nhằm dòng chỉ sau khi biến canSkip


Values xác định danh sách các biến mục tiêu và các giá trị mong muốn rằng họ nên suy tại thời chỉ định của KeyFrame

Trong hộp thoại Insert Tiêu bản cho các giá trị, thay đổi các giá trị của value từ 0.0 đến 0.2 và giá trị của variable đến opacity

Mã số này thay đổi độ mờ của hình cầu.

Click vào Insert. Các biến values hiện nay như được hiển thị ở đây in đậ

Timeline {
        repeatCount: Timeline.INDEFINITE,
        KeyFrames : [
              KeyFrame {
                     time : 5s,
                     canSkip: true
                     values : [
                             opacity => 0.2 tween Interpolator.LINEAR
                     ] // values
              } // KeyFrame
        ] // keyFrames
} // Timeline

Giá trị mong muốn của các biến opacity được định nghĩa trong năm thứ hai khoảng của khung chính. Các nhà điều hành cung cấp một constructor chữ (một ký hiệu đặc biệt) mà làm cho nó dễ dàng hơn để thể hiện trong danh sách các khóa-giá trị nội suy hoặc tài sản đối tượng.

Trong trường hợp này, các nhà điều hành tween xây dựng các giá trị nội suy cho opacity giữa 1,0 và 0,2 để tạo ra sự thay đổi dần dần trong opacity của hình cầu.
Thay đổi giá trị xen vào từ LINEAR để EASEBOTH. Các Interpolator.EASEBOTH là xây dựng trong xen vào dụ cung cấp để dễ-in và dễ dàng ra hành vi.

Thêm một ví dụ Key Frame để cung cấp một sự thay đổi của độ đục từ 0.2 đến 1.0 trong năm thứ hai sau khoảng thời. Sao chép khối Key Frame mã thứ hai đó là được in đậm trong ví dụ mã sau và dán nó ngay dưới các Key Frame đầu tiên đối tượng như được hiển thị tiếp theo.

Timeline {
      repeatCount: Timeline.INDEFINITE,
      keyFrames : [
            KeyFrame {
                  time : 5s,
                  canSkip: true
                  values : [
                        opacity => 0.2 tween Interpolator.EASEBOTH
                  ] // values
            } // KeyFrame
            KeyFrame {
                   time : 10s,
                   canSkip: true
                   values : [
                           opacity => 1.0 tween Interpolator.EASEBOTH
                   ] // values
            } // KeyFrame
      ] // keyFrames
} // Timeline

.play(); đến hết các đối tượng khai báo Timeline như được in đậm trong ví dụ mã sau đây.
Các play() phương thức đóng các dòng thời gian như được định nghĩa. Các đối tượng Timeline hoàn thành được hiển thị ở đây.

Timeline {
      repeatCount: Timeline.INDEFINITE,
      keyFrames: [
             KeyFrame {
             time: 5s,
             canSkip: true
             values : [
                   opacity => 0.2 tween Interpolator.EASEBOTH
             ] // values
      } // KeyFrame
      KeyFrame {
            time: 10s,
            canSkip: true
            values : [
                      opacity => 1.0 tween Interpolator.EASEBOTH
            ] // values
      } // KeyFrame
] // keyFrames
}.play();

Lưu các thay đổi mới nhất mà bạn đã thực hiện, chọn nút Main.fx trong Package Explorer, nhấp vào mũi tên thả xuống bên cạnh biểu tượng Run Khởi Biểu tượng trên thanh công cụ chính on the main toolbar, and select gstutorial.Main from the list. trên thanh công cụ chính, và gstutorial.Main chọn từ danh sách.

Bạn vừa tạo đầu tiên ứng dụng JavaFX động của bạn.

Thứ Ba, 10 tháng 2, 2009

Bắt đầu với Công nghệ JavaFX Sử dụng Eclipse IDE (Phần 2)

Trong phần 1 chúng ta đã đi qua các bước tạo một dự án JavaFX và các giải thích về ví dụ cho dự án FirstJavaFXApp, về Main.fx, insert Stage và Scene.

Phần tiếp theo này tôi sẽ tiếp tục phân tích cấu trúc như thế nào.

Sửa đổi các đối tượng Scene để xác định các văn bản mà bạn muốn xuất hiện trong các ứng dụng. Bạn cũng cần phải thêm tuyên bố nhập khẩu đối với các lớp TextAlignment
  • Thêm các báo cáo, nhập khẩu sau đây ở đầu tập tin, ngay bên dưới nơi mà các câu import đầu tiên đã được xác định.
import javafx.scene.text.*;
  • Sửa đổi các biến content như trong ví dụ mã sau đây. Bạn có thể sao chép những dòng in đậm và dán chúng vào trong trình biên tập để thay thế cho khối content mã hiện tại.
Stage {
title: "First JavaFX App"
scene: Scene {
width: 250
height: 250
content: [
Text {
font: Font { size: 22 }
x: 20, y: 90
textAlignment: TextAlignment.CENTER
content:"Welcome to \nJavaFX World"
}
//Text
]
// content
} // Scene
} // Stage

Xác định các đối tượng Circle cơ bản mà từ đó bạn tạo các mặt cầu bằng cách mở rộng phần Basic Shapes trong xem đoạn và kéo đoạn mã Circle ở dòng phía trên khối mã Text như thể hiện trong hình dưới đây.


  • Trong hộp thoại Insert Tiêu bản cho Circle sửa đổi biến radius của hình tròn có giá trị 90 và nhấn Insert.
Circle đoạn mã được bổ sung vào nguồn Main.fx , cùng với những điều khoản về nhập khẩu cần thiết cho việc Circle và Color.
  • Đặt con trỏ chuột trên Circle từ để cho phép các lớp Circle API sẽ được hiển thị trong một cửa sổ bật lên, như thể hiện trong hình dưới đây.

Bạn có thể nhấp vào bên trong cửa sổ bật lên để xem tài liệu API cho toàn bộ lớp. Click anywhere in the source editor to dismiss the API pop-up window. Click vào bất cứ nơi nào trong trình biên tập mã nguồn để sa thải API cửa sổ bật lên.


Thêm một RadialGradient mới cài đặt vào vòng tròn. Điều này tạo ra độ sâu vòng tròn và làm cho nó trông giống như hình cầu.
  • Ở phía trên của các tập tin Main.fx thêm những điều khoản về nhập khẩu bao gồm các gói chứa RadialGradient và Stop các lớp học được sử dụng trong các mã mà bạn đang thêm. Bắt đầu bằng cách gõ dòng mã sau đây.
import javafx.scene.paint.

Ở cuối dòng, bạn chỉ cần gõ, nhấn Ctrl + phím dài để xem cửa sổ pop-up hoàn thành mã cửa sổ, như thể hiện trong hình dưới đây. Chọn RadialGradient từ danh sách và nhấn Enter.


Lặp lại các bước trước để thêm những điều khoản về nhập khẩu đối với các lớp Stop cũng là cần thiết để xác định các gradient xuyên tâm của hình cầu. Sau đây là những điều khoản về nhập khẩu mà cần phải có được thêm vào.

import javafx.scene.paint.RadialGradient;
import javafx.scene.paint.Stop;

Thay thế fill biến trong các nguồn Main.fx tập tin với mã nguồn sau đây in đậm. Bạn có thể sao chép những dòng in đậm, trong đó có đóng dấu ngoặc vuông và niềng răng cho các biến fill và dán chúng vào trình soạn thảo mã nguồn.

Stage {
    title: "First JavaFX App"
    scene: Scene {
        width: 250
        height: 250
        content: [
            Circle {
                centerX: 100,
                centerY: 100,
                radius: 90,
                fill: RadialGradient {
                     centerX: 75,
                     centerY: 75,
                     radius: 90
                     proportional: false
                     stops: [
                           Stop {
                                offset: 0.0
                                color: Color.web("#3B8DED")
                           },
                           Stop {
                                offset: 1.0
                                color: Color.web("#044EA4")
                           }
                    ] // stops
               } // RadialGradient
           } // Circle
           Text {
                font: Font { size: 22 }
                x: 20, y: 90
                textAlignment: TextAlignment.CENTER
                content:"Welcome to \nJavaFX World"
           } //Text
       ] // content
    } // Scene
} // Stage

Lưu mã nguồn (Ctrl + S trên Windows và Cmd + S trên Mac) và điều hành dự án để xem một bản xem trước của những gì bạn đã làm được cho đến nay.

Nhấp chuột phải vào FirstJavaFXApp > src > gstutorial> Main.fx nút trong gói Explorer và chọn Run As> JavaFX Application.

Trong hộp thoại Edit Configuration, thông báo rằng trong Profile - Mục tiêu trường được cấu hình chạy mặc định được sử dụng là máy tính để bàn, như trong hình 12. Để cấu hình máy tính để bàn-Khởi như ứng dụng như là hồ sơ chạy mục tiêu.

Bạn cũng có tùy chọn để điều hành dự án JavaFX như một applet, như là một ứng dụng Java Web Start, hoặc là một ứng dụng di động bằng cách chọn Profile thích hợp - Mục tiêu lựa chọn từ danh sách thả xuống.


Chọn Run.

Một cửa sổ mới hiển thị các lĩnh vực mà bạn vừa tạo ra, như được hiển thị trong hình dưới đây.


Thoát ra đầu JavaFX App cửa sổ và tiếp tục với phần còn lại của hướng dẫn.

Chúng ta đã hoàn thành một ví dụ với JavaFX. Chúng các bạn thành công.

DangTrung.

Thứ Hai, 9 tháng 2, 2009

Bắt đầu với Công nghệ JavaFX Sử dụng Eclipse IDE (Phần 1)

Tạo ứng dụng JavaFX của bạn Sử dụng Eclipse IDE

Phần này cho bạn biết cách tạo ứng dụng JavaFX đầu tiên của bạn bằng cách sử dụng IDE Eclipse và JavaFX plugin cho Eclipse. VD: Bạn tạo một hình cầu đơn giản với văn bản. Các mặt cầu thay đổi độ mờ trong một khoảng thời gian xác định. Ứng dụng này chạy như hiển thị trong hình dưới đây.

Tạo dự án JavaFX
Sử dụng các bước trong phần này để tạo ra JavaFX của dự án, mà sẽ chứa các tập tin nguồn cho các ứng dụng JavaFX đầu tiên của bạn. Lưu ý rằng màn hình chụp được sử dụng trong tài liệu này đã được đưa vào một hệ thống Windows XP.
  • Đảm bảo rằng IDE Eclipse của bạn đã có các plugin cho Eclipse JavaFX phần mềm được cài đặt. Nếu cần thiết, bạn có thể xem lại bài đầu về những gì để Download và cài đặt.
  • Bắt đầu IDE Eclipse, nếu nó không phải là đã bắt đầu. Đóng màn hình chào, nếu nó xuất hiện.
  • Tạo một dự án mới JavaFX.
  • Chọn File > New > Dự án để bắt đầu New Project Wizard.
  • Mở rộng nút JavaFX, chọn nút JavaFX dự án, và nhấn Next, như trong hình 1.

Trong hộp thoại Welcome, như trong hình 2, xem lại các thông tin về việc thu thập dữ liệu sử dụng và bấm vào OK nếu bạn đồng ý tham gia.

 Trong Tạo một JavaFX trang Dự án, FirstJavaFXApp loại cho tên dự án, như được hiển thị trong hình ảnh tiếp theo.


Bạn có thể tạo một dự án mới từ đầu hoặc từ một nguồn đã hiện có, như được hiển thị trong mục lục. Đối với hướng dẫn này, để lựa chọn mặc định cho Tạo dự án mới trong không gian làm việc.

Để lại giá trị mặc định tất cả các thay đổi trong JavaFX Tạo một dự án trang và nhấp vào Kết thúc.
Desktop la hồ sơ JavaFX mặc định được sử dụng cho một dự án mới JavaFX. Hồ sơ này đặt các ứng dụng chạy trên desktop. Cấu thoại di động cho phép bạn chạy các ứng dụng trên thiết bị di động hay các công cụ JavaFX Mobile Emulator được đóng gói chung với SDK JavaFX. Mặc định của hệ thống Java Runtime Environment (JRE) cài đặt được sử dụng cho dự án JavaFX mới mà bạn đang tạo.

(Tùy chọn) Nếu bạn cài đặt SDK JavaFX trong không một vị trí mặc định, bạn có thể được nhắc nhở để thiết lập biến JAVAFX_HOME. Làm theo các hướng dẫn để thiết lập biến này classpath. Hãy chắc chắn rằng bạn bấm vào thư mục trong hộp thoại Edit Variable và điều hướng đến vị trí của thư mục cài đặt JavaFX SDK,
ví dụ, javafx-sdk1.2. Sau khi địa điểm đó được thiết lập, tiếp tục với bước kế tiếp dưới đây.

Khi được nhắc để mở viễn cảnh JavaFX, nhấp Có.
Các Perspective JavaFX đảm bảo rằng các đoạn JavaFX và Outline xem có sẵn cho bạn khi bạn đang làm việc trên ứng dụng JavaFX.

IDE tiếp tục với việc tạo ra dự án. Dự án FirstJavaFXApp mở ra trong cửa sổ Package Explorer, như trong hình 4. Chú ý rằng đoạn cửa sổ bên phải trở nên có sẵn sau khi bạn tạo các dự án và sau đó hiển thị các đoạn mã JavaFX mà bạn có thể sử dụng.



Thêm các gói Java và Main.fx File
  • Tạo gói Java cho dự án.
  • Mở rộng các thư mục trong Explorer FirstJavaFXApp gói.
  • Các thư mục con bao gồm các thư mục cho các tập tin nguồn và thư viện cần thiết của dự án.
  • Nhấp chuột phải vào thư mục src và chọn New > trọn gói.
  • Trong hộp thoại New Java trọn gói, nhập gstutorial trong trường văn bản tên và nhấp vào Kết thúc.

Tạo nguồn Main.fx tập tin.
  • Nhấp chuột phải vào gstutorial và chọn New > JavaFX Script rỗng.
  • Trong hộp thoại New JavaFX Script, gõ Main trong lĩnh vực văn bản tên và nhấp vào kết thúc.
  • Các tập tin Main.fx được mở ra ở khu vực biên tập mã nguồn.

Thêm vào Giai đoạn mẫu.
  • Trong cửa sổ đoạn mở rộng nó, nhấp vào tab ứng dụng để mở rộng nó.
  • Chọn và kéo đối tượng Stage đến trình soạn thảo mã nguồn, như trong hình 7.

Trong hộp thoại Insert tiêu bản cho Stage chỉnh sửa title width và các biến height như trong hình 8.


Click vào Insert.

Chú ý rằng đoạn mã Giai đoạn bao gồm các đối tượng literals Stage và Scene. Các câu import cho Stage và Scene gói đã được tự động thêm khi đoạn mã đã được nạp. Những đối tượng literals đại diện cho các khái niệm quan trọng trong các ứng dụng JavaFX và được mô tả trong bảng sau.

Stage : The top-level container cửa sổ cần thiết để hiển thị các đối tượng JavaFX nào nhìn thấy được. Những ví dụ title mặc định các biến, width và height xác định các văn bản xuất hiện trên biên giới trên cùng của cửa sổ và cửa sổ của chiều cao và chiều rộng. Các biến scene xác định một thể hiện của các Scene đối tượng chữ, đưa các lĩnh vực mà bạn có thể đặt các đối tượng JavaFX.

Scene : Tương tự như một bản vẽ mặt cho các nội dung đồ họa của các ứng dụng của bạn. Các biến dụ scene có một biến content đó được sử dụng để giữ JavaFX yếu tố đồ họa và xác định nội dung đồ họa của các ứng dụng của bạn. Các biến Ví dụ, xác định chiều rộng và chiều cao của các khu vực nội dung. Để biết thêm thông tin về các lớp Scene xem giới thiệu giao diện đối tượng trong một cảnh đồ họa, một bài học trong xây dựng giao diện ứng dụng với JavaFX.

DangTrung.

Chủ Nhật, 8 tháng 2, 2009

Công nghệ JavaFX dùng trong Eclipse IDE

Bài viết này cung cấp một số thông tin tóm tắt về công nghệ JavaFX. Nó giải thích những gì để download và cài đặt để bắt đầu sử dụng công nghệ JavaFX với IDE Eclipse. Nó cũng mô tả cách tạo ứng dụng JavaFX đầu tiên của bạn bằng cách sử dụng IDE Eclipse, cùng với JavaFX SDK và JavaFX plugin cho Eclipse. Thông tin về các ứng dụng mẫu có sẵn và các ứng dụng chạy trên một giả lập điện thoại di động cũng được bao gồm trong bài viết này.

JavaFX là gì?

JavaFX là một nền tảng rich client platform để xây dựng các ứng dụng và nội dung qua điện thoại. Được thiết kế để cho phép dễ dàng tạo ra và triển khai các ứng dụng Internet (RIAS) với phương tiện truyền thông immersive media and content, nền tảng JavaFX đảm bảo rằng RIAS nhìn thấy và thi hành một cách nhất quán trên các yếu tố hình thức đa dạng và các thiết bị.

Các JavaFX Software Development Kit (SDK) và JavaFX Plugin cho Eclipse cho phép bạn dể phát triển, gỡ lỗi, và triển khai ứng dụng JavaFX trong môi trường Eclipse phát triển tích hợp (IDE).


Download và cài đặt những gì?

Các thành phần sau đây cần phải được cài đặt trên hệ thống của bạn trước khi phát triển các ứng dụng JavaFX trong IDE Eclipse.  

Lưu ý rằng các plugin JavaFX cho Eclipse có sẵn cho các hệ thống Windows và Mac, và có bản Beta chỉ hỗ trợ cho Linux Ubuntu.
Trước khi bạn tiến hành cài đặt, xem lại các Plugin JavaFX cho Eclipse Ghi chú Phát hành cho các yêu cầu hệ thống, tính năng mới, và các vấn đề được biết đến và hạn chế.

Download và cài đặt JavaFX SDK 1.2.1.

Chú ý rằng phiên bản này của JavaFX plugin cho Eclipse hiện đang được hỗ trợ bằng cách sử dụng JavaFX SDK 1.2.1. Bạn phải tải JavaFX 1.2.1 SDK đầu tiên và hoàn thành việc cài đặt bằng cách làm theo hướng dẫn cài đặt JavaFX SDK. The JavaFX SDK cung cấp các công cụ dòng lệnh và các công nghệ để phát triển nội dung diễn cảm cho các ứng dụng triển khai tới các trình duyệt, máy tính để bàn, và các thiết bị di động.

Đảm bảo rằng bạn đã tải về và cài đặt Eclipse IDE for Java EE Developers.

Eclipse 3,5 Galileo là phiên bản hiện hành. Nêú bạn dùng Mac OS bạn nên tải về và cài đặt 64-bit Cocoa Eclipse IDE for Java EE Developers (Galileo SR1).

IDE Eclipse cung cấp một môi trường phát triển tích hợp cho việc xây dựng, gỡ lỗi, và chạy các ứng dụng Java.

Cài đặt các bản phát hành hiện tại của JavaFX Plugin cho Eclipse.


Plugin này cung cấp tính năng cho phép bạn chỉnh sửa, xây dựng, và gỡ lỗi các ứng dụng JavaFX trong Eclipse IDE. Biên tập viên của một tập hợp các tính năng kéo và thả đoạn để nhanh chóng thêm các đối tượng JavaFX với biến đổi, hiệu ứng, và hoạt hình. Plugin này cũng đi kèm với một tập các mẫu mà bạn có thể học hỏi và làm việc với khi bạn học các ngôn ngữ JavaFX Script.  Để biết thêm thông tin về những gì kèm với plugin này, đọc các Plugin JavaFX cho Eclipse Release Notes.

Cài đặt các bản phát hành hiện tại của JavaFX Plugin cho Eclipse bằng cách theo các thiết lập thích hợp theo hướng:
  • Sử dụng Eclipse 3.5 để cài đặt JavaFX plugin cho lần đầu tiên
  • Cập nhật trình cài đặt plugin JavaFX hiện bằng cách sử dụng Eclipse 3,5

Sử dụng Eclipse 3.5 để cài đặt JavaFX Plugin cho lần đầu tiên:
  • Khởi động IDE Eclipse. Chỉ định một đường dẫn cho thư mục Eclipse không gian làm việc của bạn, nếu được nhắc, và đóng màn hình Welcome nếu nó xuất hiện
  • Từ trình đơn chính của IDE, chọn Trợ giúp > Cài đặt phần mềm mới.
  • Nhấp vào Thêm trong hộp thoại có sẵn phần mềm.
  • Trong hộp thoại Thêm trang web, JavaFX loại trong trường văn bản tên và loại http://javafx.com/downloads/eclipse-plugin/ trong lĩnh vực văn bản, như trong hình 1. Click OK. Nhấp OK.
Chọn hộp kiểm JavaFX Features và bấm Next, như thể hiện trong hình dưới đây.


  • Trong hộp thoại Cài đặt chi tiết, xem xét và xác nhận các mục JavaFX năng chọn đúng là phiên bản được cài đặt. Click Next. Nhấn Next.
  • Xem xét và chấp nhận các điều khoản của thỏa thuận cấp phép và nhấp vào Kết thúc.
  • IDE tiếp tục với việc cài đặt phần mềm JavaFX plugin.
  • Khi được nhắc khởi động lại Nền tảng Eclipse, hãy nhấp vào Yes.
Cập nhật trình cài đặt plugin JavaFX hiện bằng cách sử dụng Eclipse 3.5:
  • Bắt đầu IDE Eclipse. Chỉ định một đường dẫn cho thư mục Eclipse không gian làm việc của bạn, nếu được nhắc, và đóng màn hình chào, nếu nó xuất hiện.
  • Chọn giúp > Giới Eclipse từ trình đơn chính của IDE.
  • Nhấp vào Cài đặt chi tiết, như trong hình 3.

Trong chi tiết cài đặt Eclipse hộp thoại, chọn tính năng JavaFX trong tab Phần mềm cài đặt và nhấn Cập nhật, như được hiển thị trong hình bên cạnh.


Khi được nhắc khởi động lại Nền tảng Eclipse, hãy nhấp vào Yes.

Hướng dẫn tiếp theo với Tạo các ứng dụng JavaFX đầu tiên của bạn Sử dụng Eclipse IDE . 

Chúc bạn thành công.
DangTrung.

Chủ Nhật, 1 tháng 6, 2008

Tìm hiểu về Hibernate Framework

I. Giới thiệu:
Persistence là nói đến khả năng một đối tượng duy trì sự tồn tại sau thời gian sống của chương trình tạo ra nó. Nếu không có khả năng này, dữ liệu chỉ tồn tại trong bộ nhớ và sẽ mất đi khi bộ nhớ tắt hoặc máy tính shutdown.

Có một vài loại persistence, ví dụ: khi bạn hiệu chỉnh một file source thì file đó sẽ được persist xuống đĩa để lần sau rút trích và sử dụng. Các file được lưu trên đĩa là hình thức phổ biến nhất của persistence. Trong ứng dụng, ví dụ như shopping cart thì persist dữ liệu trong một CSDL quan hệ.

CSDL quan hệ là một sự chọn lựa phổ biến để lưu dữ liệu vì dữ liệu dễ dàng được tạo và truy cập bằng SQL. Mô hình được sử dụng bởi CSDL quan hệ được gọi là mô hình quan hệ, biểu diễn dữ liệu dưới dạng bảng hai chiều. Các table có thể liên quan nhau thông qua việc sử dụng khóa chính và khóa ngoại. Khóa chính đảm bảo không có hai record trong bảng có cùng giá trị. Khóa ngoại tham chiếu đến khóa chính được lưu trong một bảng khác.

CSDL quan hệ được thiết kế để quản lý dữ liệu theo mô hình quan hệ. Tuy nhiên khi làm việc với các ứng dụng hướng đối tượng, bạn có thể gặp một số vấn đề khi bạn cố gắng persist các đối tượng vào trong mô hình quan hệ. Với sự khác biệt của hai mô hình, làm thế nào để chúng làm việc được với nhau. Để giải quyết vấn đề này object/relational mapping (ORM) ra đời.

ORM là một cầu nối giữa hai mô hình, cho phép ứng dụng của bạn persist các đối tượng trực tiếp vào CSDL quan hệ mà không cần chuyển đổi qua lại giữa object và relational. Có một vài ORM framework yêu cầu các đối tượng kế thừa từ lớp cơ bản (base) hoặc yêu cầu xử lý bytecode. Trong khi đó, Hibernate chỉ yêu cầu một số lượng nhỏ metadata cho mỗi đối tượng persistent. Nó cung cấp đầy đủ ánh xạ đối tượng/quan hệ, nghĩa là hỗ trợ tất cả các đặc trưng hướng đối tượng mà CSDL quan hệ thiếu.

II. Cơ bản về Hibernate:
Cấu hình:
Hibernate được cấu hình theo hai bước:
  • Cấu hình service bao gồm: tham số kết nối CSDL, caching và tập các lớp persistent.
  • Cung cấp cho Hibernate các thông tin về các lớp được persist.
Để giải quyết hai bước theo yêu cầu của Hibernate, chúng ta sẽ thảo luận từng vấn đề sau:
  • Tạo file cấu hình hibernate.cfg.xml.
  • Xây dựng các file định nghĩa ánh xạ để cung cấp cho Hibetnate các thông tin về các lớp persistent.
  • Các lớp được sử dụng để persist và rút trích các lớp.
  • Cấu hình nâng cao bao gồm: object caching và quản lý giao dịch.
Cấu hình cơ bản:
Hibernate cung cấp 2 phương pháp cấu hình: file properties theo chuẩn của Java được gọi là hibernate.properties và file có định dạng XML gọi là hibernate.cfg.xml. Chúng ta sẽ sử dụng file cấu hình XML để cấu hình các service của Hibernate. Nếu cả hai file hibernate.properties và hibernate.cfg.xml được tìm thấy trong classpath của ứng dụng thì hibernate.cfg.xml sẽ override lên các thiết lập được tìm thấy trong hibernate.properties.

Trước khi cấu hình Hibernate, đầu tiên bạn nên xác định service giữ kết nối đến CSDL như thế nào. Kết nối đến CSDL có thể được cung cấp bởi Hibernate hoặc từ JNDI DataSource. Một phương pháp thứ ba là kết nối JDBC được cung cấp bởi người dùng.

Sử dụng kết nối JDBC được quản lý bởi Hibernate:
Sau đây là file cấu hình mẫu sử dụng loại kết nối JDBC được quản lý bởi Hibernate:

   
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
       
             
                   uid
                   pwd
                   jdbc:mysql://localhost/db
                   com.mysql.jdbc.Driver
                  org.hibernate.dialect.MySQLDialect
                 
                 
                
               
          

Để sử dụng JDBC connection được cung cấp bởi Hibernate, file cấu hình yêu cầu 5 thuộc tính: connection.driver_class, connection.url, connection.username, connection.password, dialect.

Thuộc tính dialect bảo cho Hibernate biết SQL dialect nào được sử dụng để thao tác. Nó được sử dụng để đảm bảo các câu Hibernate Query Language (HQL) được chuyển đổi đúng với SQL dialect dưới CSDL.

Hibernate cũng cần biết vị trí (đường dẫn tương đối so với classpath của ứng dụng) và tên của các mapping file - mô tả persistent classs.

Sử dụng JNDI DataSource:
Để sử dụng Hibernate với kết nối CSDL được cung cấp bởi JNDI DataSource, bạn cần thay đổi một vài chỗ trong file cấu hình như sau:

"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
    
           jdbc/myDataSource
           org.hibernate.dialect.MySQLDialect
          
           
          
          
     

Bạn chỉ sử dụng loại cấu hình này khi sử dụng Hibernate với application server: Jboss, WebSphere...Thuộc tính connection.datasource phải có cùng giá trị với tên của JNDI DataSource trong cấu hình application server.

Tạo định nghĩa ánh xạ:
Các định nghĩa ánh xạ được gọi là mapping document, được sử dụng để cung cấp cho Hibernate các thông tin để lưu trữ các đối tượng đến CSDL quan hệ. Các file ánh xạ cung cấp các đặc tính như tạo lược đồ CSDL từ tập hợp các file ánh xạ.

Các định nghĩa ánh xạ cho các đối tượng persistent có thể được lưu chung với nhau trong cùng một file. Phương pháp thích hợp hơn là định nghĩa cho mỗi đối tượng được lưu trong một file.

Quy ước đặt tên cho các file ánh xạ là sử dụng tên của persistent class với phần mở rộng hbm.xml. Ví dụ: File ánh xạ cho lớp Event có tên là Event.hbm.xml.

   
          
               
          
          
          
          
          
          
              
              
          
          
              
              
         
     

File ánh xạ bắt đầu bằng hibernate-mapping element. Thuộc tính package thiết lập package mặc định cho lớp. Thuộc tính set, bạn cần cung cấp tên của lớp persistent khác như: Speaker và Attendee.

Thẻ class bắt đầu định nghĩa ánh xạ cho lớp persistent xác định, thuộc tính table là tên của quan hệ (relational) được sử dụng để lưu các đối tượng.

Element mô tả khóa chính của persistent class - tự động được phát sinh. Thuộc tính name định nghĩa các thuộc tính của persistent class sẽ được sử dụng để lưu giá trị của khóa chính.

Element được sử dụng để xác định tên của lớp phát sinh khóa chính cho record mới khi lưu nó. Ở đây chúng ta sử dụng lớp native.

Sau đây là danh sách các generator phổ biến được sử dụng trong Hibernate:
  • increment - phát sinh id (loại long, short hoặc int) là duy nhất chỉ khi không có tiến trình khác chèn dữ liệu vào cùng bảng.
  • identity - nó hỗ trợ cột id trong DB2, MySQL, MS SQL Server, Sybase và HypersonicSQL. Id được trả về có loại long, short hoặc int.
  • sequence - phát sinh sequence sử dụng một sequence trong DB2, PostgreSQL, Oracle, SAP DB, McKoi hoặc Interbase. Id được trả về có loại long, short hoặc int.
  • hilo - Bộ phát sinh hilo sử dụng thuật toán hilo để phát sinh id.
  • native - Nó sẽ chọn id, sequence hoặc hilo phụ thuộc vào khả năng CSDL phía dưới.
Thuộc tính unsaved-value mô tả giá trị của thuộc tính id cho các thể hiện transient của lớp đó.

Các thuộc tính:
Element property của đối tượng Event thì tương tự như element id:

Mỗi element property này tương ứng với một thuộc tính trong đối tượng Event. Thuộc tính name chứa tên thuộc tính, thuộc tính type xác định loại đối tượng của thuộc tính. Column được sử dụng để lưu giá trị của thuộc tính.

Element many-to-one:
Định nghĩa mối quan hệ với lớp Location. Mối quan hệ nhiều - một sử dụng khóa ngoại để duy trì mối quan hệ giữa hai lớp persistent.

Từ hình bạn có thể suy diễn rằng: nhiều thể hiện của Event kết hợp với một thể hiện của Location. Mặc dù hình không hiển thị nó nhưng mối quan hệ này thì không phải hai chiều nghĩa là bạn có thể định vị đến Location từ Event nhưng không thể ngược lại. Ở điểm này chúng ta sẽ biểu diễn file ánh xạ của lớp Location như sau:

     
           
                
           
           
           
      

Ánh xạ của lớp này thì tương tự như Event mặc dù nó không có thuộc tính nhiều và thiếu mối quan hệ với các đối tượng persistent khác.

Đối với Event, element many-to-one định nghĩa tham chiếu giữa các đối tượng persistent. Ánh xạ mối quan hệ many-to-one như sau:


Thuộc tính name cung cấp tên của thuộc tính trong đối tượng và thuộc tính column xác định column được sử dụng để lưu khóa ngoại đến bảng location. Thuộc tính class cung cấp tên của lớp persistent cần quan hệ.

Một câu hỏi phổ biến được đặt ra là: làm thế nào để tạo mối quan hệ many-to-one lazy - nghĩa là đối tượng được kết hợp với nó sẽ không được rút trích khi đối tượng cha được rút trích. Các giải quyết là sử dụng proxied objects.

Proxy:
Object proxy là cách tránh rút trích một đối tượng cho đến khi cần đến nó. Định nghĩa nó bằng 2 cách:

Thêm thuộc tính proxy vào element class:
...

Sử dụng thuộc tính lazy = "true" là cách ngắn nhất để định nghĩa lớp persistent như proxy:
...

Thuộc tính lazy là true mặc định trong Hibernate 3. Cách sử dụng thể hiện proxied Location:

Session session = factory.openSession();
Event ev = (Event) session.load(Event.class, myEventId);
Location loc = ev.getLocation();
String name = loc.getName();
session.close();

Trả về thể hiện của Location là proxy. Hibernate lấy thể hiện Location khi getName() được gọi.

Collections:
File ánh xạ định nghĩa các collection của Speakers và Attendees. Collection được định nghĩa là set - nghĩa là Hibernate quản lý các collection với ngữ cảnh là java.util.Set.


Định nghĩa này khai báo rằng lớp Event có một thuộc tính tên là speakers và nó là một Set chứa các thể hiện của lớp Speaker. Lớp Event có thuộc tính tương ứng như sau:

public class Event {
private Set speakers;
...
public void setSpeakers(Set speakers) {
This.speakers = speakers;
}
public Set getSpeakers() {
return this.speakers;
}
...
}

Element key định nghĩa khóa ngoại từ bảng collection đến bảng cha. Trong trường hợp này, bảng speakers có một column event_id tham chiếu đến column id trong bảng events. Element one-to-many định nghĩa mối quan hệ với lớp Speaker.

Ngoài Set Hibernate còn hỗ trợ Map và List.

Cascade:
Các thao tác lan truyền theo tầng trên một bảng (như delete) đến các bảng kết hợp. Giả sử, khi delete Event, bạn cũng muốn delete các thể hiện Speaker kết hợp với Event. Thay vì code trong ứng dụng sẽ thực hiện, Hibernate có thể quản lý nó thay cho bạn.

Các loại cascade: all, save-update, delete, delete-orphan.

Element cascade được thêm vào many-to-one hoặc element collection. Ví dụ cấu hình sau sẽ hướng dẫn Hibernate delete các Speaker con khi Event cha bị delete:


Duyệt các đối tượng kết hợp:
Bạn có thể rút trích các đối tượng kết hợp sử dụng outer join hoặc bằng câu lệnh SELECT. Thuộc tính fetch cho phép bạn xác định các phương thức để sử dụng:


Khi thể hiện Event được load thì đối tượng Location kết hợp cũng sẽ được load bằng outer join. Nếu muốn sử dụng câu lệnh select thì sẽ sử dụng như sau:


Xây dựng SessionFactory:
Giao tiếp SessionFactory của Hibernate cung cấp các thể hiện của lớp Session để biểu diễn các kết nối đến CSDL. Thể hiện của SessionFactory là thread-safe và chia sẽ suốt ứng dụng. Các thể hiện Session không phải là thread-safe và chỉ nên được sử dụng cho một transaction hoặc đơn vị làm vị trong ứng dụng.

Cấu hình SessionFactory:
Lớp Configuration:
Lớp này là sự mở đầu runtime của Hibernate. Nó được sử dụng để load các file ánh xạ và tạo SessionFactory cho các file ánh xạ này. Mỗi lần 2 chức năng này hoàn tất, lớp Configuration có bị vứt bỏ. Tạo một thể hiện của Configuration và Session thì đơn giản nhưng bạn có một vài tùy chọn. Có 3 cách để tạo và khởi tạo đối tượng Configuration.

Đoạn mã sau sẽ load các file property và mapping được định nghĩa trong hibernate.cfg.xml và tạo SessionFactory:

Configuration cfg = new Configuration();
SessionFactory factory = cfg.configure().buildSessionFactory();

Phương thức configure() bảo Hibernate load file hibernate.cfg.xml. Nếu như nó không tồn tại thì chỉ hibernate.properties được load từ classpath. Lớp Configuration cũng có thể load mapping document:

Configuration cfg = new Configuration();
cfg.addFile("com/manning/hq/ch03/Event.hbm.xml");
Một phương pháp khác để Hibernate load mapping document là dựa vào lớp persistent. Ví dụ, code sau sẽ khiến cho Hibernate tìm file có tên là com/manning/hq/Event.hbm.xml trong classpath và load các lớp kết hợp:

Configuration cfg = new Configuration();
cfg.addClass(com.manning.hq.ch03.Event.class);

Nếu ứng dụng có 10 hoặc 100 mapping definitions. Bạn có thể tạo file JAR (ví dụ như application.jar) chứa tất cả file class và mapping definitions. Sau đó cập nhật file hibernate.cfg.xml:


Và bạn cũng có thể làm điều này với phương thức addJar của lớp Configuration:

Configuration.addJar(new java.io.File("application.jar"));

Cả 4 phương pháp này đều được sử dụng để xác định mapping definition phụ thuộc vào các yêu cầu của project. Tuy nhiên mỗi khi bạn tạo SessionFactory từ thể hiện Configuration, thì bất kỳ file mapping nào được thêm đến thể hiện của Configuration sẽ không ảnh hưởng trong SessionFactory. Nghĩa là bạn không thể thêm một lớp persistent mới một cách tự động.

Bạn có thể sử dụng thể hiện của SessionFactory để tạo thể các thể hiện của Session:
Session session = factory.openSession();

Các thể hiện của lớp Session là giao tiếp chính của Hiberante framework. Chúng cho phép bạn persist các đối tượng, truy vấn các đối tượng persistent và làm cho các đối tượng transient trở thành persistent.

Persistent các đối tượng:
Persist đối tượng transient (tạm thời) với Hibernate thì đơn giản - lưu nó với thể hiện Session:

Event event = new Event();
// populate the event
Session session = factory.openSession();
session.save(event);
session.flush();

Gọi phương thức save(....) cho thể hiện Event sẽ gán cho nó một giá trị id được phát sinh và sau đó là persist nó. Phương thức flush() ép các đối tượng persistent được giữ trong bộ nhớ được đồng bộ xuống CSDL. Session không lập tức ghi liền xuống CSDL khi đối tượng được lưu. Thay vào đó, Session sẽ sắp xếp các lần ghi để tăng tốc độ thực thi.

Nếu bạn muốn cập nhật một đối tượng đã được persistent, phương thức update() thì có sẵn. Sự khác biệt của phương thức update() so với phương thức save() là nó không gán giá trị id cho đối tượng. Bởi vì sự khác biệt này nên giao diện Session cung cấp phương thức saveOrUpdate() để xác định thao tác đúng để thực thi trên đối tượng.

Sau đây là đoạn mã để persist thể hiện Event:

Configuration cfg = new Configuration();
SessionFactory factory = cfg.buildSessionFactory();
Event event = new Event();
// populate the Event instance
Session session = factory.openSession();
session.saveOrUpdate(event);
session.flush();
session.close();

Hai dòng đầu tạo SessionFactory sau đó load file cấu hình từ classpath. Sau khi thể hiện Event được tạo và rút trích, thể hiện Session được cung cấp bởi SessionFactory sẽ persist Event này. Session được flush và close (đóng kết nối JDBC và dọn dẹp bên trong). Đó là tất cả những gì phải làm để persist các đối tượng.

Rút trích đối tượng:
Event event = (Event) session.load(Event.class, eventId);
=> trả về thể hiện của Event với id bằng với eventId.

Query query = session.createQuery("from Event");
List events = query.list();
=> trả về toàn bộ các đối tượng từ CSDL.

Sử dụng PreparedStatement cho câu truy vấn:
Query query = session.createQuery("from Event where name = ?",
"Opening Presentation");
query.setParameter(0, "Opening Presentation", Hibernate.STRING);
List events = query.list();

(Con tiếp)
DangTrung.

Thứ Năm, 10 tháng 4, 2008

Lập trình hướng đối tượng

Lập trình hướng đối tượng (gọi tắt là OOP, từ chữ Anh ngữ object-oriented programming), hay còn gọi là lập trình định hướng đối tượng, là kĩ thuật lập trình hỗ trợ công nghệ đối tượng. OOP được xem là giúp tăng năng suất, đơn giản hóa độ phức tạp khi bảo trì cũng như mở rộng phần mềm bằng cách cho phép lập trình viên tập trung vào các đối tượng phần mềm ở bậc cao hơn. Ngoài ra, nhiều người còn cho rằng OOP dễ tiếp thu hơn cho những người mới học về lập trình hơn là các phương pháp trước đó.

Một cách giản lược, đây là khái niệm và là một nỗ lực nhằm giảm nhẹ các thao tác viết mã cho người lập trình, cho phép họ tạo ra các ứng dụng mà các yếu tố bên ngoài có thể tương tác với các chương trình đó giống như là tương tác với các đối tượng vật lý.

Những đối tượng trong một ngôn ngữ OOP là các kết hợp giữa mã và dữ liệu mà chúng được nhìn nhận như là một đơn vị duy nhất. Mỗi đối tượng có một tên riêng biệt và tất cả các tham chiếu đến đối tượng đó được tiến hành qua tên của nó. Như vậy, mỗi đối tượng có khả năng nhận vào các thông báo, xử lý dữ liệu (bên trong của nó), và gửi ra hay trả lời đến các đối tượng khác hay đến môi trường.

Lịch sử

Khái niệm về các đối tượng và thực thể trong khoa học máy tính được nhiều người biết đến từ hệ thống PDP-1 của đại học MIT. Đây có lẽ là thí dụ sớm nhất của kiến trúc cơ sở có khả năng thực. Một bằng chứng sớm sủa khác của OOP được tìm thấy qua Sketchpad viết bởi Ivan Sutherland trong năm 1963, tuy nhiên, đây chỉ là một ứng dụng chứ không là một mẫu hình lập trình.

Ngôn ngữ lập trình định hướng đối tượng đầu tiên đã là Simula, ngôn ngữ này được thiết kế để dùng trong các việc mô phỏng, được sáng tạo bởi Ole-Johan Dahl và Kristen Nygaard thuộc Trung tâm Máy tính Na Uy ở Oslo. Các kiến thức trong ngôn ngữ này sau đó đã được dùng trong nhiều ngôn ngữ khác, bắt đầu từ Lisp và Pascal cho đến họ ngôn ngữ Smalltalk.

Lập trình hướng đối tượng đã được phát triển như là phương pháp lập trình chủ đạo từ giữa thập niên 1980 nguyên do đáng kể là việc ảnh hưởng của C++, một ngôn ngữ mở rộng của C. Địa vị thống trị của OOP đã được củng cố vững chắc bởi sự phổ biến của các GUI dành cho ngôn ngữ lập trình hướng đối tượng ngày càng tiện lợi. Một thí dụ về quan hệ gần gũi của thư viện GUI động và ngôn ngữ OOP là phần mềm Cocoa, nó là khung cơ sở của Mac OS X dược viết bằng Objective C (Objective C là một loại ngôn ngữ định hướng đối tượng mở rộng của C với việc thông báo động). Công cụ cho OOP cũng được nâng cao phần "lập trình điều khiển theo sự kiện" (mặc dù khái niệm này không chỉ dành cho OOP).

Tại Zürich, Niklaus Wirth và những cộng sự đã theo dõi các đề tài như là dữ liệu trừu tượng và lập trình mô đun. Modula-2 bao gồm cả hai đặc tính đó. Thiết kế liền tiếp theo là Oberon bao gồm sự tiếp cận riêng biệt với việc định hướng đối tượng, các lớp,... Sự tiếp cận này không như Smalltalk, và cũng khác hẳn C++.

Các chức năng của định hướng đối tượng cũng đã đang được thêm vào nhiều ngôn ngữ trong suốt thời gian đó kể cả ADA, BASIC, Lisp, Fortran, Pascal và nhiều nữa. Việc cộng thêm các chức năng đó cho các ngôn ngữ mà được trước đó không chủ định thiết kế cho chúng ngay từ đầu cũng thường dẫn tới nhiều khó khăn trong khả năng tương thích (với mã nguồn viết cho các phiên bản cũ) và khả năng bảo trì mã. Điển hình của trường hợp này là Pascal và Visual Basic. Các ngôn ngữ thuần túy định hướng đối tượng, ở phía khác, lại thiếu các đặc tính mà nhiều người lập trình phụ thuộc vào. Để bắc cầu cho khoảng trống này, nhiều nỗ lực đã được xúc tiến dể tạo ra các ngôn ngữ đặt cơ sở trên các phương pháp định hướng đối tượng nhưng lại cho phép dùng nhiều đặc tính lập trình cấu trúc theo những phương cách "an toàn". Ngôn ngữ Eiffel của Bertrand Meyer đã sớm thành công với các mục tiêu này.

Trong thập niên đã qua, Java được dùng rộng rãi một phần là do sự tương tự với C và C++, nhưng có lẽ do phần khác quan trọng hơn là việc lắp đặt sử dụng máy ảo mà chủ ý là thực thi cùng một mã nguồn cho nhiều nền tảng khác nhau. Microsoft.NET cũng mở đầu với các chủ ý tương tự và cộng thêm việc hỗ trợ nhiều ngôn ngữ hay các sự biến thể của các ngôn ngữ cũ (như trưòng hợp C# và Visual Basic).

Gần đây, một số ngôn ngữ xuất hiện với chức năng chính là định hướng đối tượng nhưng lại tương thích được với phương pháp thủ tục như là Python và Ruby. Bên cạnh Java, C# và Visual Basic.NET là hai ngôn ngữ OOP quan trọng hiện tại thiết kế bởi Microsoft.

Giống như lập trình thủ tục đã dẫn tới việc tinh lọc các kỹ thuật như là lập trình cấu trúc, phần mềm định hướng đối tượng hiện đại thiết kế các phương pháp bao gồm các sự tinh lọc. Chẳng hạn như là việc ứng dụng các dạng thức thiết kế, thiết kế bởi hợp đồng và các ngôn ngữ mô hình trong đó có UML.

Các tính chất cơ bản


  • Đối tượng (object): Các dữ liệu và chỉ thị được kết hợp vào một đơn vị đầy đủ tạo nên một đối tượng. Đơn vị này tương đương với một chương trình con và vì thế các đối tượng sẽ được chia thành hai bộ phận chính: phần các phương thức (method) và phần các thuộc tính (attribute). Trong thực tế, các phương thức của đối tượng là các hàm và các thuộc tính của nó là các biến, các tham số hay hằng nội tại của một đối tượng (hay nói cách khác tập hợp các dữ liệu nội tại tạo thành thuộc tính của đối tượng). Các phương thức là phương tiện để sử dụng một đối tượng trong khi các thuộc tính sẽ mô tả đối tượng có những tính chất gì.
    Các phương thức và các thuộc tính thường gắn chặt với thực tế các đặc tính và sử dụng của một đối tượng.
    Trong thực tế, các đối tượng thường được trừu tượng hóa qua việc định nghĩa của các lớp (class).
    Tập hợp các giá trị hiện có của các thuộc tính tạo nên trạng thái của một đối tượng.
    Mỗi phương thức hay mỗi dữ liệu nội tại cùng với các tính chất được định nghĩa (bởi người lập trình) được xem là một đặc tính riêng của đối tượng. Nếu không có gì lầm lẫn thì tập hợp các đặc tính này gọi chung là đặc tính của đối tượng.
Lập trình hướng đối tượng là một phương pháp lập trình có các tính chất chính sau:

  • Tính trừu tượng (abstraction): Đây là khả năng của chương trình bỏ qua hay không chú ý đến một số khía cạnh của thông tin mà nó đang trực tiếp làm việc lên, nghĩa là nó có khả năng tập trung vào những cốt lõi cần thiết. Mỗi đối tượng phục vụ như là một "động tử" có thể hoàn tất các công việc một cách nội bộ, báo cáo, thay đổi trạng thái của nó và liên lạc với các đối tượng khác mà không cần cho biết làm cách nào đối tượng tiến hành được các thao tác. Tính chất này thường được gọi là sự trừu tượng của dữ liệu.
    Tính trừu tượng còn thể hiện qua việc một đối tượng ban đầu có thể có một số đặc điểm chung cho nhiều đối tượng khác như là sự mở rộng của nó nhưng bản thân đối tượng ban đầu này có thể không có các biện pháp thi hành. Tính trừu tượng này thường được xác định trong khái niệm gọi là lớp trừu tượng hay lớp cơ sở trừu tượng.

  • Tính đóng gói (encapsulation) và che giấu thông tin (information hiding): Tính chất này không cho phép người sử dụng các đối tượng thay đổi trạng thái nội tại của một đối tượng. Chỉ có các phương thức nội tại của đối tượng cho phép thay đổi trạng thái của nó. Việc cho phép môi trường bên ngoài tác động lên các dữ liệu nội tại của một đối tượng theo cách nào là hoàn toàn tùy thuộc vào người viết mã. Đây là tính chất đảm bảo sự toàn vẹn của đối tượng.

  • Tính đa hình (polymorphism): Thể hiện thông qua việc gửi các thông điệp (message). Việc gửi các thông điệp này có thể so sánh như việc gọi các hàm bên trong của một đối tượng. Các phương thức dùng trả lời cho một thông điệp sẽ tùy theo đối tượng mà thông điệp đó được gửi tới sẽ có phản ứng khác nhau. Người lập trình có thể định nghĩa một đặc tính (chẳng hạn thông qua tên của các phương thức) cho một loạt các đối tượng gần nhau nhưng khi thi hành thì dùng cùng một tên gọi mà sự thi hành của mỗi đối tượng sẽ tự động xảy ra tương ứng theo đặc tính của từng đối tượng mà không bị nhầm lẫn.
Thí dụ khi định nghĩa hai đối tượng "hinh_vuong" và "hinh_tron" thì có một phương thức chung là "chu_vi". Khi gọi phương thức này thì nếu đối tượng là "hinh_vuong" nó sẽ tính theo công thức khác với khi đối tượng là "hinh_tron".

  • Tính kế thừa (inheritance): Đặc tính này cho phép một đối tượng có thể có sẵn các đặc tính mà đối tượng khác đã có thông qua kế thừa. Điều này cho phép các đối tượng chia sẻ hay mở rộng các đặc tính sẵn có mà không phải tiến hành định nghĩa lại. Tuy nhiên, không phải ngôn ngữ định hướng đối tượng nào cũng có tính chất này.

DangTrung.

Thứ Hai, 18 tháng 2, 2008

Tích hợp Spring, Hibernate và Axis2

+ Model class
Product.java
package org.sample.model;

import java.math.BigDecimal;

public class Product {

private Integer productId;

private String productName;

private String description;

private Float weight;

private BigDecimal price;

private Integer categoryId;

public Integer getCategoryId() {
return categoryId;
}

public void setCategoryId(Integer categoryId) {
this.categoryId = categoryId;
}

public Integer getProductId() {
return productId;
}

public void setProductId(Integer productId) {
this.productId = productId;
}

public String getProductName() {
return productName;
}

public void setProductName(String productName) {
this.productName = productName;
}

public String getDescription() {
return description;
}

public void setDescription(String description) {
this.description = description;
}

public Float getWeight() {
return weight;
}

public void setWeight(Float weight) {
this.weight = weight;
}

public BigDecimal getPrice() {
return price;
}

public void setPrice(BigDecimal price) {
this.price = price;
}
}

Category.java
package org.sample.model;

public class Category {

private Integer categoryId;

private String categoryName;

public Integer getCategoryId() {
return categoryId;
}

public void setCategoryId(Integer categoryId) {
this.categoryId = categoryId;
}

public String getCategoryName() {
return categoryName;
}

public void setCategoryName(String categoryName) {
this.categoryName = categoryName;
}

}


Product.hbm.xml
version="1.0"?>
hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
      "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
package="org.sample.model">
      name="Product" table="PRODUCT">
            name="productId" column="PRODUCT_ID" type="java.lang.Integer">
                  class="increment"/>
           
            name="productName" type="java.lang.String" column="PRODUCT_NAME"/>
            name="description" type="java.lang.String" column="DESCRIPTION"/>
            name="weight" type="java.lang.Float" column="WEIGHT"/>
            name="price" type="java.math.BigDecimal" column="PRICE"/>
            name="categoryId" type="java.lang.Integer" column="CATEGORY_ID"/>
     

Category.hbm.xml
version="1.0"?>
hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
      "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
package="org.sample.model">
      name="Category" table="CATEGORY">
            name="categoryId" column="CATEGORY_ID" type="java.lang.Integer">
                  class="increment"/>
           
            name="categoryName" type="java.lang.String" column="CATEGORY_NAME"/>
     

+ Dao class
ProductDAO.java
package org.sample.dao;

import org.sample.model.Product;

public interface ProductDAO {
      public void createProduct(Product product);

      public void updateProduct(Product product);

      public void deleteProduct(Product product);

      public Product getProduct(Integer productId);

      public Product[] listAllProduct();
}

CategoryDAO.java
package org.sample.dao;

import org.sample.model.Category;

public interface CategoryDAO {

      public void createCategory(Category cat);

      public void updateCategory(Category cat);

      public void deleteCategory(Category cat);
     
      public Category getCategory(Integer categoryId);

      public Category[] getAllCategories();

}

ProductDAOImpl.java
package org.sample.dao.impl;

import org.sample.dao.ProductDAO;
import org.sample.model.Product;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

public class ProductDAOImpl extends HibernateDaoSupport implements ProductDAO {

      public void createProduct(Product product) {
            getHibernateTemplate().save(product);
      }

      @SuppressWarnings("unchecked")
      public Product[] listAllProduct() {
            Product[] products = new Product[0];
            return (Product[]) getHibernateTemplate().find("from Product").toArray(products);
      }

      public Product getProduct(Integer productId) {
            Product pro1 = (Product) getHibernateTemplate().load(Product.class,
                        productId);
            Product pro2 = new Product();
            pro2.setProductId(pro1.getProductId());
            pro2.setProductName(pro1.getProductName());
            pro2.setCategoryId(pro1.getCategoryId());
            pro2.setPrice(pro1.getPrice());
            pro2.setWeight(pro1.getWeight());
            pro2.setDescription(pro1.getDescription());
            return pro2;
      }

      public void updateProduct(Product product) {
            getHibernateTemplate().update(product);
      }

      public void deleteProduct(Product product) {
            getHibernateTemplate().delete(product);
      }

}

CategoryDAOImpl.java
package org.sample.dao.impl;

import java.util.List;

import org.sample.dao.CategoryDAO;
import org.sample.model.Category;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

public class CategoryDAOImpl extends HibernateDaoSupport implements CategoryDAO {

      public void createCategory(Category cat) {
            getHibernateTemplate().save(cat);
      }

      public void deleteCategory(Category cat) {
            getHibernateTemplate().delete(cat);
      }

      @SuppressWarnings("unchecked")
      public Category[] getAllCategories() {
            List list = getHibernateTemplate().find("from Category");
            Category[] categories = (Category[]) list.toArray();
            return categories;
      }

      public void updateCategory(Category cat) {
            getHibernateTemplate().update(cat);
      }

      public Category getCategory(Integer categoryId) {
            Category cat1 = (Category) getHibernateTemplate().get(Category.class,
                        categoryId);
            Category cat2 = new Category();
            cat2.setCategoryId(cat1.getCategoryId());
            cat2.setCategoryName(cat1.getCategoryName());
            return cat2;
      }
}

+ Service class (call dao)
ProductService.java
CategoryService.java
ProductServiceImpl.java
CategoryServiceImpl.java


+ applicationContext.xml
beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
      id="applicationContext"
            class="org.apache.axis2.extensions.spring.receivers.ApplicationContextHolder"/>
     
      id="dataSource"
            class="org.springframework.jdbc.datasource.DriverManagerDataSource">
            name="driverClassName">
                  com.mysql.jdbc.Driver
           
            name="url">
                  jdbc:mysql://localhost:3306/product_management
           
            name="username">
                  root
           
            name="password">
                  root
           
     
     
      id="hibernateInterceptor"
            class="org.springframework.orm.hibernate3.HibernateInterceptor">
            name="sessionFactory">
                  bean="sessionFactory"/>
           
     
     
     
      id="sessionFactory"
            class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
            name="dataSource">
                  local="dataSource"/>
           
            name="mappingResources">
                 
                        org/sample/model/Category.hbm.xml
                        org/sample/model/Product.hbm.xml
                 
           
            name="hibernateProperties">
                 
                        key="hibernate.dialect">
                              org.hibernate.dialect.MySQLDialect
                        key="hibernate.show_sql">true
                 
           
          
     
     
     
      id="hibernateTemplate"
            class="org.springframework.orm.hibernate3.HibernateTemplate">
            name="sessionFactory">
                  bean="sessionFactory"/>
           
     
     
     
     
     
      id="productDao" class="org.sample.dao.impl.ProductDAOImpl">
            name="hibernateTemplate">
                  local="hibernateTemplate"/>
           
     
     
      id="productServiceTarget"
            class="org.sample.service.impl.ProductServiceImpl">
            name="productDao">
                  local="productDao"/>
           
     
     
      id="productService"
            class="org.springframework.aop.framework.ProxyFactoryBean">
            name="target">
                  local="productServiceTarget"/>
           
            name="proxyInterfaces">
                  org.sample.service.ProductService
           
            name="interceptorNames">
                 
                        hibernateInterceptor
                 
           
     
     
     
      id="categoryDao" class="org.sample.dao.impl.CategoryDAOImpl">
            name="hibernateTemplate">
                  local="hibernateTemplate"/>
           
     
     
      id="categoryServiceTarget"
            class="org.sample.service.impl.CategoryServiceImpl">
            name="categoryDao">
                  local="categoryDao"/>
           
     
     
      id="categoryService"
            class="org.springframework.aop.framework.ProxyFactoryBean">
            name="target">
                  local="categoryServiceTarget"/>
           
            name="proxyInterfaces">
                  org.sample.service.CategoryService
           
            name="interceptorNames">
                 
                        hibernateInterceptor
                 
           
     

+ services.xml
      name="SpringInit" class="org.sample.service.SpringInit">
            This web service initializes Spring.
            name="ServiceClass">
                  org.sample.service.SpringInit
            name="ServiceTCCL">composite
            name="load-on-startup">true
            name="springInit">
                 
                        class="org.apache.axis2.receivers.RawXMLINOutMessageReceiver"/>
           
     
      name="productService">
            name="ServiceClass">
                  org.sample.service.impl.ProductServiceImpl
            name="ServiceObjectSupplier">
                  org.apache.axis2.extensions.spring.receivers.SpringAppContextAwareObjectSupplier
            name="SpringBeanName">productService
           
                  mep="http://www.w3.org/2004/08/wsdl/in-only"
                        class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"/>
                  mep="http://www.w3.org/2004/08/wsdl/in-out"
                        class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
           
     
      name="categoryService">
            name="ServiceClass">
                  org.sample.service.impl.CategoryServiceImpl
            name="ServiceObjectSupplier">
                  org.apache.axis2.extensions.spring.receivers.SpringAppContextAwareObjectSupplier
            name="SpringBeanName">categoryService
           
                  mep="http://www.w3.org/2004/08/wsdl/in-only"
                        class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"/>
                  mep="http://www.w3.org/2004/08/wsdl/in-out"
                        class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
           
     

+ Client class
CreateProductSpringClient.java
UpdateProductSpringClient.java
package org.sample.client;

import javax.xml.namespace.QName;
import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;
import org.sample.model.Category;

public class UpdateCategorySpringClient {
      public static void main(String[] args) throws AxisFault {

            RPCServiceClient serviceClient = new RPCServiceClient();

            Options options = serviceClient.getOptions();

            EndpointReference targetEPR = new EndpointReference(
                        "http://127.0.0.1:8989/axis2/services/categoryService");

            options.setTo(targetEPR);

            // get products
            QName opGetCategory = new QName("http://impl.service.sample.org",
                        "getCategory");

            Object[] opGetCategoryArgs = new Object[] { new Integer(4) };
            Class[] returnTypes = new Class[] { Category.class };

            Object[] response = serviceClient.invokeBlocking(opGetCategory,
                        opGetCategoryArgs, returnTypes);

            Category cat = (Category) response[0];

            // Displaying the result
            System.out.println("CategoryId         : " + cat.getCategoryId());
            System.out.println("CategoryName       : " + cat.getCategoryName());

            // update Product
            EndpointReference targetEPR1 = new EndpointReference(
                        "http://127.0.0.1:8989/axis2/services/categoryService");

            options.setTo(targetEPR1);

            cat.setCategoryName("Games");

            Object[] opGetCategoryArgs1 = new Object[] { cat };

            System.out.println("Category id:" + cat.getCategoryId());

            QName opGetCategory1 = new QName("http://impl.service.sample.org",
                        "updateCategory");

            serviceClient.invokeRobust(opGetCategory1, opGetCategoryArgs1);

            System.out.println("xong roi");
      }
}

DeleteProductSpringClient.java
ListProductSpringClient.java
package org.sample.client;

import javax.xml.namespace.QName;
import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;
import org.sample.model.Product;

public class ListProductSpringClient {
      public static void main(String[] args) throws AxisFault {
            RPCServiceClient serviceClient = new RPCServiceClient();

            Options options = serviceClient.getOptions();

            EndpointReference targetEPR = new EndpointReference(
                        "http://127.0.0.1:8989/axis2/services/productService");

            options.setTo(targetEPR);

            // get products
            QName opGetProduct = new QName("http://impl.service.sample.org",
                        "listAllProduct");

            Object[] opGetProductArgs = new Object[] {};
            Class[] returnTypes = new Class[] { Product[].class };

            Object[] response = serviceClient.invokeBlocking(opGetProduct,
                        opGetProductArgs, returnTypes);

            Product[] products = (Product[]) response[0];
           
            for (int i = 0; i < products.length; i++) {
                  Product pro = (Product) products[i];
                  System.out.println("product name:" + pro.getProductName());
            }
      }
}

+ Library
cglib.jar
common-collection.jar
ehcache.jar
dom4j.jar
jta.jar
hibernate3.jar
mysql-connector.jar
antlr-2.7.5H3.jar

Chú ý: copy tất cả thư mục con của thư mục classes trong thư mục target vào C:\Program Files\Apache Software Foundation\Tomcat 6.0\webapps\axis2\WEB-INF\classes

Tip
+ Lỗi java.lang.IllegalStateException: No valid ObjectCreator found <= thiếu stax-1.2.0.jar file
+ Có thể sử dụng eclipse plugin để phát sinh WSDL file: http://ws.apache.org/axis2/tools/index.html
+ SOAP: nghi thức trao đổi thông tin qua HTTP, SOAP message là XML message
+ JAX-WS là kỹ thuật để xây dựng web service và client giao tiếp qua XML
+ JAX-RPC cung cấp mô hình để phát triển ứng dụng dựa vào SOAP. Lập trình JAX-RPC đơn giản kỹ thuật chạy nghi thức SOAP và cung cấp ánh xạ services giữa Java và WSDL
+ WSDL: file mô tả web service
+ Sử dụng tool java2wsdl để phát sinh wsdl file: java2wsdl -cp . -cn org.sample.service.BusinessService -of BusinessService.wsdl
+ POJO nhấn mạnh đối tượng là đối tượng Java bình thường (hông phải Enterprise JavaBean, nó không cài đặt, kế thừa bất kỳ lớp nào hoặc chứa annotation) để thiết kế đơn giản hơn, tốt hơn. JavaBean là một POJO có tính chất serializable (cho phép truy cập các thuộc tính private của các đối tượng persistent), có phương thức khởi tạo không tham số, cho phép truy cập các thuộc tính bằng phương thức getter và setter.
(Spring POJO: http://www.onjava.com/pub/a/onjava/2005/06/29/spring-ejb3.html).

Chúc bạn thành công.
DangTrung