Máy ứng dụng của Google cho Java - Phần 2: Xây dựng ứng dụng sát thủ
Tóm tắt: Toàn bộ ý nghĩa của một nền tảng đám mây giống như Máy ứng dụng
của Google (Google App Engine) cho Java™ là ở chỗ có thể tưởng tượng, xây
dựng và triển khai các ứng dụng sát thủ có chất lượng chuyên nghiệp có thể mở
rộng —không phải phá sản ngân hàng hoặc biến mình thành người mất trí. Trong
phần thứ hai của bài viết ba phần của mình giới thiệu về Máy ứng dụng của
Google cho Java, Rick Hightower sẽ đưa bạn vượt ra ngoài các ví dụ làm sẵn của
Phần 1bằng một hướng dẫn từng bước để viết và triển khai một ứng dụng quản lý
liên hệ đơn giản bằng cách sử dụng Máy ứng dụng choJava.
trả về từ máy chủ. Sau đó nó lặp lại qua toàn bộ danh sách liên hệ, đưa tên, số điện thoại và e-mail của mỗi mối liên hệ vào ba cột đầu tiên của mỗi hàng. Nó cũng cung cấp một đường liên kết Edit (Chỉnh sửa) và một đường liên kết Remove (Loại bỏ) cho mỗi mối liên hệ, cho phép người dùng dễ dàng loại bỏ và sửa mối liên hệ. Người dùng sửa đổi một mối liên hệ hiện có Khi người dùng nhấn vào một đường liên kết Edit từ danh sách các các mối liên hệ, gui_eventContactGridClicked được gọi, như chỉ ra trong Liệt kê 15: Liệt kê 15. Phương thức trình xử lý sự kiện gui_eventContactGridClicked của ContactListGUI public class ContactListGUI { ... public void gui_eventContactGridClicked(Cell cellClicked) { int row = cellClicked.getRowIndex(); int col = cellClicked.getCellIndex(); Contact contact = this.contacts.get(row); this.status.setText("Name was " + contact.getName() + " clicked "); if (col==EDIT_LINK) { this.addNewButton.setVisible(false); this.updateButton.setVisible(true); this.addButton.setVisible(false); this.emailField.setReadOnly(true); loadForm(contact); } else if (col==REMOVE_LINK) { this.contactService.removeContact(contact); } } ... private void loadForm(Contact contact) { this.formGrid.setVisible(true); currentContact = contact; this.emailField.setText(contact.getEmail()); this.phoneField.setText(contact.getPhone()); this.nameField.setText(contact.getName()); } Phương thức gui_eventContactGridClicked phải xác định xem liên kết Edit hay là liên kết Remove đã được nhấn. Nó thực hiện điều này bằng cách tìm hiểu xem cột nào được nhấn. Sau đó nó sẽ che dấu addNewButton và addButton và làm cho thấy rõ updateButton. updateButton hiển thị trong formGrid và cho phép người dùng gửi thông tin cập nhật quay trở về ContactService. Nó cũng làm cho emailField chỉ đọc để cho người dùng không thể chỉnh sửa trường e-mail này. Tiếp theo, gui_eventContactGridClicked gọi loadForm (như thấy trong Liệt kê 15), đặt trạng thái formGrid thành visible (nhìn thấy được), đặt trạng thái mối liên hệ là đang được chỉnh sửa và sau đó sao chép các thuộc tính của mối liên hệ này vào các tiện ích emailField, phoneField và nameField. Khi người dùng nhấn vào updateButton, phương thức trình xử lý sự kiện gui_eventUpdateButtonClicked được gọi, như trong Liệt kê 16. Phương thức này làm cho addNewButton nhìn thấy được (như vậy người sử dụng có thể thêm số liên hệ mới) và che dấu formGrid. Sau đó nó gọi copyFieldDateToContact, sao chép văn bản từ các tiện ích emailField, phoneField và nameField trở lại vào các thuộc tính của currentContact. Rồi nó gọi phương thức ContactServiceDelegate updateContact để chuyển mối liên hệ vừa được cập nhật trở lại cho dịch vụ. Liệt kê 16.Phương thức trình xử lý sự kiện gui_eventUpdateButtonClicked của ContactListGUI public class ContactListGUI { ... public void gui_eventUpdateButtonClicked() { addNewButton.setVisible(true); formGrid.setVisible(false); copyFieldDateToContact(); this.contactService.updateContact(currentContact); } private void copyFieldDateToContact() { currentContact.setEmail(emailField.getText()); currentContact.setName(nameField.getText()); currentContact.setPhone(phoneField.getText()); } Hai kịch bản này sẽ cho bạn một ý tưởng về cách ứng dụng làm việc, cũng như cách nó lấy ra cơ sở hạ tầng được Máy ứng dụng cho Java cung cấp như thế nào. Mã đầy đủ của ContactListGUI được hiển thị trong Liệt kê 17: Liệt kê 17. Mã đầy đủ của ContactListGUI package gaej.example.contact.client; import java.util.List; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.Grid; import com.google.gwt.user.client.ui.Hyperlink; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.RootPanel; import com.google.gwt.user.client.ui.TextBox; import com.google.gwt.user.client.ui.HTMLTable.Cell; public class ContactListGUI { /* Constants. */ private static final String CONTACT_LISTING_ROOT_PANEL = "contactListing"; private static final String CONTACT_FORM_ROOT_PANEL = "contactForm"; private static final String CONTACT_STATUS_ROOT_PANEL = "contactStatus"; private static final String CONTACT_TOOL_BAR_ROOT_PANEL = "contactToolBar"; private static final int EDIT_LINK = 3; private static final int REMOVE_LINK = 4; /* GUI Widgets */ protected Button addButton; protected Button updateButton; protected Button addNewButton; protected TextBox nameField; protected TextBox emailField; protected TextBox phoneField; protected Label status; protected Grid contactGrid; protected Grid formGrid; /* Data model */ private List contacts; private Contact currentContact; protected ContactServiceDelegate contactService; public void init() { addButton = new Button("Add new contact"); addNewButton = new Button("Add new contact"); updateButton = new Button("Update contact"); nameField = new TextBox(); emailField = new TextBox(); phoneField = new TextBox(); status = new Label(); contactGrid = new Grid(2,5); buildForm(); placeWidgets(); } private void buildForm() { formGrid = new Grid(4,3); formGrid.setVisible(false); formGrid.setWidget(0, 0, new Label("Name")); formGrid.setWidget(0, 1, nameField); formGrid.setWidget(1, 0, new Label("email")); formGrid.setWidget(1, 1, emailField); formGrid.setWidget(2, 0, new Label("phone")); formGrid.setWidget(2, 1, phoneField); formGrid.setWidget(3, 0, updateButton); formGrid.setWidget(3, 1, addButton); } private void placeWidgets() { RootPanel.get(CONTACT_LISTING_ROOT_PANEL).add(contactGrid); RootPanel.get(CONTACT_FORM_ROOT_PANEL).add(formGrid); RootPanel.get(CONTACT_STATUS_ROOT_PANEL).add(status); RootPanel.get(CONTACT_TOOL_BAR_ROOT_PANEL).add(addNewButton); } private void loadForm(Contact contact) { this.formGrid.setVisible(true); currentContact = contact; this.emailField.setText(contact.getEmail()); this.phoneField.setText(contact.getPhone()); this.nameField.setText(contact.getName()); } private void copyFieldDateToContact() { currentContact.setEmail(emailField.getText()); currentContact.setName(nameField.getText()); currentContact.setPhone(phoneField.getText()); } public void gui_eventContactGridClicked(Cell cellClicked) { int row = cellClicked.getRowIndex(); int col = cellClicked.getCellIndex(); Contact contact = this.contacts.get(row); this.status.setText("Name was " + contact.getName() + " clicked "); if (col==EDIT_LINK) { this.addNewButton.setVisible(false); this.updateButton.setVisible(true); this.addButton.setVisible(false); this.emailField.setReadOnly(true); loadForm(contact); } else if (col==REMOVE_LINK) { this.contactService.removeContact(contact); } } public void gui_eventAddButtonClicked() { addNewButton.setVisible(true); formGrid.setVisible(false); copyFieldDateToContact(); this.phoneField.getText(); this.contactService.addContact(currentContact); } public void gui_eventUpdateButtonClicked() { addNewButton.setVisible(true); formGrid.setVisible(false); copyFieldDateToContact(); this.contactService.updateContact(currentContact); } public void gui_eventAddNewButtonClicked() { this.addNewButton.setVisible(false); this.updateButton.setVisible(false); this.addButton.setVisible(true); this.emailField.setReadOnly(false); loadForm(new Contact()); } public void service_eventListRetrievedFromService(List result) { status.setText("Retrieved contact list"); this.contacts = result; this.contactGrid.clear(); this.contactGrid.resizeRows(this.contacts.size()); int row = 0; for (Contact contact : result) { this.contactGrid.setWidget(row, 0, new Label(contact.getName())); this.contactGrid.setWidget(row, 1, new Label (contact.getPhone())); this.contactGrid.setWidget(row, 2, new Label (contact.getEmail())); this.contactGrid.setWidget(row, EDIT_LINK, new Hyperlink("Edit", null)); this.contactGrid.setWidget(row, REMOVE_LINK, new Hyperlink("Remove", null)); row ++; } } public void service_eventAddContactSuccessful() { status.setText("Contact was successfully added"); this.contactService.listContacts(); } public void service_eventUpdateSuccessful() { status.setText("Contact was successfully updated"); this.contactService.listContacts(); } public void service_eventRemoveContactSuccessful() { status.setText("Contact was removed"); this.contactService.listContacts(); } public void service_eventUpdateContactFailed(Throwable caught) { status.setText("Update contact failed"); } public void service_eventAddContactFailed(Throwable caught) { status.setText("Unable to update contact"); } public void service_eventRemoveContactFailed(Throwable caught) { status.setText("Remove contact failed"); } public void service_eventListContactsFailed(Throwable caught) { status.setText("Unable to get contact list"); } } Kết luận Phần thứ hai này của bài giới thiệu ba phần về Máy ứng dụng của Google cho Java đã giới thiệu cho bạn về quá trình tạo một ứng dụng GWT tùy chỉnh bằng cách sử dụng các công cụ của trình cắm thêm (plugin) Eclipse cho Máy ứng dụng cho Java. Trong quá trình xây dựng ứng dụng quản lý liên hệ đơn giản, bạn đã học được cách: Xây dựng các dịch vụ từ xa hoạt động không đồng bộ. Tổ chức mã GUI để tránh các khai báo lớp bên trong lồng nhau. Sử dụng GWT để triển khai thực hiện chức năng đối với hai trường hợp sử dụng chủ yếu. Hãy đọc tiếp Phần 3 của bài viết này, ở đây bạn sẽ cải thiện ứng dụng quản lý liên hệ và bổ sung thêm sự hỗ trợ để tiếp tục duy trì các đối tượng Contact với các phương tiện kho lưu trữ dữ liệu của Máy ứng dụng cho Java.
File đính kèm:
- Máy ứng dụng của Google cho Java Phần 2 Xây dựng ứng dụng sát thủ.pdf