CÔng trình hoàn tất tại trưỜng đẠi học nông lâm tp hcm



tải về 2.89 Mb.
trang4/4
Chuyển đổi dữ liệu20.05.2018
Kích2.89 Mb.
#38584
1   2   3   4

ZK Blank-Project.


      • Để đơn giản hóa việc phát triển chúng tôi có làm sẵn một blank-project, mọi phát ứng dụng bạn có thể làm trên đây.


  1. NHỮNG THÀNH PHẦN CƠ BẢN.


  1. Cấu trúc tổng quan:





    • ZK bao gồm một kỹ thuật AJAX-base để tự động tương tác, một tập hợp thành phần XUL-based và một markup language đơn giản. Công nghệ AJAX_based gồm ba thành phần ZK loader, ZK AU Enginer và ZK Client Enginer.

    • Khi người sử dụng gởi yêu cầu, ZK loader sẽ tải ZK page dịch và trả lại kết quả vào trang HTML đáp ứng yêu cầu của request. Một ZK page được viết bởi Markup Language ZUML. ZUML giống như HTML nó dùng để mô tả những thành phần được tạo. Những thành phần này được tạo chỉ một lần và chúng được giữ lại cho đến khi session timeout. Khi ấy ZK AU Engine và ZK Client Enginer sẽ được gắn với nhau bằng một pitcher và catcher. Chúng chuyển những sự kiện đang xảy ra trong trình duyệt đến những ứng dụng đang chạy tại server và update DOM tại trình duyệt.

    • Dòng sự kiện:

      • Khi người sử dụng đánh một địa chỉ URL hay lick vào một hyperlink tại trình duyệt một request sẽ được gởi đến Web server. ZK loader ngay lập tức gởi đến server yêu cầu này. ZK loader sẽ tải trang chỉ định(specified page) và dịch nó để tạo ra những component phù hợp .

      • Sau khi biên dịch đầy đủ trang ZK loader sẽ trả kết quả về trang HTML. Khi đó trang HTML sẽ gởi trở về trình duyệt đi cùng với ZK Client Enginer.

      • ZK Client Enginer sẽ đến trình duyệt để dò tìm một vài sự kiện khởi đầu bởi những hoạt động của user, ví dụ như việc di chuyển chuột hoặc thay đổi một số giá trị. Nó chỉ dò tìm một lần và thông báo cho ZK AU Enginer bằng việc gởi ZK request.

      • Nhờ việc nhận ZK request từ client Engine, AU Enginer update nội dung tương ứng với component nếu cần thiết, và sau đó AU Enginer sẽ thông báo cho ứng dụng bởi việc gọi sử lý những sự kiện có liên quan.

      • Nếu ứng dụng chọn để thay đổi nội dung của component, thêm hoặc xóa component AU Engine gởi những nội dung mới thay đổi của component đến client Engine bằng việc sử dụng ZK reponses.

      • Những ZK reponse là những câu lệnh thật sự để chỉ dẫn cho Client Engine update DOM tree cho phù hợp.




  1. Components, Page, Desktop.
  1. Component.


          • Một component là một đối tượng UI, ví dụ như: Label, button, tree.

          • Một component được thể hiện từ interface com.potix.zk.ui.Component.
      1. Page.


  • Một trang là một tập hợp của component. Chúng được trình bày ở browser. Một trang được tự động tạo ra khi ZK loader dịch trang ZUML.

  • Page Title: Mỗi trang có thể có một title , chúng được trình bày như một phần tiêu đề window. Chúng ta sử dụng đoạn mã sau:








      1. Desktop.


      • Một trang ZUML có thể include nhiều trang XUML trực tiếp hoặc gián tiếp qua thuộc tính include. Một desktop là tập hợp những trang cùng phục vụ cho một yêu cầu (request). Trong một ứng dụng tương tác với người dùng có thể thêm vào hoặc loại bỏ pages từ desktop, components cũng được thêm vào hoặc bớt ra trong một trang.

      • Phương thức createComponents(): Một trang hoặc một desktop có thể được tạo ra hoặc loại bỏ hoàn toàn. Nhưng không có API nào tạo hoặc hủy desktops, pages. Page được tạo ra mỗi khi ZUML tải một page, và remove khi ZK thấy nó không còn được tham khảo đến. Một desktop được tạo ra khi trang ZUML được tải lần đầu tiên, và cũng bị loại bỏ nếu có nhiều desktop cùng tạo ra cho một session.

      • Phương thức createComponent() nằm trong lớp com.potix.zk.ui.Executions, có nhiệm vụ tạo component, không tạo page, cho dù nó tải được một ZUML file .




  1. Events.

      • Một event (com.potix.zk.ui.event.Event) cho biết những gì xảy ra cho ứng dụng. Mỗi dạng của event được trình bày bởi một lớp riêng biệt. Ví dụ: trong lớp com.potix.zk.ui.event.MouseEvent nó sẽ sử lý sự kiện theo ý muốn của người sử dụng khi click chuột. Có hai cách đăng ký một sự kiện. Một là đăng ký sự kiện một cách trực tiếp bằng thuộc tính onXxx trong ngôn ngữ markup language.Ví dụ: onClick() cho phép ta xử lý sự kiện click chuột. Cách khác gọi phương thức addEventListener() cho component hoặc là một page.

      • Thêm vào đó một sự kiện được gởi bởi user tại browser, một ứng dụng có thể xảy ra bởi việc sử dụng phương thức sendEvent() and postEvent() từ lớp com.potix.zk.ui.event.Events.


  1. QUẢN LÝ SỰ KIỆN.


  1. Components Lifecycle.

