Thứ Sáu, 11 tháng 5, 2007

Xin chào JavaFX ?

JavaOne đã bước sang ngày thứ 3 và ngôi sao công nghệ hiện tại đang được khoe một cách rất hào nhoáng chính là JavaFX. Nó là gì

9 nhận xét:

  1. Trước khi vào phân tích vấn đề, và cũng trước khi giới thiệu sơ lược với các bạn về JavaFX tôi cũng xin được điểm qua vài lời về công việc hiện tại của tôi.

    Tôi đang phát triển một sản phẩm mới, mà cũng không mới, ít ra là về mặt ý tưởng chứ chưa nói gì đến những sản phẩm đã tồn tại trên thị trường. Tôi xin được nhấn mạnh đến sự tồn tại chứ chưa nói gì đến thành công hay thất bại bởi trong nghành này, có những cái luôn được nhấn mạnh và lăng xê quá tầm, chỉ có thời gian với khẳng định được giá trị thực của nó mà thôi. Sản phẩm của chúng tôi là WebOS, tên đầy đủ là Web Operating System, dịch ra tiếng Việt có nghĩa là hệ điều hành Web. Chắc chẳng nói nhiều thì bạn cũng đủ hình dung một sản phẩm đó sẽ như thế nào. Sâu xa hơn về mặt hệ thống, đó chính là một tiến hóa của Portal, Portal, bản thân ý tưởng cùng mô hình đã là một hệ điều hành, bạn đừng máy móc rằng hệ điều hành đó sẽ cần phải giống như Windows hay Linux mà bạn đang sử dụng. Bản thân Portal sẽ giống như một nơi tập trung quản lý người dùng và các giải pháp phần mềm trên một nền tảng hệ thống nhất định. JSR 168 hay Portlet chính là chuẩn, mô hình để bạn phát triển các ứng dụng nghiệp vụ dùng để triển khai trên Portal. Đó là chuẩn chung nhưng bản thân các Portal đều có những giải pháp riêng để bạn phát triển ứng dụng nhanh hơn và đồng nhất hơn, dĩ nhiên nếu không tuân thủ theo Portlet API thì khi mang sang một Portal khác, nó sẽ không chạy được (chẳng hạn mang một porlet được phát triển trên nền của Oracle Portal sang eXo thì là sao mà chạy được). Nôm na là vậy, với sự hỗ trợ của AJAX, chúng tôi hoàn thiện sự giàu có và mỹ miều cho giao diện tạo dựng nên một phiên bản mới của Portal và đặt tên nó là WebOS, khi bạn dùng sản phẩm này, bạn hoàn toàn có cảm giác như mình đang dùng một hệ điều hành desktop nào đó, cũng có start, các ứng dụng nằm trong các cửa sổ, ngoài ra cũng có thể tạo những trang web bình thường. Skin hiện tại hỗ trợ MacOS và Windows Vista.

    Vậy là tôi đã khoe được nôm na cái sản phẩm mà tôi đang đảm trách với vai trò là team leader. Công việc chủ yếu của tôi là thiết kế hệ thống và cài đặt code java. Chủ yếu tập trung dưới nền của toàn bộ Portal Framework. Xin điểm mặt những mô hình cài đặt và công nghệ sử dụng trong sản phẩm mới bao gồm : CSS + HTML + JavaScript với giao tiếp thông qua mô hình của AJAX, database lựa chọn cài đặt của JSR 170 – chuẩn cho nội dung. Tạm thời không còn nhắc nhiều đến MVC hay những code implement design pattern như factory, proxy,...Scripting là Groovy và một vài module nhỏ tự cài đặt. Xét từ A-Z, WebOS gần như không tồn tại cái gọi là EJB, Hibernate, Struts, JSF, JSP,... cái đã quá nhàn tai với lập trình viên Java. Nền tảng chúng tôi thiết kế và cài đặt phục phụ tập trung cho chính bản thân của Portal chứ không lan man hay lệ thuộc vào quá nhiều thư viện bên ngoài. Nhưng ở bài viết này, khi nhắc đến JavaFX, một dạng scripting, tôi cũng xin được đưa những quan điểm nhìn nhận bằng kinh nghiệm phát triển của bản thân mình.

    Chúng tôi rất vất vả khi tạo dựng giao diện bằng HTML và CSS với sự hỗ trợ của JavaScript. Vâng đúng là như vậy, thành quả đạt được thì cũng xứng đáng nhưng kinh nghiệm rút ra mới cho ta những điều thấm thía khi ứng dụng tuân thủ chuẩn hay ứng dụng giải pháp nào đó mà bản thân nó không hỗ trợ nhuần nhuyễn ngay từ ban đầu. Trước khi viết bài này, tôi đã trải qua một thời gian khá dài để bug 2 lỗi JavaScript, mỗi lỗi mất trên dưới 4 tiếng đồng hồ để tìm kiếm nguyên nhân. Lỗi không màu, không mùi, không vị, vâng chính xác là như vậy, chúng kín đáo và dịu dàng đến thâm hiểm, không bug track, không message, không error alert, ... và dĩ nhiên là ứng dụng không chạy. Cả hai lỗi đó đều là hai lỗi được tạo bởi hai người rất giỏi và nhiều kinh nghiệm trong JavaScript, một là Hà – phụ trách toàn bộ JavaScript cho WebOS và Philip – một master mới từ Pháp gửi sang đang viết những module khá khoai trong WebOS. Tất cả hai bug đó đều không chạy đúng logic cài đặt, không một thông báo trong JavaConsole hay Error Console của Firefox và cũng không nhiều căn cứ để suy đoán. Đặc biệt lỗi thứ hai khuyến mại kèm thêm gần 30 bugs mà đội ngũ Tester báo lại trên JIRA. Tôi mất trên dưới 4 tiếng để bug, cuối cùng là ... chúng - một thì thiếu một thẻ div, một thì thừa một thẻ div. Ôi trời, tôi muốn điên lên phần vì mệt mỏi, phần vì sung sướng. Điều đó thúc giục tôi cần phải nhanh chóng cài một “Tidy” Service để kiểm soát việc viết thừa hoặc thiếu thẻ HTML trong các Component. Bug làm phát sinh yêu cầu giải pháp và đó là yêu cầu của sự tiến bộ và phát triển.

    Ví dụ trên đây muốn chỉ ra rằng, với một hệ thống rất lớn và chặt chẽ như WebOS, bản thân HTML + CSS + JavaScript đã bộc lộ những yếu điểm nhất định mà công nghệ cần phải nhanh hơn nữa so với những yêu cầu. Bản thân HTML không phải là một GUI application stardard, đó là một document format stardard, những bổ sung chắp vá đã làm cho nó phát triển như ngày nay. Và sự lớn mạnh của Web với AJAX đang thúc giục người ta phát triển HTML 5 – một WebForm.

    Chẳng phải bây giờ người ta mới nghĩ đến những yêu cầu đó, khi Applet đạt được những thành công nhất định, nhiều scripting hay chuẩn đã phôi thai ra đời và phát triển đến ngày nay, góp phần vào công cuộc giết chết Applet. Flash, SVG, JavaScript,Flex, Silverlight, Apollo,... đã khẳng định thành công hay có những bước tiến bộ nhất định trong công cuộc rich client. Và bây giờ Sun demo JavaFX.

    Trả lờiXóa
  2. Xin chào một công nghệ mới trên nền tảng Java.

    JavaFX là một scripting trên nền Java tập trung vào giao diện đồ họa. Cái nôi tiền thân của nó là F3, một giải pháp giao diện hỗ trợ các công nghệ hiện hành như Flash hay SVG,... bạn đã có những ứng dụng được phát triển bằng Flash hay SVG rồi thì F3 sẽ chạy được chúng với đồ họa như của Swing. Nói thẳng, nó là Swing, JavaFX cũng vậy, chỉ là một cách thức để con người ta viết code nhanh hơn thôi. Scripting đã thể hiện được năng lực xuất xắc trong giao diện đồ họa ứng dụng. Đơn giản, nhanh, dễ tinh chỉnh, dĩ nhiên với những cài đặt lớn và phức tạp thì scripting không thể lựa chọn được.

    Trước hết JavaFX là một ngôn ngữ, điều đó nhắc nhở rằng nó có cú pháp thể hiện của nó, bắt buộc bạn phải tuân thủ. Chẳng hạn nếu trong java chúng ta khai báo biến như sau : String a = “nhuthuan.blogspot.com” thì với JavaFX, chúng ta có kiểu khai báo như sau : var a = “nhuthuan.blogspot.com”. Bạn hãy xem đoạn code dưới đây :

        var x = [“thuan”, “viet”, “linh tinh”];
        insert “vao day” into x; // sẽ thành [“thuan”, “viet”, “linh tinh”, “vào đây”]
    Hoặc :
        select n*n from n in [1..10]
    Nhìn qua thì bạn thấy quen quen đúng không, có select và insert into đã không còn lạ lầm từ SQL Scripting languague hay [1..10] từ Groovy hoặc Ruby. Bảo là JavaFX là một scripting languege mà. Nếu xét về mặt logic thì JavaFX có ngữ pháp rất gần với các scripting thông dụng hiện nay.
    Kiểu dữ liệu cũng không quá cầu kỳ và đông đúc, tập trung ở 4 kiểu dữ liệu cơ bản hay sử dụng trong scripting là Integer, Number (chẳc thay cho Double hay Float), Boolean và String (char). Bạn thấy đó, không có byte hoặc những thức kiểu dữ liệu khác, quá đơn giản để thỏa mãn hết những gì bạn cần thể hiện trên giao diện đồ họa. Các biểu thức hoặc toán tử thì đơn giản rồi, chả khác gì Java đâu, y hệt. Thế nhưng với mảng, chúng ta có thêm các toán tử giống như của chuẩn SQL, cũng insert, delete, select, before,... chẳng hạn bạn nhìn qua một đoạn code sau :
        Hocsinh {
            ten: "Nhu Dinh Thuan"
             email: "nhudinhthuan@yahoo.com"
             diem: [20, 60, 45, 55, 34, 68]
        };

        var hoten = select ten from Hocsinh where email == "nhudinhthuan@yahoo.com"

    Hì, cứ như là đang làm việc với cơ sở dữ liệu ấy. Và khi dữ liệu được đẩy từ database ra rồi lưu thành mảng thì chúng ta vô tư viết các câu lệnh SQL. Bạn có thể tham khảo thêm liên kết ở cuối bài để có những cài đặt phức tạp hơn. Các mệnh đề, xử lý vòng lặp cũng giống Java như if – else, while, try-catch,throw exception, ...Tuy nhiên bạn sẽ bắt gặp cú pháp vòng lặp for giống như trong Groovy hoặc các toán từ SQL ngay trong nó, chẳng hạn :
        for (i in [0..10] where i % 2 == 0) {
             System.out.println("i = {i}");
        }
    hoặc :
        for (i in [1,3..10]) {
            System.out.println("i = {i}");
        }
    Thú vị không, và còn một một điều ngạc nhiên nữa khi bạn phải làm việc với những mô hình dữ liệu như mảng hai chiều chẳng hạn:
        for (i in [0..10], j in [0..10]) {
            System.out.println(i);
            System.out.println(j);
        }

    Đó là scripting grammar, nó gần với đời thường hơn, gọn hơn, dễ sử dụng hơn rất nhiều.

    Trả lờiXóa
  3. Liên hệ gì với java hay không ?
    Có chứ, JavaFX trước tiên với cái tên có tiền tố Java, nó là Java, chúng ta có thể import các thư viện trong java và dùng nó một các bình thường. Chẳng hạn, cú pháp của một đoạn code sau thể hiện điều đó:
        import javafx.ui.*;
        import java.net.URL;
        import demo.Demos;
        import java.lang.System;
        import net.java.javafx.typeImpl.F3WebStart;
        operation DemoLauncher.startApp(app:DemoApp) {
            var baseURL = if app.baseURL == null then new URL("file:") else new URL(app.baseURL);
            var args = [app.className, "-classpath",            "{select "{new URL(baseURL, p)};" from p in app.classPath}"];
            F3WebStart.start1(args, null, null);
        }

    Như bạn thấy đấy, chúng ta sử dụng lớp URL từ gói java.net.URL, dĩ nhiên không được thoải mái như ở người trong nhà, lớp System từ java.lang bạn cũng phải ... import. Và mọi thứ giống như kiểu muốn dùng thì phải xin phép nhé. Chúng ta có thể tạo đối tượng như trong java, gọi các hàm hay cài đặt interface. Reflection cũng được triển khai một các ngụ ý nhằm tăng cường sự linh hoạt cho scripting này. Chẳng hạn :

        class ABC {
            attribute a: Number;
        }
        var x = new ABC();
        System.out.println(x.class.Name);
    Kết quả sẽ in ra là ABC, ra chuyện là tên lớp của đối tượng x là ABC. Thấy chưa, nó cũng khá giống Java đấy chứ.
    Và nó hướng đối tượng. Vâng chúng ta cũng phải viết class, tạm thời bỏ qua những đặc điểm có tính sách vở như thừa kết hay đa thừa kế, interface, trừu tượng dữ liệu, đa hình,... chúng ta hãy xét đến sự đơn giản của mô hình cài đặt hướng đối tượng. Nghĩa là một đối tượng có thuộc tính (dữ liệu)và chức năng (khả năng xử lý). Hãy xem class sau :

        class Window extends AbstractFrame {

            attribute screenx: Number;
            operation Window.pack() {
                frame.pack();
             }
        }
    Rất hướng đối tượng, phải không, cũng thừa kế như ai và cũng giống gần như các đối tượng định dạng trong HTML là có ... attribute. Tuy nhiên class không có constructor, các thuộc tính cũng không có setter-getter như trong các Java bean. Nói không ngoa, việc cài đặt các setter-getter trong java bean làm tôi mệt đứt đừn và “rối tinh tươm”. Thay vì có setter, JavaFX đưa ra triển khai mới – ý tưởng cũ là triggers giống như trong SQL. Trigger có cú pháp bao gồm phần đầu và phần thân, phần đầu để chỉ rõ trigger đó gắn dữ liệu vào đâu và phần thân là để chỉ rõ gắn cái gì vào. Đọc ví dụ sau là bạn hiểu ngay :

        import java.lang.System;

        class X {
            attribute nums: Number*;
        }

        trigger on new X { // gắn dữ liệu vào khi tạo mới đối tượng
             insert [3,4] into this.nums; // dữ liệu gắn vào
        }

        var x = new X();
        System.out.println(x.nums == [3,4]); // kết quả in ra là true
    Bạn có một vài kiểu trigger là tạo mới, cập nhật, thay thế, lồng dữ liệu vào, xóa...chẳng hạn trigger xóa dữ liệu sẽ viết như sau:
        trigger on delete num from X.nums {
            System.out.println("just deleted {num} from X.nums at position {indexof num}");
        }
    Dĩ nhiên, trong bài viết, chỉ cố gắng dắt ngựa cho bạn ngắm hoa, muốn thuần thục và linh hoạt thì bạn cần phải thực hành nhiều và bổ sung vốn ngữ pháp làm việc với JavaFX bằng các tài liệu chính thống từ Sun.

    Trả lờiXóa
  4. Trở lại mục đích chính đẻ Java cố rặn đẻ thêm đứa con này chính là giao diện.
    Như đã nói, scripting thể hiện một năng lực xuất xắc trong lĩnh vực GUI cho Application. Do đó, mục đính chính của JavaFX là làm đơn giản hóa quá trình tạo giao diện và cải thiện cả về tốc độ code lẫn tốc độ thực thi ứng dụng. Giao diện đồ họa mà JavaFX thể hiện chính là Swing look and feel. Các component tương ứng cũng giống như trong Swing, chúng ta có Window, Button, Label, Text, ProgressBar, Menu... giống như HTML Tag, các đối tượng đồ họa này hướng nhiều đến FORM hơn là định dạng tài liệu, chúng cũng có attribute như HTML giúp cho việc trang trí màu mè như font, nền, cỡ chữ,... Chẳng hạn, xem một đoạn code đơn giản sau:
        import javafx.ui.*;

        Frame {
            title: "Hello JavaFX Article"
            width: 200
            height: 50
            content: Label {
                text: "hì hì"
            }
            visible: true
        }
    Component có thể chứa component. Tuy nhiên, khác với HTML là chúng ta có thể cài các action vào đây. Chẳng hạn đoạn code sau :
        Frame {
            content: Button {
                text: "Ấn em nào!"
                action: operation() {
                    System.out.println("Ấn nữa đi anh!");
                }
            }
            visible: true
        }
    Quá tuyệt phải không, nếu muốn cài các action listener trong HTML node chúng ta phải cần đến JavaScript và như vậy thì chúng không đồng nhất và tường minh cho lắm. Chúng ta cũng có những khái niệm về layout hay border, chúng được bê từ Swing sang : GridPanel GridLayout GridBagPanel GridBagLayout FlowPanel FlowLayout BorderPanel BorderLayout Box BoxLayout StackPanel, CardPanel CardLayout GroupPanel . Y hệt nhé, cũng có canvas để bạn vẽ vời hoa lá vào đấy vì nó hoàn toàn hỗ trợ 2D thậm chí là cả 3D nữa. Tôi thì chưa thử tí nào nên cũng khó đánh giá, thấy Sun quảng cáo vậy thì ăn theo nói leo vậy thôi chứ có biết gì đâu.
    Một điểm đặc biệt của đặc biệt nữa là JavaFX có hỗ trợ HTML. HTML thì quá thông dụng rồi, ai cũng biết, do đó JAVAFX hỗ trợ HTML không có gì ngạc nhiên cả và nó làm tăng cường tính hấp dẫn của công nghệ này với lập trình viên. Chẳng hạn xem đoạn code sau:
        Frame {
            content: Label {
                text: bind "<html><h2 align='center'>Shopping Cart</h2></html>”
            }
            visible: true
        }
    Lại còn có thể viết logic code xen lẫn code HTML được nữa chứ, thế mới kêu.
    Cuối cùng thì, nói gì nhỉ, vừa có một cái liếc dọc, liếc ngang với một sản phẩm mới là JavaFX của Sun. nói chung đó là một sự đón chào, nó mạnh để cho ta phát triển các ứng dụng có giao diện đồ họa phức tạp. Sun đang có một chiến lược, đó là chiến lược cho một mô hình ứng dụng phát triển với giao diện đồ họa Swing và phân phối qua Internet. Tất cả phải đón chờ sự ra đời của Java 7, khi mà JRE có bản Kernel được phân phối qua net với kích thước trên dưới 3mb. JavaFX được nhận định là đối thủ thách thức Flash, AJAX,Flash, Silverlight ... nhưng đó mới chỉ là nhận định. Việc nó có đạt được thành quả hay không thì hãy còn chờ, nhưng trước mắt, nó sẽ đơn giản quá quá trình code của lập trình viên với các ứng dụng desktop trên Java.
    Là một scripting language, cú pháp rất gần gũi và dễ học. Nếu bạn có kinh nghiệm với Swing, kiến thức về SQL, từng làm việc qua với một scripting nào đó như JavaScript, Ruby hay Groovy thì việc học và làm việc với JavaFX là quá dễ dàng. Cam đoan với bạn là học không đến một ngày đâu. Do đó đừng vội vàng gì mà ôm lấy JavaFX để học ngay khi người ta còn đang ba hoa về nó. Khi nào cần thì hãy đụng đến nó, thời gian để tập trung vào những việc khác tốt hơn, chẳng hạn như ngồi viết linh tinh như tôi bây giờ đây này. Tôi cũng chả học nó làm gì, khi thấy Java One quảng cáo thì down code về cùng lướt qua mấy tutorial rồi nổi hứng điên điên viết bài viết này. Chứ thực lòng có học gì đâu, cũng chả làm việc bao giờ, thậm chí tôi cũng không thèm bật Netbean lên để gõ vài dòng xem nó thế nào nữa. Hì, đừng học bạn nhé, mất thời gian, khi nào cần thì mần cũng được.

    Trả lờiXóa
  5. Bài viết rất thời sự, thanks doibuon, mình đỡ phải mắc công tìm hiểu xem nó là gì. Thấy JavaFX Mobile coi bộ cũng hay.

    Trả lờiXóa
  6. [quote]
    Tôi mất trên dưới 4 tiếng để bug, cuối cùng là ... chúng - một thì thiếu một thẻ div, một thì thừa một thẻ div. Ôi trời, tôi muốn điên lên phần vì mệt mỏi, phần vì sung sướng.
    [/quote]

    >>>> Vâng, em cảm nhận sâu sắc sự mệt mỏi và sung sướng của anh. Đợt rồi em cũng bị một lỗi như vậy, thật là chỉ muốn gào lên thật to. Những lỗi như vậy khiến mình thật mất giời gian.

    Cám ơn anh về bài viết, Rất hay ^_^

    Trả lờiXóa
  7. Hello all,
    While I surf blog , i found a all new trick in http://pic-memory.blogspot.com/

    Vistor can comment and EMBED VIDEO YOUTUBE , IMAGE .
    EX : View Source.
    http://pic-memory.blogspot.com/2009/02/photos-women-latin-asian-pictu...

    Written very smart!
    I wonder how they do it ? Anyone know about this , please tell me :D
    (sr for my bad english ^_^)

    email: ya76oo@ya76oo.com
    thanks.

    Trả lờiXóa
  8. bài viết của anh rất hay. Hi hi, em đang làm luận văn về tìm hiểu công nghệ javaFX và xây dựng ứng dụng. Đang viết phần báo cáo về tổng quang JavaFX nên lướt vài nơi để tìm ý tưởng thì vào được blog của anh. Anh vừa fix được 2 lỗi không màu không mùi không vị với java script, em hok biết nói gì chỉ biết là cảm giác đó rất tuyệt và cũng muốn liệt với các lỗi như vậy. Còn về JavaFX thì không chừng nếu anh làm việc với nó thì cũng có khi liệt và tuyệt chứ chả chơi. Bug của nó cũng có mùi có vị, và có màu đỏ :D nhưng mà không phải là 4 hay 5h mà tìm ra. Tụi em ăn cũng code, ngủ cũng code với nó ròng rã hơn 5 tháng trời mà đôi khi vướng phải thì cũng phải lăn ra 1, 2 ngày mới lôi ra được cái bug ^__^. Chỉ một điều em muốn nói ở đây là "javaFX rất tuyệt, hãy cùng trãi nghiệm mới biết được nó tuyệt thế nào chứ mà nghe giới thiệu và làm sơ sơ vài cái chơi chơi thì chỉ có để mở rộng tầm mắt thoai". Hi hi, môt lần nữa cảm ơn vài viết của anh.
    freedevc@gmail.com

    Trả lờiXóa

nhudinhthuan@gmail.com