Vòng đời của việc load một trang: Phải mất bốn giai đoạn để ZK loader tải và dịch một trang ZUML: Giai đoạn khởi tạo page, Giai đoạn tạo components, Giai đoạn xử lý sự kiện và Giai đoạn gởi trả sự kiện.
  1. Giai đoạn khởi tạo page:


              • Đầu tiên ZK xử lý lệnh init, nếu như không định nghĩa cho thuộc tính class thì giai đoạn này có thể được bỏ qua. Xử lý init được gắn liền với thuộc tính class.








              • Mặt khác việc xử lý lệnh init cho một zscript file được viết như sau:









              • File zscript sẽ được xử lý trong giai đoạn Khởi Tạo Trang. Chú ý: Một page chưa được đính kèm desktop trong giai đoạn thi hành đầu tiên.



      1. Giai đoạn khởi tạo component:


      • Trong giai đoạn này ZK loader dịch một trang ZUML, khởi tạo những component phù hợp. Gồm những bước sau:

              • Mỗi phần tử sẽ được kiểm tra cho phù hợp nếu không thì chúng sẽ được bỏ qua. Nếu thuộc tính forEach được chỉ định với một tâp hợp những item. ZK sẽ lặp lại những bước cho mỗi item trong collection.

              • Tạo ra một component dựa trên tên mỗi phần tử, hoặc sử dụng class nếu nó được chỉ định trong thuộc tính use.

              • Khởi tạo thứ tự các thành phần thông qua thuộc tính trong trang ZUML.

              • Sau khi những thành phần con được tạo, onCreate() được gởi cho component này. Chú ý rằng sự kiện onCreate() được gởi cho những component con trước.



      1. Giai đoạn xử lý sự kiện.


      • Trong giai đoạn này, ZK gọi listener cho mỗi sự kiện được chứa trong hàng đợi của desktop này.

      • Một thread độc lập được tạo để gọi cho mỗi listener, vì vậy nó có thể bị trì hoãn mà không ảnh hưởng đến quá trình sử lý của những sự kiện khác.



      1. Giai đoạn gởi trả sự kiện:


Sau khi xử lý xong các sự kiện, ZK sẽ trả lại những component vào trang HTML và gởi trang này đến browser. Để trả về component phương thức redraw() được gọi. Sự thực hiện của component sẽ không thay đổi nội dung của component đã gọi phương thức.
The Lifecycle of Updating Pages: Mất ba giai đoạn để ZK AU Engine xử lý ZK request từ client: Giai đoạn xử lý request, Giai đoạn xử lý sự kiện, và Giai đoạn gởi trả sự kiện.

    1. Giai đoạn xử lý Request:

      • Phụ thuộc vào request, ZK AU Engine có thể update nội dung của những thành phần sao cho những nội dung đó giống như những gì được biểu diễn tại client.

    2. Giai đoạn xử lý sự kiện:

  • Giai đoạn này xử lý từng sự kiện một trong một threat độc lập.

    1. Giai đoạn gởi trả sự kiện:

      • Sau khi tất cả những xự kiện được xử lý, ZK trả lại những components đã được tác động, phát sinh những ZK responds tương ứng, và gởi những responds về client. Sau đó Client Engine update DOM tree tại browser dựa vào responds .

Dù các thành phần được giữ lại hay cập nhật tại browser đều phụ thuộc vào sự thi hành của những thành phần.


  1. Quản lý thành phấn rác.




      • Không giống như những component-based GUI, ZK không tự hủy bỏ hay đóng phương thức cho các components. Giống như W3C DOM một component bị remove khỏi browser ngay khi nó bị remove khỏi trang. Nó được show khi nó được thêm vào một trang.

      • Đúng hơn, một component được tách ra từ một trang, nó không được ZK quản lý, nếu như ứng dụng không tham khảo đến nó. Bộ nhớ đang được component sử dụng sẽ được JVM's Garbage Collector thay thế.



  1. Event Listening and Processiong.

            1. Add Event Listeners by Markup Languages.

                • Cách đơn giản nhất là thêm vào event listener khai báo thuộc tính trong trang ZUML. Giá trị thuộc tính của sự kiện là code Java mà BeanShell có thể dịch được.










            1. Add and Remove Event Listeners by Program: Có hai cách thêm một event listeners vào chương trình.

  • Khai báo một thành viên(declare a member).

    • Khi viết chồng lên một component bởi việc sử dụng một lớp của bạn, bạn có thể khai báo một chức năng member để làm event listener.

    • Trong một trang bạn khai báo thuộc tính use chỉ định đến lớp mà bạn muốn sử dụng. Ví dụ: lớp MyClass được thể hiện từ lớp com.potix.zul.html.Window.




……………







    • Trang ZUML ở trên có thể sử dụng phương thức onOK() để thi hành sự kiện được viết trong phương thức đó.




public class MyClass extends com.potix.zul.html.Window {

public void onOK() {

...//add an event listener

...//handles the onOK event (sent when ENTER is pressed)

}

}




  • Add and Remove Event Listeners Dynamically.

    • Bạn có thể sử dụng phương thức addEventListener()removeEventListener() để thêm hoặc bớt một event. Event được thêm phải implements từ interface com.potix.zk.Component.




  • Bạn có thể thêm event listener vào page dinamically. Một lần thêm tất cả những sự kiện được gọi tên sẽ được gởi cho những component của trang được chỉ định và những trang này sẽ được gởi cho Listener.

  • Tất cả những page-level event listener là non-ASAP. Nói cách khác là phương thức isAsap() bị lờ đi.Hãy xét ví dụ sau:




public class ModificationListener implements EventListener {

private final Window _owner;

private final Page _page;

private boolean _modified;

public ModificationListener(Window owner) {

_owner = owner;

_page = owner.getPage();

_page.addEventListener("onChange", this);

_page.addEventListener("onSelect", this);

_page.addEventListener("onCheck", this);

}

/** Called to unregister the event listener.*/



public void unregister() {

_page.removeEventListener("onChange", this);

_page.removeEventListener("onSelect", this);

_page.removeEventListener("onCheck", this);

}

/** Returns whether the modified flag is set.*/



public boolean isModified() {

return _modified;

}

//-- EventListener --//



public void onEvent(Event event) throws UiException {

_modified = true;

}

public boolean isAsap() {



return false;

}

}





  • Trình tự của phép gọi một sự kiện(The Invocation Sequence): Giả thiết đang gọi một sự kiện onClick():

  • Gọi script được khai báo onClick() trong thuộc tính của component.

  • Gọi event listener cho sự kiện onClick() đã được khai báo trong component theo thứ tự đã khai báo.

  • Gọi phương thức onClick() cho từng member của component (nếu có).

  • Gọi event listener từng cho sự kiện onClick() được khai báo trong trang cho từng component đó thuộc về.




  1. Send and Post Events from an Event Listener.

    1. Post Events.

      • Việc sử dụng phương thức postEvent() trong lớp com.potix.zk.ui.event.Events. Một event listener sẽ post sự kiện đến cuối hàng đợi những sụ kiện. Nó trả về ngay lập tức sau khi đặt sự kiện vào trong hàng đợi. Sự kiện sẽ được xử lý theo trình tự “first in first out”.




    1. Send Events.

      • Việc sử dụng phương thức sentEvent() trong lớp com.potix.zk.ui.event.Events. Một event listener hỏi ZK về việc sử lý ngay lập tức sự kiện được chỉ định. Nó sẽ không được trả về cho đến khi tất cả những event listener của những sự kiện được chỉ định được xử lý. Sự kiện được xử lý tại cùng một thread.




  1. Thread model.

      • Trên mỗi desktop sự kiện được xử lý một cách tuần tự, vì thế thread model đơn giản. Bạn chỉ cần đăng ký event listener và sử lý sự kiện khi gọi.

      • Chú ý: mỗi sự kiện được thi hành trong một thread độc lập gọi là event processing thread, trong khi đó trang ZUML được đánh giá trong servlet thread.

      • Suspend và Resume.

        • Trong ứng dụng có những khi bạn phải suspend (trì hoãn) thi hành cho đến khi một vài ứng dụng thỏa mãn. Các phương thức wait(), notify()notifyAll() trong lớp com.potix.zk.ui.Executions được định nghĩa cho mục đích này. Khi một sự kiện muốn suspend, nó gọi wait(). Một thread khác được thông báo bởi việc sử dụng phương thức notify() hoặc notifyAll(), nếu ứng dụng đó được thỏa mãn.

        • Model dialog là một dạng ví dụ của việc sử dụng công nghệ này.




Public void doModal() throws InterruptedException {...

Executions.wait(_mutex); //suspend this thread, an event processing thread

}

public void endModal() {



...

Executions.notify(_mutex); //resume the suspended event processing thread

}





        • Những cách sử dụng ở trên giống như những phương thức wait(), notify(), notifyAll() của lớp java.lang.Object. Tuy nhiên bạn không thể sử dụng những phương thức của lớp java.lang.Object cho việc suspend và resume những event listener. Nói cách khác thì tất cả những sự kiện được xử lý sẽ không còn liên kết được với desktop .

        • Chú ý rằng không giống như phương thức wait()notify() của lớp đối tượng trong Java, nếu sử dụng phương thức synchronized() để đóng những phương thức wait()notify() của lớp Executions. Trong trường hợp ở trên bạn phải làm như vậy bởi vì không có điều kiện nào có thể thực hiện (posssible). Tuy nhiên, nếu một điều kiện phù hợp bạn có thể sử dụng synchronized() để block giống như việc sử dụng wait()notify() trong đối tượng Java.




  1. Tạo và xóa Event Processiong Thread.

          1. Tạo thread.

  • Thỉnh thoảng bạn cần tạo một thread trước khi xử lý event.

  • Ví dụ: bạn cần tạo một thread cho việc authentication(cấp quyền). J2EE hoặc web contianer lưu trữ thông tin authentication tại local storage, vì vậy họ có thể re-authentication khi cần.

  • Để tạo tiến trình này, bạn cần register một lớp implements com.potix.zk.ui.event.EventThreadInit. ở đây chúng tôi lấy ví dụ một thể hiện cấp quyền trên Jboss:




import java.security.Principal;

import org.jboss.security.SecurityAssociation;

import com.potix.zk.ui.Component;

import com.potix.zk.ui.UiException;

import com.potix.zk.ui.event.Event;

import com.potix.zk.ui.event.EventThreadInit;

public class JBossEventThreadInit implements EventThreadInit {

private final Principal _principal;

private final Object _credential;

/** Retrieve info at the constructor, which runs at the servlet thread. */

public JBossEventThreadInit() {

_principal = SecurityAssociation.getPrincipal();

_credential = SecurityAssociation.getCredential();

}

// -- EventThreadInit --//



/** Initial the event processing thread at this method. */

public void init(Component comp, Event evt) {

SecurityAssociation.setPrincipal(_principal);

SecurityAssociation.setCredential(_credential);

}

public void prepare(Component arg0, Event arg1) throws UiException {



// TODO Auto-generated method stub

}

}






  • Khai báo đoạn sau trong WEB-INF/zul.xml



<listener>

JBossEventThreadInit







          1. Hũy bỏ một tiến trình sau khi đã xử lý.

            • Tương tự, bạn có thể hủy bỏ một thread khi nó đã xử lý xong. Ví dụ như đóng một transaction.

            • Bạn cần register một lớp implements com.potix.zk.ui.event.EventThreadCleanup và phần tử listener trong WEB-INF/zul.xml.








my.MyEventThreadCleanup






  1. ZK USER INTERFACE MARKUP LANGUAGE(ZUML).


ZUML dựa trên cơ sở của XML. Để hiểu rõ về XML nếu bạn chưa biết thì nên đọc tài liệu tham khảo về XML. Khi đã biết sơ về XML bạn sẽ thấy ZUML cũng giống XML và sẽ dễ dàng hiểu hơn.

  1. XML Namespace.

    • Namespace dùng để dễ dàng để phân biệt tên được sử dụng trong tài liệu XML . ZK sử dụng XML namespace để phân biệt tên của những component. Bạn có thể dùng hai component cùng tên nếu chúng khác namespacevào trong một trang.




xmlns:x="www.potix.com/2005/zul"

xmlns:zk="http://www.potix.com/2005/zk">



ZHTML Demo





ZHTML Demo















void addItem() {



}


Каталог: data
data -> HƯỚng dẫn càI ĐẶt và SỬ DỤng phần mềm tạo bài giảng e-learning
data -> CỘng hòa xã HỘi chủ nghĩa việt nam độc lập Tự do Hạnh phúc
data -> Qcvn 81: 2014/bgtvt
data -> Trung taâm tin hoïC Ñhsp ñEÀ thi hoïc phaàn access
data -> PHỤ LỤC 2 TỔng hợp danh mục tài liệu tham khảO
data -> Công ty cổ phần Xây dựng Điện vneco3
data -> Nghiên cứu một số đặc điểm
data -> NHỮng đÓng góp mới của luậN Án tiến sĩ CẤP ĐẠi học huế Họ và tên ncs : Nguyễn Văn Tuấn
data -> Mẫu 01/hc-sn-dn (Ban hành kèm theo Thông tư số 83/2007/tt-btc ngày 16/7/2007 của Bộ Tài chính) TỜ khai hiện trạng sử DỤng nhà, ĐẤt thuộc sở HỮu nhà NƯỚc và ĐỀ xuất phưƠng án xử LÝ

tải về 2.89 Mb.

Chia sẻ với bạn bè của bạn:
1   2   3   4




Cơ sở dữ liệu được bảo vệ bởi bản quyền ©hocday.com 2024
được sử dụng cho việc quản lý

    Quê hương