ỨNG DỤNG STRUTS FRAMEWORK XÂY DỰNG TRANG VÀNG CHO DU LỊCH ĐÀ NẴNG
I. Bối cảnh
Trong thời đại ngày nay, thông tin là nhu cầu thiết yếu đối với mọi người trên mọi lĩnh vực. Mỗi phút trôi qua hàng triệu triệu trang web được đẩy lên nhằm làm giàu nguồn tài nguyên vô tận này. Mọi lĩnh vực trong đời sống đều cần thông tin nhanh, cần thiết và chính xác. Ngành du lịch cũng vậy, điều cần thiết là phải làm sao đưa thông tin đến cho du khách. Phải tạo ra một nơi để cung cấp đầy đủ các thông tin về địa phương của mình, và quảng bá những nét đặc trưng, những danh lam thắng cảnh đẹp. Qua đó du khách có thể dễ dàng chọn được những nơi mình muốn đi, ăn những món ăn mình thích, và những dịch vụ công cộng thiết yếu để cho du khách không cảm thấy xa lạ và có thể hưởng kì nghỉ vui vẻ của mình.Đó là mục đích chính cho ra đời trang web Trang Vàng Đà Nẵng. Tại đây sẽ cung cấp đầy đủ thông tin về nơi ở, món ăn, đặc sản của thành phố Đà Nẵng. Không chỉ cho du khách ngoài nước mà còn trong nước.
II. Ý nghĩa
Với sự phát triển nhanh chóng của du lịch Đà Nẵng, thì việc có một nơi nào đó để giới thiệu và quảng bá hình ảnh của thành phố, các danh lam thắng cảnh và những địa điểm du lịch trong thành phố là một điều cấp thiết. Điều này sẽ tạo cho du khách đến với Đà Nẵng sẽ có thể thăm quan và vui chơi mà không phải mất nhiều thời gian để tìm kiếm.Các nhà hàng khách sạn trên thành phố cũng cần có một nơi để có thể quảng bá dịch vụ của mình đến với du khách. Điều này sẽ thúc đẩy việc phát triển du lịch ở Đà Nẵng.
III. Phương pháp thực hiện
Với xu hướng phát triển web hiện nay thì có ba loại ngôn ngữ để các lập trình viên lập trình web, đó là PHP, ASP và JSP.
PHP : thích hợp phát triển những trang web nhỏ, miễn phí kết hợp với mySQL.
ASP : với những tính năng mạnh mẽ nhưng phải trả tiền để cài đặt Server.
JSP : miễn phí nhưng vẫn rất mạnh, có thể sánh ngang cùng ASP.
JSP là ngôn ngữ lập trình web được Sun phát triển, nó cung cấp một hướng phát triển và định nghĩa 2 mô hình xây dựng các ứng dụng Web dựa trên JSP. 2 mô hình đó được biết đến với những cái tên Model 1 và Model 2 và chúng quy định các cách tiếp cận khác nhau để thiết kế các ứng dụng Web dựa trên JSP. Model 1, đơn giản hơn, là giải pháp chính khi JSP lần đầu được đưa ra. Tuy nhiên, qua thời gian, Model 2 trở nên được chấp nhận như là cách tốt nhất để xây dựng các ứng dụng Web dựa trên JSP và là nguồn cảm hứng cho các Web framework dựa trên MVC như Struts.
Tổng quan về kiến trúc Model 1
Kiến trúc Model 1 hết sức đơn giản. Tóm lại là tất cả mọi thứ đều được gói gọn trong servlet hoặc JSP từ việc xử lý request, xác nhận tính hợp lệ của dữ liệu, điều quản business logic và generate response. Mặc dù về khái niệm hết sức đơn giản, kiến trúc này không phù hợp cho việc phát triển các ứng dụng quy mô lớn vì chắc chắn một số lượng lớn các tính năng sẽ bị lặp lại trong các trang JSP (lặp lại code). Cũng vậy, kiến trúc Model 1 tạo nên sự ràng buộc không cần thiết giữa business logic và presentation logic của ứng dụng. Ví dụ, ngoài giao diện HTML, bạn có thể muốn thêm một giao diện WML cho truy nhập wireless. Trong trường hợp này, việc sử dụng Model 1 yêu cầu sự lặp lại không cần thiết của business logic trong các trang sử dụng HTML và WML.
Tổng quan kiến trúc Model 2
Model 2, hay cách gọi thông dụng ngày nay, Model-View-Controller (MVC), giải quyết nhiều vấn đề của Model 1 với việc cung cấp một sự phân tách rõ ràng trong ứng dụng. Trong kiến trúc MVC, một serlvet trung tâm, được gọi là Controller, tiếp nhận tất cả các request cho ứng dụng. Sau đó Controller sẽ xử lý request và làm việc với Model để chuẩn bị những dữ liệu cần thiết cho View (thường là JSP) và forward dữ liệu tới trang JSP. Sau đó JSP sử dụng các dữ liệu đã được chuẩn bị bởi Controller để generate một response về cho browser. Trong kiến trúc này, business logic và presentation logic được phân tách nhau. Việc tách business code và presentation code giúp ta có thể sử dụng nhiều giao diện cho ứng dụng, chúng có thể là Web, wireless hay GUI. Thêm vào đó, việc phân tách này còn cung cấp việc tái sử dụng lại code một cách hòan hảo.
Việc phân tách code xử lý và code hiển thị làm cho việc phát triển ứng dụng có thể độc lập với nhau và cho nhiều người tham gia làm. Việc này cũng làm cho những người bảo trì web sau này có thể dễ dàng chỉnh sửa và bảo trì.
Mô hình 2 được Sun phát triển thông qua Struts Framework, Struts giải quyết rất nhiều các vấn đề liên quan đến các ứng dụng Web hướng business đòi hỏi hiệu năng cao sử dụng Java servlet và JSP. Struts cơ bản định hình lại cách các lập trình Web nghĩ về và cấu trúc một ứng dụng Web.
Struts có 2 phiên bản là version 1 và version 2. Version 1 là phát triển web theo kiểu truyền thống. Còn version 2 là được Apache Struts tạo ra từ 1 nhánh của webwork.
Vì sự phát triển mạnh mẽ của Struts framework hiện nay nên đề tài sẽ phát triển ứng dụng web dựa trên nền của Struts Framework.
IV. Phạm vi thực hiện của đề tài
Qua tìm hiểu và khảo sát những trang vàng trên Việt Nam thì trang vàng để quảng bá du lịch cần có những chức năng chính sau :
- Xem tin tức du lịch
- Tìm kiếm thông tin nhà hàng khách sạn
- Tìm kiếm các dịch vụ công cộng
- Các phương tiện đi lại trên địa bàn thành phố
- Thông tin về các công ty lữ hành và các tua du lịch.
Với việc thực hiện luận văn trong vòng ba tháng nên đề tài chỉ giải quyết một số vấn đề chính như sau :
- Xem tin tức du lịch
- Tìm kiếm thông tin nhà hàng khách sạn
- Tìm kiếm các dịch vụ công cộng (Thông tin bưu điện, ngân hàng)
- Các phương tiện đi lại trên địa bàn thành phố (Chỉ xe bus)
nội dung chính
GIỚI THIỆU TỔNG QUAN VỀ ĐỀ TÀI7
I.Bối cảnh. 7
II.Ý nghĩa. 7
III.Phương pháp thực hiện. 7
IV.Phạm vi thực hiện của đề tài9
CƠ SỞ LÝ THUYẾT10
I.GIỚI THIỆU JSP. 10
I.1.Giới thiệu. 10
I.2.Biên dịch trang JSP. 10
I.3.Các Đối Tượng Mặc Định Của Trang JSP. 12
II.GIỚI THIỆU VỀ STRUTS FRAMEWORD14
II.1.Giới thiệu. 14
II.2.Cách làm việc của struts. 17
II.3.Các thành phần của struts. 20
III.NGÔN NGỮ JAVASCRIPT. 30
IV.CÔNG NGHỆ AJAX31
IV.1.Giới thiệu. 31
IV.2.Cơ chế và nguyên lý hoạt động. 31
IV.3.Các khái niệm liên quan Ajax. 33
PHÂN TÍCH VÀ THIẾT KẾ HỆ THỐNG37
I.Phân tích yêu cầu. 37
I.1.Yêu cầu trang web. 37
I.2.Yêu cầu người dùng. 37
I.3.Yêu cầu quản lý. 38
II.Đặc tả yêu cầu. 39
II.1.Mô hình USE-CASE của hệ thống. 39
II.2.Đặc tả các USE-CASE của hệ thống. 39
CÀI ĐẶT VÀ TRIỂN KHAI CHƯƠNG TRÌNH55
I.Thiết kế cơ sở dữ liệu. 55
I.1.Mô hình ý niệm dữ liệu. 55
I.2.Chi tiết về các bảng trong cơ sở dữ liệu. 56
I.3.Sơ đồ quan hệ giữa các bảng. 60
II.Thiết kế chương trình. 61
II.1.Sơ đồ phân rã chức năng. 61
II.2.Một số môdun chính. 62
KẾT QUẢ THỬ NGHIỆM . 67
I.Trang chính. 67
II.Trang danh mục khách sạn. 68
III.Trang chi tiết một khách sạn. 69
IV.Trang ẩm thực Đà Nẵng. 70
V.Phần quản lý của người dùng. 71
VI.Trang quản lý thông tin khách sạn đăng. 71
KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN73
I.Những kết quả đã đạt được. 73
II.Tính khả thi, ưu điểm của website. 73
III.Những hạn chế của đề tài74
IV.Hướng phát triển đề tài74
75 trang |
Chia sẻ: lvcdongnoi | Lượt xem: 3240 | Lượt tải: 3
Bạn đang xem trước 20 trang tài liệu Đề tài Ứng dụng struts framework xây dựng trang vàng cho du lịch Đà Nẵng, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
phần khác dùng cho struts Frameword.
Build.xml : một file được dùng bởi Jakarta Ant chạy công cụ để dịch và cài đặt ứng dụng web. Ant không phải là yêu cầu cần thiết nhưng nó là sự lựa chọn chung của phần lớn những người lập trình.
Application.properties: file này cung cấp nguồn thông điệp cho ứng dụng của bạn. Giống như build.xml nó không cần thiết nhưng được sử dụng hầu hết trong các ứng dụng struts.
Trong khi làm việc với những file này có thể không giống như “Phát triển JAVA”. Dùng nó chỉ để làm cho ứng dung của bạn dễ quản lý hơn. Trong phần này chúng ta chỉ xem một chút về công dụng của nó đối với ứng dụng của bạn.
II.3.1.1 Web.xml file
Mục đích và định dạng của việc cài đặt ứng dụng web được tạo bởi Sun Servlet. Về căn bản, nó dùng để nói cho thành phần servlet biết làm thế nào để cấu hình các servlet và một vài đối tượng cấp cao hơn mà ứng dụng bạn cần.
Struts framework bao gồm hai thành phần mà cần được cấu hình thông qua ứng dụng của bạn đó là ActionServlet và sự lựa chọn thư viện tag. Trong hầu hết các ứng dụng đều sử dụng thư viện tag, nhưng đó không phải là yêu cầu bắt buộc. Ứng dụng mà chỉ dùng XLST và khung mẫu Velocity thì không cần phải cấu hình những thư viện tag này.
Một ví dụ về web.xml
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
"">
action
org.apache.struts.action.ActionServlet
application
Application
config
/WEB-INF/conf/struts-config.xml
debug
2
detail
2
2
action
*.do
index.jsp
/tags/struts-bean
/WEB-INF/lib/struts-bean.tld
/tags/struts-html
/WEB-INF/lib/struts-html.tld
/tags/struts-logic
/WEB-INF/lib/struts-logic.tld
II.3.1.2 Struts-config.xml
File này để tải một vài thành phần struts. Cùng với nhau, những file này sẽ tạo nên cấu hình của struts. File cấu hình struts và ActionServlet làm việc cùng nhau để tạo nên lớp điều khiển cho ứng dụng của bạn. Trong phần này chúng ta sẽ khám phá vì sao chúng ta câng file struts-config.xml.
Struts-config sẽ xuyên suốt ứng dụng của bạn. Nó biết được những trường nào trên form của bạn. Nó biết nơi mà trang JSP có thể được tìm thấy. Nó biết về mọi Action mà ứng dụng bạn thực hiện và biết chính xác các nguồn mà những Action này cần.
Điều này giống như là rất nhiều các thông tin được lưu trữ trong một nơi. Nhưng bằng việc lưu trữ những thông tin này cùng nhau, nhiều lập trình viên cảm thấy ứng dụng của họ dễ dàng được tạo và quản lý.
Nhiều thành phần trong struts được cấu hình là một đối tượng Java. Đối tượng ActionForm để định nghĩa về các trường và form. Đối tượng ActionForward được biết là nơi để tìm kiếm trang JSP. Đối tượng ActionMapping biết cái Form nào và cái Forward nào được dùng với các câu lệnh để ứng dụng bạn có thể hiểu được.
Các thành phần trong struts-config
ActionFrom cung cấp một nơi lưu trữ thông tin được nhập vào với HTTP request. Nhưng để lưu trữ thông tin nhập vào đầu tiên controller phải tạo một ActionForm và lưu chúng vào trong đối tượng request hoặc session, nơi mà phần khác của framework struts như JSP có thể tìm thấy nó.
Struts-config file cung cấp thẻ để liệt kê tất cả các ActionForm được sử dụng bởi modun. Mỗi một ActionFormBean được tạo ra tương ứng với một thẻ .
Dưới đây là ví dụ về khai báo ActionForm
Ví dụ 8 : Ví dụ khai báo ActionForm
<form-bean
name="menuForm"
type="org.apache.struts.scaffold.MenuForm"/>
<form-bean
name="logonForm"
type="org.apache.struts.action.DynaActionForm">
<form-property
name="username"
type="java.lang.String"/>
<form-property
name="password"
type="java.lang.String"/>
ActionForm lưu trữ dữ liệu mà ứng dụng cần. ActionForwards liệt kê danh sách các đường dẫn ứng dụng sẽ dùng. ActionMapping sẽ miêu tả cái gì sẽ vận hành hoặc câu lệnh mà ứng dụng sẽ thực thi.
Đối tường Action sẽ điểu khiển chính xác công việc của một hệ thống. ActionMapping dùng để gói những hệ thống đó chi tiết.
Một chi tiết quan trọng là cái URI nào được dùng để gọi đối tượng Action. Một URI của Action được dùng như một sự xác định logic, hoặc đường dẫn cho ActionMapping. Khi trình duyệt gửi yêu cầu cho 1 URI của Action, ActionServlet sẽ tìm một cái ActionMapping tương ứng. ActionMapping sẽ nói cho Servlet biết cái Action nào sẽ được dùng cho cái URI đó.
Bên cạnh đường dẫn URI và loại Action, ActionMapping còn có một vài thuộc tính khác mà có thể dùng để điều khiển hành vi của đối tượng Action.
Bạn cũng có thể dùng ActionMapping như một forwards đơn giản chuyển đường dẫn sang một đường dẫn khác. Nhưng hầu hết chúng được sử dụng để kết nối đến một đối tượng Action.
Ví dụ 9 : Ví dụ về ActionMapping
<action
path="/logoff"
type="app.LogoffAction"/>
<action
path="/logonSubmit"
type="app.LogonAction"
name="logonForm"
scope="request"
validate="true"
input="/pages/Logon.jsp"/>
<action
path="/logon"
type="app.ContinueAction">
<forward
name="continue"
path="/pages/Logon.jsp"/>
<action
path="/welcome"
type="app.ContinueAction">
<forward
name="continue"
path="/pages/Welcome.jsp"/>
Struts cho phép nhiều moodun dùng chung một Controller Servlet. Mỗi moodun có một cấu hình riêng của nó và có thể phát triển độc lập với các modun khác. Một thẻ cho phép mỗi modun có một sự khác nhau về tham số cấu hình cho ActionServlet.
Dưới đây là một ví dụ thẻ thiết lập nocache và null và load một xử lý yêu cầu tự chọn.
Ví dụ 10 : Ví dụ thẻ controller
<controller
nocache="true"
null="true"
processorClass="com.myCompany.struts.RequestProcessor"/>
Mỗi modun nên có một nguồn thông điệp mặc định. Đây là một thành phần của struts, giống như thư viện tag cho JSP sẽ được dùng khi không có cái nào khác được chỉ định.
Thẻ được dùng để khai báo những dữ liệu mà ứng dụng bạn sẽ sử dụng. Dưới đây là ví dụ về khai báo nguồn thông điệp ảnh.
Ví dụ 11: Ví dụ khai báo nguồn thông điệp ảnh
<message-resources
parameter="resources.application"/>
<message-resources
parameter="resources.image"/>
Nó không thường được dùng cho một Action khi cần một nguồn dữ lieu đặc biệt nào để thực hiện công việc của nó. Nó có thể dùng để tại ra kết nối cơ sở dữ liệu mà không phải dùng DataSource. Nó có thể tạo ra một bean để xài trong form. Nó cũng có thể để đọc một file cấu hình để tạo một loạt đối tượng. Giống như strut-config làm.
Dưới đây là một plug-in để khởi tạo việc xác định tính hợp lệ của dữ liệu.
Ví dụ 12 : Ví dụ Plug-in khởi tạo việc xác định tính hợp lệ của dữ liệu
<set-property
property="pathname"
value="/WEB-INF/validator-rules.xml"/>
<set-property
property="pathname"
value="/WEB-INF/validation.xml"/>
ActionForm
ActionForm là một JavaBean tùy chọn liên kết với một hoặc nhiều ActionMappings . Giống như bean sẽ có các thuộc tính của nó được khởi tạo từ các tham số yêu cầu tương ứng với Action.execute method được gọi.
Khi những thuộc tính của bean được gán dữ liệu, trước khi gọi Action xử lý, thì hàm validatetion sẽ được gọi, điều này để kiểm tra tính hợp lệ của dữ liệu trước khi xử lý. Nếu quá trình kiểm tra tính hợp lệ gặp vấn đề, nó sẽ tạo ra một đối tượng errormessage để thông báo và chuyển về trong chứa form nhập.Nếu hàm validatetion trả về null, có nghĩa là dữ liệu hợp lệ và Action.execute sẽ được gọi.
Để khởi tạo một ActionForm, bạn phải kế thừa từ lớp ActionForm của struts. Với mỗi thuộc tính của lớp nên cung cấp hàm setter và getter để lấy và gán dữ liệu cho các thuộc tính.
Bởi vì ActionForm là một JavaBean cho nên cũng nên kế bởi Serializable , theo yêu cầu của đặc tả JavaBean.
Action
II.3.3.1 Struts Action Class
Lớp Action trong struts được extends từ class org.apache.struts.action.Action.Nó hoạt động như sự gắn kết giữa lớp View và Model. Mặc khác nó cũng truyền dữ liệu từ lớp View đến lớp business xử lý và cuối cùng trả dữ liệu đã xử lý từ lớp bussiness về View.
Lớp Action xử lý các HTTP request, và tạo sự phản hồi từ HTTP response.
Các tham số : mapping : ActionMapping sử dụng để chọn trường hợp này :
form : Tùy chọn ActionForm cho yêu cầu (nếu có)
request : The HTTP request
response : The HTTP response
II.3.3.2 Struts DispathAction Class
Lớp org.apache.struts.actions.DispatchAction cho phép một người sử dụng để thu thập các chức năng liên quan trong một action đơn lẻ. Nó giúp loại bỏ sự cần thiết của việc tạo ra nhiều Action độc lập cho mỗi chức năng. Với các action mà extend từ DispatchAction thì sẽ thực hiện được nhiều hành động phụ thuộc vào tham số truyền từ url mà được điều khiển bởi controller.
Ví dụ 13 : Ví dụ về DispathAction
Định nghĩa form Bean trong struts-config.xml file
Phát triển Action Mapping trong the struts-config.xml
<action path="/DispatchAction"
type=" package.Dispatch_Action"
parameter="parameter"
input="/pages/DispatchAction.jsp"
name="DispatchActionForm"
scope="request"
validate="false">
Phát triển trang jsp
Dispatch Action ExampleDispatch Action ExampleCall Add Section Call Edit Section Call Search Section Call Save Section
II.3.3.3 Struts LookupDispathAction Class
Lớp org.apache.struts.actions.LookupDispatchAction là lớp con của lớp
org.apache.struts.actions.DispatchAction . Nó giống lớp DispatchAction chỉ ngoại trừ là nó sử dụng một Java Map and ApplicationResource.properties to dispatch giao thức.
Ví dụ 14 : Ví dụ về LookupDispathAction
Application.properties Trong cùng cấu trúc thư mục nơi class đã lưu
package.add=addpackage.edit=editpackage.search=searchpackage.save=save
Định nghĩa Message Resources in struts-config.xml
Action Mapping in the struts-config.xml
LookupDispatchAction.jsp
Dispatch Action ExampleDispatch Action ExampleCall Add Section Call Edit Section Call
II.3.3.4 Struts ForwardAction Class
Lớp org.apache.struts.actions.ForwardAction cho phép người dùng để chuyển tiếp yêu cầu đến URL được chỉ định.
Ví dụ 15 : Ví dụ về ForwardAction
Action Mapping trong struts-config.xml
Struts Tags
Struts đưa ra các thư viện thẻ để hỗ trợ việc lập trình View logic trong JSP. Các thư viện thẻ JSP cho phép các JSP author sử dụng các thẻ giống HTML.
+ HTML: Sử dụng để generate các HTML form tương tac với Struts API
+ Bean: Sử dụng để làm việc với các Java bean object trong JSP
+ Logic: Sử dụng để implement các logic điều kiện đơn giản trong JSP
+ Nested: Sử dụng để cho phép các mức nested tùy ý
Để sử dụng các Struts Tags ta phải include :
NGÔN NGỮ JAVASCRIPT
Script có thể xem như một công cụ nhỏ nhằm hỗ trợ ngời lập trình tạo ra các ứng dụng nhanh chóng, đơn giản chứ không mang tính chuyên nghiệp nh một ngôn ngữ lập trình thật sự.
JavaScript là một loại Script cho phép phát triển các ứng dụng trên Internet ở cả phía Client và Server bằng cách viết các chơng trình với cú pháp hoàn toàn giống Java.
+ JavaScript là một ngôn ngữ script, dùng để phát triển các ứng dụng Internet ở Client và Server.
+ JavaScript có thể viết kèm trong file HTML để xây dựng một trang Web chặt chẽ, phong phú về nội dung và hình thức, như kiểm tra tính tơng thích và thông báo lỗi trong quá trình nhập liệu...
Cách viết JavaScript trong một trang HTML như sau:
//Các hàm của JavaScript đặt ở đây
CÔNG NGHỆ AJAX
Giới thiệu
+ “Công nghệ Ajax” chỉ mới xuất hiện vào khoảng tháng 2 năm 2005.
+ Ajax - Asynchronous JavaScript and XML (JavaScript và XML không đồng bộ) là công cụ cho phép tăng tốc độ ứng dụng Web bằng cách cắt nhỏ dữ liệu và chỉ hiển thị những gì cần thiết thay vì phải tải đi tải lại toàn bộ trang Web.
+ Ajax không phải là một công nghệ đơn lẻ mà nó là tập hợp của nhiều công nghệ.
AsynchronousJavascript + CSS + DOM + XMLHttpRequest
+ Ajax bao gồm:
-Thể hiện Web theo tiêu chuẩn XHTML và CSS.
-Nâng cao tính năng động và phản hồi bằng DOM (Document Object Model).
-Trao đổi và truy cập/tác động lên thông tin, dữ liệu bằng XSL và XSLT.
-Nhận thông tin không đồng bộ (Synchronous) dùng XMLHttpRequest.
-Và tất cả các kỹ thuật trên được liên kết lại với nhau bằng Javascript.
Cơ chế và nguyên lý hoạt động
Cơ chế : Như vậy Ajax nó đóng vai trò như một lớp trung gian giữa giao diện trên trình duyệt và máy chủ xử lý thông tin. Có thể mô tả một cách cụ thể cách thức hoạt động của Ajax như sau :
● Ajax thực hiện tương tác với máy chủ bằng cách sử dụng đối tượng XMLHttpRequest, nhận kết quả trả về dưới dạng XML và phân tích kết quả bằng công nghệ DOM
● Tương tác giữa Ajax và giao diện người dùng được thực hiện thông qua các mã Javascript và XHTML+CSS.
Cơ chế : - Công nghệ Ajax thì sẽ cho phép tạo ra một Ajax Engine. Khi đó các yêu cầu gởi request và nhận Response sẽ do Ajax Engine thực hiện.
- Web server gởi trả dữ liệu dưới dạng XML và Ajax Engine sẽ tiếp nhận, sau đó thực hiện phân tích chuyển hoá thành XHTML+CSS cho trình duyệt hiển thị.
- Các việc này được thực hiện trên Client nên giảm tải rất nhiều cho Server, đồng thời với người sử dụng thì sẽ thấy kết quả hiển thị ngay tức thì mà không cần nạp lại nguyên cả trang.
Nguyên lý hoạt động : Để minh họa cho cơ chế Ajax xin đưa ra hai mô hình tương tác như sau :
+ Mô hình thứ nhất là mô hình tương tác giữa máy chủ và máy khách trong các ứng dụng Web truyền thống .
+ Mô hình thứ hai thể biểu diễn quá trình tương tác giữa máy chủ và máy khách trong các ứng dụng Web có sử dụng công nghệ Ajax.
Hình 3 : Mô hình xử lý của Ajax
+ Một trong những điểm mấu chốt của công nghệ Ajax là không tương tác trực tiếp với máy chủ như truyền thống mà là qua một lớp trung gian của Ajax.
+ Chính điều đó sẽ tạo ra sự ngạc nhiên về cơ chế xử lý này vì sẽ phải qua thêm một lớp trung gian và như vậy thì sẽ làm chậm đi quá trình tương tác.
Tuy nhiên thực tế thì không như vậy, nguyên nhân là :
- Không phải lúc nào cũng cần phải tương tác với máy chủ như trong trường hợp của Gmail, một khi giao diện của Gmail đã được tải về xong thì những tác vụ như chuyển từ thư mục này hay sang xem thư mục khác không nhất thiết phải đòi hỏi gọi lại máy chủ.
- Bằng cách chỉ nhận những thông tin cần thiết (ở dạng XML), dung lượng truyền tải giữa máy khách và máy chủ sẽ giảm đi rất nhiều. Điều này nghĩa là giao diện của ứng dụng chỉ cần tải về một lần (lần đầu)
- Ajax sẽ không phải thực hiện tải lại toàn bộ giao diện đó mỗi khi có tương tác với máy chủ. Thay vào đó Ajax sẽ gởi yêu cầu đến máy chủ và nhận kết quả từ máy chủ về những gì đã thay đổi sau khi máy chủ thực hiện yêu cầu đó.
- Ajax sau đó sẽ thông báo cho phần giao diện (thông qua các lời gọi Javascript) thực hiện các thay đổi tương ứng trên giao diện
- Các tương tác giữa phần giao diện với Ajax là tương tác nội bộ trên trình duỵệt. Việc này giúp cho việc thực hiện các thay đổi được diễn ra rất nhanh (gần như ngay tức thì).
- Vì thế khi duyệt một trang hỗ trợ Ajax, người sử dụng không bao giờ thấy một của sổ trắng (blank) và biểu tượng đồng hồ cát –là những dấu hiệu cho thấy máy chủ đang thực hiện công việc.
Các khái niệm liên quan Ajax
Ngôn ngữ XML
+ XML (Extensible Markup Language) - là một bộ quy luật bao gồm các quy tắc để chia một tài liệu ra làm nhiều phần, rồi đánh dấu và ráp các phần khác nhau lại để dễ nhận diện chúng.
+ Tổ hợp Web toàn cầu W3C gọi XML là “một cú pháp thông dụng cho việc hiển thị cấu trúc trong dữ liệu”.
+ Mục tiêu chính của XML là tách biệt nội dung và dạng biểu diễn của văn bản (Baldwin).
+ Cùng một nội dung ta có thể biểu diễn dưới nhiều hình thức khác nhau : chẳng hạn in ra giấy hoặc đưa lên Web, và có thể áp dụng nhiều thuộc tính trên văn bản như in đậm, in nghiêng, in gạch dưới, dùng màu,...
+ Ngoài ra nhờ việc sử dụng các ký tự thông thường mà con người có thể hiểu được nôi dung của văn bản ngay khi còn đang ở dạng thô, chưa được áp dụng bất kỳ dạng biểu diễn nào
Một trang XML cần phải theo đúng các quy luật sau đây :
+ Trang XML phải bắt đầu bằng câu tuyên bố XML
+ Mỗi bộ phận, gọi là “element” phải nằm giữa Tag Pair.
+ Nếu Tag nào không chứa gì ở giữa thì phải chấm dứt bằng”/>”
Một trang XML cần phải theo đúng các quy luật sau đây :
+ Một trang XML phải có một element độc nhất chứa tất cả các element khác. Đó là root của cây biểu diễn trang XML .
+ Các Tag Pair không được xen kẻ nhau, các Tag Pair phải đánh vần đúng y như nhau kể cả chữ hoa, chữ thường ( và là bất hợp lệ) và các Attribute đều phải nằm giữa hai ngoặc kép (standalone=yes là bất hợp lệ, phải viết standalone=”yes”).
Đối tượng DOM (Document Object Model)
+ Mô hình đối tượng tài liệu là một giao diện lập trình ứng dụng (API).
+ Thông thường DOM có dạng một cây cấu trúc dữ liệu và được dùng để truy xuất các tài liệu HTML và XML.
+ Mô hình DOM hoạt động độc lập với hệ điều hành và dựa theo kỹ thuật lập trình hướng đối tượng để mô tả tài liệu.
+ Trong Ajax mô hình DOM đóng vai trò phân tách dữ liệu truyền dưới dạng XML.
+ Để phân tích một văn bản XML bằng máy tính ta thường dùng một trong hai hoặc cả hai mô hình phân tích là SAX (Simple API for XML) và DOM.
+ Theo mô hình phân tích DOM, toàn bộ nội dung của một văn bản XML sẽ được lưu giữ vào bộ nhớ trong dưới dạng một cấu trúc cây
+ Trong Ajax XHTML cùng với CSS đóng vai trò hiển thị dữ liệu cho trang Web.
+XHTML là một chuẩn kết hợp giữa HTML và XML và trở thành một định dạng riêng cho web. XHTML cho phép HTML được mở rộng bằng các thẻ sở hữu.
+ Ngoài ra XHTML cũng được mã hoá chặt chẽ hơn HTML và phải tuân thủ nhiều quy tắc cấu trúc hơn HTML
Giới thiệu về XHTML
+ Trong XHTML tất cả các thẻ phải được đóng, các thuộc tính phải được cho vào dấu ngoặc kép (“”), và đặc biệt tất cả các thẻ và thuộc tính đều phải viết bằng chữ cái thường.
+ Mặc dù điều này có thể XHTML bị xem là cứng nhắc nhưng chính điều này lại là ưu điểm của nó: quy chuẩn và nguyên tắc.
+ XHTML là phiên bản kết hợp của HTML nên có những điểm khác cơ bản với HTML
- Các File XHTML cần phải well-formed có nghĩa là các thẻ …phải tuân thủ theo chuẩn .
- Các thể lồng nhau phải đúng trật tự .
- Các thẻ và các thuộc tính của các phần tử phải được viết bằng chữ thường.
- Các thuộc tính của các phần tử phải được đóng nháy kép: ví dụ ,...
- Các thẻ được gọi là noempty cần phải được đóng bằng một thẻ đóng( …)
CSS (Cascading Style Sheets)
+ Tập định kiểu theo tầng, được dùng để miêu tả cách trình bày các tài liệu viết bằng ngôn ngữ HTML, XHTML, XML, SVG, XUL…
+ Các thông số kỹ thuật của CSS do World Wide Web Consortium (W3C) quản lý. Trong Ajax CSS cùng với XHTML đóng vai trò hiển thị dữ liệu cho trang web .
DHTML
+ Hay HTML động tạo một trang Web bằng cách kết hợp các thành phần ngôn ngữ đánh dấu HTML tĩnh, ngôn ngữ lệnh máy khách (như JavaScript ) và ngôn ngữ định dạng CSS và DOM.
+ Do có khả năng phong phú, DHTML còn được sử dụng như một công cụ để xây dựng các trò chơi đơn giản trên trình duyệt .
Đối tượng XMLHttpRequest
+ Để hiểu được cơ chế hoạt động của Ajax thì chúng ta phải biết được XMLHttpRequest là gì ? Như nhiều chuyên gia đã nhận định một trong những điểm quan trọng nhất của Ajax là nằm ở XMLHttpRequest
+ Điều đó cho thấy rằng, vì XMLHttpRequest có vai trò quan trọng đặc biệt trong công nghệ như vậy nên một ứng dụng của Ajax có thực thi và mang hiệu quả hay không phụ thuộc vào việc trình duyệt có hỗ trợ đối tượng này. Nếu một trình duyệt không hỗ trợ XMLHttpRequest sẽ không thể diễn ra quá trình trao đổi giữa máy client và máy server
+ Thông thường trong một ứng dụng web, để có thể gởi một HTTP Request đến máy chủ bằng JavaScript bạn cần tạo một đối tượng của lớp cung cấp tính năng này. Trong Interner Exploer (IE) thì lớp này tồn tại dưới dạng một ActiveX có tên là XMLHTTP
+ Đối tượng XMLHttpRequest không phải là một chuẩn của W3C (World Wide Web Consortium). Đối tượng XMLHttpRequest được hỗ trợ ở IE 5.0+, Safari 1.2, Mozilla1.0/Firefox, Opera 8.0 và Netcape 7+.
var httpReqquest =new XMLHttpRequest();
+ Do sự khác biệt này nên để các ứng dụng có thể chạy được trên các trình duyệt chúng ta phải khai báo:
if(window.XMLHttpRequest)
{ //Mozilla,Safari ,..
httpRequest=new XMLHttpRequest();
}else if(window.ActiveXObject)
{//IE..
httpRequest=new ActiveXObject(Microsoft.XMLHTTP”);
}
+ Do ActiveX trên IE rất nguy hiểm cho nhiều người dùng nên trong nhiều trường hợp tính năng này bị cấp. Vì vậy bạn cần phải kiểm tra trình duyệt trước khi gọi đối tượng XMLHTTP. Quá trình kiểm tra này được thực hiện thông qua giá trị của window.ActiveXObject
Ví dụ : if(window.ActiveXObject) {
xmlhttp=new ActiveXObject(“Microsoft.XMLHTTP”);
}
else{…}
CHƯƠNG 3
PHÂN TÍCH VÀ THIẾT KẾ HỆ THỐNG
Phân tích yêu cầu
Yêu cầu trang web
Trang vàng Đà Nẵng là cổng thông tin cho các du khách đến du lich tại Đà Nẵng. Trang vàng Đà Nẵng cung cấp các thông tin:
- Thông tin du lịch
Danh bạ khách sạn
Danh bạ ẩm thực
Địa điểm mua sắm
Vui chơi giải trí
Phương tiện vận chuyển ( Sân bay, bến xe )
Tiện ích công cộng( Ngân hang, bưu điện)
Xây dựng ứng dụng web với struts + Hibernate Framework
Đề tài gồm có 2 phần chính: phần khách hàng và phần quản lý:
Yêu cầu người dùng
Xem thông tin về khách sạn, ẩm thực , địa điểm mua sắm, vui chơi giải trí, tiện ích công cộng.
Tìm kiếm thông tin với các tiêu chí:
Khách sạn : Giá cả
Tiêu chuẩn (Mấy sao)
Vị trí ( Quận, Huyện )
Ẩm thực : Loại món ăn
Giá cả
Vị trí ( Quận, Huyện )
Tên nhà hàng
Mua sắm : Mặt hàng ( Điện tử , thời trang , đồ lưu niệm )
Vị trí ( Quận, Huyện )
Vui chơi giải trí : Loại vui chơi giải trí ( Rạp chiếu phim, cà phê , vũ trường)
Vị trí ( Quận Huyện )
Tiện ích công cộng : Loại tiện ích ( Ngân hàng , Bưu điện)
Vị trí ( Quận, Huyện )
Khi khách hàng đăng kí là thành viên của trang web, khách hàng có thể quảng bá thông tin nhà hàng , khách san..v.v. của mình.( Nhập thông tin theo form).
Khi khách hàng đăng kí là thành viên của trang web. Vào thông tin 1 nhà hàng hoặc khách san. Khách hàng có thể thêm lời bình luận và đánh giá cho nhà hàng hoặc khách sạn đó.
Yêu cầu quản lý
Quản lý các thông tin về nhà hàng, khách sạn, mua sắm, vui chơi giải trí, tiện ích công cộng.
Cập nhật thông tin
Thêm mới
Xóa
Tìm kiếm
Quản lý thông tin các thành viên
Cập nhật thông tin
Thêm mới
Xóa
Tìm kiếm
Đặc tả yêu cầu
Mô hình USE-CASE của hệ thống
Hình 4 : Mô hình USECASE hệ thống
Đặc tả các USE-CASE của hệ thống
Đặc tả USE-CASE đăng nhập
II.2.1.1. Miêu tả
Đối với khách hang: là 1 thành viên của trang web đăng nhập vào hệ thống để chỉnh sửa thông tin cá nhân, đăng 1 quảng cáo về nhà hàng , khách sạn, thông tin du lịch…
Đối với quản trị viên : đăng nhập vào hệ thống để có thể thực hiện các thao tác quản lý (quản lý thành viên, quản lý thông tin trên trang web…).
II.2.1.2. Tác nhân
Khách hàng và quản trị viên chưa đăng nhập vào hệ thống.
II.2.1.3. USE-CASE liên quan
Không có.
II.2.1.4. Các luồng sự kiện
Luồng sự kiện chính
Trên giao diện web và giao diện quản lý người dùng chọn đăng nhập.
Hệ thống hiển thị giao diện đăng nhập, yêu cầu người sử dụng nhập username và password.
Người sử dụng nhập username và password, chọn đồng ý đăng nhập.
Hệ thống tiếp nhận thông tin, kiểm tra username và password của người dùng.
Nếu hợp lẹ hệ thống sẽ chấp nhận đăng nhập, hiển thị thông báo đăng nhập thành công.
Kết thúc USE-CASE.
Các luồng sự kiện khác
Luồng 1:
Tại giao diện đăng nhập, người dùng không muốn tiếp tục, chọn hủy bỏ
Kết thúc USE-CASE
Luồng 2:
Hệ thống kiểm tra thông tin đăng nhập không chính xác
Hệ thống từ chối đăng nhập hiển thị thông báo lỗi
Kết thúc USE-CASE
Luồng 3:
Hệ thống kết nối cơ sở dữ liệu để kiểm tra thông tin, quá trình kết nối không thành công, không thực hiện kiểm tra được
Hiển thị thông báo lỗi
Kết thúc USE-CASE
II.2.1.5. Sơ đồ tuần tự (Sequence Diagram)
Hình 5 : Sơ đồ tuần tự UseCase đăng nhập
II.2.1.6 Sơ đồ lớp (Class Diagram)
Hình 6 : Sơ đồ lớp Usecase đăng nhập
Đặc tả USE-CASE xem thông tin du lịch
II.2.2.1. Miêu tả
Mọi thông tin về du lịch về nhà hàng, khách sạn, món ăn, phương tiện đi lại, tiện ích công cộng đều được load lên trang web. Nhưng chỉ load 1 phần nội dung. Để có thể xem chi tiết từng thông tin bạn cần chọn xem 1 thông tin cụ thể bằng cách nhấp chuột vào hyperlink tiêu đề của mỗi thông tin.
II.2.2.2. Tác nhân
Khách hàng đã và chưa đăng nhập vào hệ thống.
II.2.2.3. USE-CASE liên quan
Không có.
II.2.2.4. Các luồng sự kiện
Luồng sự kiện chính
Trên màn hình giao diện trang web, người dùng chọn xem thông tin theo từng danh mục.
Hệ thống truy vấn cơ sở dữ liệu lấy tất cả thông tin theo danh mục khách hàng chọn và hiển thị trên màn hình.
Bạn chọn vào 1 thông tin trong danh sách các thông tin được trả về
Chi tiết về thông tin đó sẽ được hiển thị.
Kết thúc USE_CASE.
Các luồng sự kiện khác
Kích vào xem thông tin 1 danh mục nhưng không có thông tin nào trong cơ sở dữ liệu.
Một hộp thông báo xuất hiện báo không có dữ liệu nào trong cơ sở dữ liệu.
Kết thúc USE-CASE.
II.2.2.5. Sơ đồ tuần tự (Sequence Diagram)
Hiển thị thông tin một danh mục
Hình 7 : Sơ đồ tuần tự Usecase xem thông tin du lịch phần danh mục
Hiển thị thông tin chi tiết
Hình 8 : Sơ đồ tuần tự Usecase xem thông tin du lịch phần chi tiết
II.2.2.6 Sơ đồ lớp (Class Diagram)
Hình 9 : Sơ đồ lớp Usecase xem thông tin du lịch
Đặc tả USE-CASE tìm kiếm thông tin
II.2.3.1. Miêu tả
USE-CASE cho phép khách hàng có thể lọc các thông tin theo các tiêu chí được lựa chọn. Ví dụ khách sạn sẽ có các tiêu chí như: Mấy sao, giá phòng, ở quận huyện nào …
II.2.3.2. Tác nhân
Khách hàng đã và chưa đăng nhập vào hệ thống.
II.2.3.3. USE-CASE liên quan
Không có.
II.2.3.4. Các luồng sự kiện
Luồng sự kiện chính
Ở màn hình hiển thị thông tin của 1 danh mục, phần bên trái là khung tìm kiếm.
Khách hàng chọn các tiêu chí để lọc các dữ liệu cần tìm và nhấn nút tìm kiếm.
Hê thống sẽ tìm kiếm thông tin thích hợp và hiện thị các kết quả tìm kiếm được tại màn hình danh mục.
Kết thúc USE-CASE.
II.2.3.5. Sơ đồ tuần tự (Sequence Diagram)
Hình 10 : Sơ dồ tuần tự Usecase tìm kiếm
II.2.3.6. Sơ đồ lớp (Class Diagram)
Hình 11 : Sơ đồ lớp Usecase tìm kiếm
Đặc tả USE-CASE bình chọn
II.2.4.1. Miêu tả
Khi vào xem 1 thông tin về khách sạn, nhà hàng, tiện ích công cộng nào đó. Khách hàng có thể bình chọn cho dịch vụ đó. Thể lệ bình chọn là từ 1 đến 5 sao.
Khách hàng cũng có thể viết lời bình cho dịch vụ đó. Các lời bình sẽ được hiển thị khi vào chi tiết của dịch vụ đó.
II.2.4.2. Tác nhân
Khách hàng đã đăng nhập vào hệ thống.
II.2.4.3. USE-CASE liên quan
USE-CASE đăng nhập phải được thực hiện.
II.2.4.4. Các luồng sự kiện
Luồng sự kiện chính
Khách hàng đăng nhập vào hệ thống.
Vào thông tin 1 dịch vụ nào đó.
Bình chọn hoặc viết lời bình chọn gửi.
Kết thúc USE-CASE.
II.2.4.5. Sơ đồ tuần tự (Sequence Diagram)
Hình 12 : Sơ đồ tuần tự Usecase bình chọn
II.2.4.6. Sơ đồ lớp (Class Diagram)
Hình 13 : Sơ đồ lớp Usecase bình chọn
Đặc tả USE-CASE đăng quảng cáo dịch vụ
II.2.5.1. Miêu tả
Khi khách hàng là thành viên của trang web, thông qua trang web khách hàng có thể đăng thông tin quảng cáo về dịch vụ của mình như: khách sạn, nhà hàng, các dịch vụ công cộng để duc khách có thể biết đến.
II.2.5.2. Tác nhân
Khách hàng đã đăng nhập vào hệ thống.
II.2.5.3. USE-CASE liên quan
USE-CASE đăng nhập phải được thực hiện.
II.2.5.4. Các luồng sự kiện
Luồng sự kiện chính
Khách hàng đăng nhập vào hệ thống.
Vào mục đăng quảng cáo dịch vụ du lịch.
Form đăng kí dịch xuất hiện, khách hàng cần điền đầy đủ thông tin để đăng quảng cáo.
Nhấn nút Đăng quảng cáo để cập nhật vào cơ sở dữ liệu.
Xuất hiện đăng quảng cáo thành công, hiển thị chi tiết mẫu tin vừa đăng.
Kết thúc USE-CASE
Luồng sự kiện khác
Khách hàng không điền đầy đủ thông tin yêu cầu và nhấn nút đăng quảng cáo.
Sẽ xuất hiện thông báo yêu cầu nhập đầy đủ thông tin.
Kết thúc USE-CASE.
II.2.5.5. Sơ đồ tuần tự (Sequence Diagram)
Hình 14 : Sơ đồ tuần tự Usecase đăng quảng cáo dịch vụ
II.2.5.6. Sơ đồ lớp (Class Diagram)
Đặc tả USE-CASE quản lý thông tin trang web
Gồm có quản lý khách sạn, quản lý nhà hàng, tiện ích công cộng, chuyến xe…
II.2.6.1. Miêu tả
Quản lý các thông tin trên trang web, bao gồm thông tin của người quản trị và thông tin của khách hàng đăng quảng cáo.
Trong phần quản lý có 4 hành động : tìm kiếm, thêm mới, xóa, chỉnh sửa.
II.2.6.2. Tác nhân
Quản trị viên sau khi đã đăng nhập vào hệ thống.
II.2.6.3. USE-CASE liên quan
USE-CASE đăng nhập phải được thực hiện.
II.2.6.4. Các luồng sự kiện
Luồng sự kiện tìm kiếm (Search)
Người quản trị nhập thông tin theo bộ lọc của hệ thống hỗ trợ và nhấn nút tìm kiếm.
Hệ thống truy vấn thông tin theo yêu cầu và trả kết quả về.
Hệ thống hiển thị 1 danh sách các kết quả ra màn hình cho phép người dùng chọn.
Kết thúc USE-CASE.
Luồng sự kiện chỉnh sửa (Edit)
Từ màn hình hiển thị danh sách các kết quả của tìm kiếm, khách hàng nhấn vào hyperlink của 1 tiêu đề thông tin.
Màn hình chi tiết thông tin sẽ được hiển thị. Các dữ liệu được hiển thị trong textbox cho phép bạn chỉnh sửa.
Nhấn nút Lưu để lưu lại những sụ thay đổi của mình
Kết thúc USE-CASE
Luồng sự kiện thêm mới (AddNew)
Từ màn hình quản lý danh mục bạn nhấn vào nút them mới.
Form thông tin sẽ được hiện ra yêu cầu bạn nhập thông tin vào.
Nhấn nút Thêm để them mới 1 thông tin vào cơ sở dữ liệu.
Màn hình thông báo thêm thông tin thành công và hiển thị thông tin vừa mới thêm.
Kết thúc USE-CASE.
Luồng sự kiện xóa (Delete)
Từ màn hình hiển thị danh sách các kết quả của tìm kiếm, khách hàng cheó vào ô đầu tiên của mỗi thông tin để dánh dấu xóa.
Nhấn nút xóa để xóa các thông tin đã chéo.
Hộp thông báo xóa thành công xuất hiên.
Kết thúc USE-CASE.
II.2.6.5. Sơ đồ tuần tự (Sequence Diagram)
Tìm kiếm
Hình 15 : Sơ đồ tuần tự Usecase quản lý thông tin phần tìm kiếm
Chỉnh sửa/Thêm mới
Hình 16 : Sơ đồ tuần tự Usecase quản lý thông tin phần chỉnh sửa/thêm mới
Xóa
Hình 17 : Sơ đồ tuần tự Usecase quản lý thông tin phần xóa
II.2.6.6. Sơ đồ lớp (Class Diagram)
Hình 18 : Sơ đồ lớp phần quản lý thông tin
Đặc tả USE-CASE quản lý thành viên
II.2.7.1. Miêu tả
Quản trị viên sau khi đăng nhập có thể quản lý các thành viên đăng kí trên hệ thống. Bao gồm 4 hành động : Chỉnh sửa, Thêm mới, Xóa, Tìm kiếm.
II.2.7.2. Tác nhân
Quản trị viên sau khi đã đăng nhập vào hệ thống.
II.2.7.3. USE-CASE liên quan
USE-CASE đăng nhập phải được thực hiện.
II.2.7.4. Các luồng sự kiện
Luồng sự kiện tìm kiếm (Search)
Từ màn hình quản lý thành viên. Người quản trị nhập thông tin vào bộ lọc và nhấn nút Search.
Hệ thống tìm kiếm thông tin thành viên phù hợp với thông tin người quản trị nhập vào.
Hiển thị danh sách kết quả lên màn hình.
Kết thúc USE-CASE.
Luồng sự kiện chỉnh sửa (Edit)
Từ màn hình hiển thị danh sách các kết quả của tìm kiếm, người quản trị nhấn vào hyperlink của 1 tên thành viên.
Màn hình chi tiết thành viên đó sẽ được hiển thị. Các dữ liệu được hiển thị trong textbox cho phép bạn chỉnh sửa.
Nhấn nút Lưu để lưu lại những sự thay đổi của mình.
Kết thúc USE-CASE.
Luồng sự kiện thêm mới (AddNew)
Từ màn hình quản lý thành viên bạn nhấn vào nút thêm mới.
Form thành viên sẽ được hiện ra yêu cầu bạn nhập thông tin vào.
Nhấn nút Thêm để thêm mới 1 thành viên vào cơ sở dữ liệu.
Màn hình thông báo thêm thành viên thành công và hiển thị thông tin thành viên vừa mới thêm.
Kết thúc USE-CASE.
Luồng sự kiện xóa (Delete)
Từ màn hình hiển thị danh sách các kết quả của tìm kiếm, người quản trị chéo vào ô đầu tiên của mỗi thành viên để đánh dấu xóa.
Nhấn nút xóa để xóa các thành viên đã chéo.
Hộp thông báo xóa thành công xuất hiên.
Kết thúc USE-CASE.
II.2.7.5. Sơ đồ tuần tự (Sequence Diagram)
Tìm kiếm
Hình 19 : Sơ đồ tuần tự Usecase quản lý thành viên phần tìm kiếm
Chỉnh sửa/Thêm mới
Hình 20 : Sơ đồ tuần tự Usecase quản lý thành viên phần chỉnh sửa/thêm mới
Xóa
Hình 21 : Sơ đồ tuần tự Usecase quản lý thành viên phần xóa
II.2.7.6. Sơ đồ lớp (Class Diagram)
Hình 22 : Sơ đồ lớp Usecase quản lý thành viên
CHƯƠNG 4
CÀI ĐẶT VÀ TRIỂN KHAI CHƯƠNG TRÌNH
Thiết kế cơ sở dữ liệu
Mô hình ý niệm dữ liệu
Các lớp và thuộc tính của chúng
Hình 23 : Các lớp và thuộc tính của chúng
Biểu đồ quan hệ giữa các lớp
Hình 24 : Biểu đồ quan hệ giữa các bảng
Chi tiết về các bảng trong cơ sở dữ liệu
Bảng TaiKhoan
STT
Tên trường
Kiểu dữ liệu
Độ dài
Miêu tả
1
id_user
Int
10
id của tài khoản, id tự tăng
2
Taikhoan
Varchar
20
Tên tài khoản
3
Matkhau
Varchar
20
Mật khẩu
4
Hoten
Varchar
20
Họ tên
5
Diachi
Varchar
50
Địa chỉ
6
Email
Varchar
20
Địa chỉ email
7
Sodt
Varchar
20
Số điện thoại
8
Hinhanh
Varchar
50
Đường dẫn hình ảnh của thành viên
9
Ngaythamgia
Date
10
Ngày thành viên đăng kí
Bảng KhachSan
STT
Tên trường
Kiểu dữ liệu
Độ dài
Miêu tả
1
id_khachsan
Int
10
id của khách sạn, id tự tăng
2
id_loaikhachsan
Int
10
id loại khách sạn, tham chiếu đến bảng loại khách sạn
3
ten_khachsan
Varchar
20
Tên khách sạn
4
Diachi
Varchar
50
Đỉa chỉ khách sạn
5
id_quanhuyen
Int
10
id quận huyện(vị trí của khách sạn), tham chiếu đến bảng quận huyện
6
Sodt
Varchar
20
Số điện thoại
7
Website
Varchar
20
Website của khách sạn
8
Tieuchuan
Byte
1
Tiêu chuẩn(Mấy sao)
9
Giaphong
Int
10
Giá phòng bình dân của khách sạn(theo VND)
10
Mota
Varchar
1000
Mô tả chung về khách sạn
11
Dichvu
Varchar
1000
Dịch vụ kèm theo của khách sạn
12
Hinhanh
Varchar
50
Đường dẫn hình ảnh khách sạn
13
Bando
Varchar
50
Đường dẫn bản đồ chỉ dẫn đi đến khách sạn
14
id_user
Int
10
Id user đăng quảng cáo khách sạn, tham chiếu đến bảng tài khoản
15
Ngaydang
Date
10
Ngày khách sạn được đăng quảng cáo
Bảng LoaiKhachSan
STT
Tên trường
Kiểu dữ liệu
Độ dài
Miêu tả
1
id_loaikhachsan
Int
10
id loại khách sạn, id tự tăng
2
ten_loaikhachsan
Varchar
20
Tên loại khách sạn
3
Mota
Varchar
1000
Mô tả chung về loại hình khách sạn
Bảng NhaHang
STT
Tên trường
Kiểu dữ liệu
Độ dài
Miêu tả
1
id_nhahang
Int
10
id của nhà hàng, id tự tăng
2
id_loainhahang
Int
10
id loại nhà hàng, tham chiếu đến bảng loại nhà hàng
3
ten_nhahang
Varchar
20
Tên nhà hàng
4
Diachi
Varchar
50
Đỉa chỉ nhà hàng
5
id_quanhuyen
Int
10
id quận huyện(vị trí của nhà hàng), tham chiếu đến bảng quận huyện
6
Sodt
Varchar
20
Số điện thoại
7
Website
Varchar
20
Website của nhà hàng
8
Mota
Varchar
1000
Mô tả chung về nhà hàng
9
Dichvu
Varchar
1000
Dịch vụ kèm theo của nhà hàng
10
Hinhanh
Varchar
50
Đường dẫn hình ảnh nhà hàng
11
Bando
Varchar
50
Đường dẫn bản đồ chỉ dẫn đi đến nhà hàng
12
id_user
Int
10
id user đăng quảng cáo nhà hàng, tham chiếu đến bảng tài khoản
13
Ngaydang
Date
10
Ngày nhà hàng được đăng quảng cáo
Bảng LoaiNhaHang
STT
Tên trường
Kiểu dữ liệu
Độ dài
Miêu tả
1
id_loainhahang
Int
10
id loại nhà hàng, id tự tăng
2
ten_loainhahang
Varchar
20
Tên loại nhà hàng
3
Mota
Varchar
1000
Mô tả chung về loại hình nhà hàng
Bảng MonAn
STT
Tên trường
Kiểu dữ liệu
Độ dài
Miêu tả
1
id_monan
Int
10
id của món ăn, id tự tăng
2
id_loaimonan
Int
10
id loại món ăn, tham chiếu đến bảng loại món ăn
3
ten_monan
Varchar
20
Tên món ăn
4
id_nhahang
Varchar
50
id nhà hàng có món ăn đó, tham chiếu đến bảng nhà hàng
5
Mota
Varchar
1000
Mô tả chung về món ăn
6
Hinhanh
Varchar
50
Đường dẫn hình ảnh món ăn
7
Giaca
Int
10
Giá của món ăn(Tính theo VND)
Bảng LoaiMonAn
STT
Tên trường
Kiểu dữ liệu
Độ dài
Miêu tả
1
id_loaimonan
Int
10
id loại món ăn, id tự tăng
2
ten_loaimonan
Varchar
20
Tên loại món ăn
3
Mota
Varchar
1000
Mô tả chung về loại món ăn
Bảng DichVuCongCong
STT
Tên trường
Kiểu dữ liệu
Độ dài
Miêu tả
1
id_dvcc
Int
10
id của dịch vụ công cộng, id tự tăng
2
id_loaidvcc
Int
10
id loại dịch vụ công cộng, tham chiếu đến bảng loại dịch vụ công cộng
3
ten_dvcc
Varchar
20
Tên dịch vụ công cộng
4
Diachi
Varchar
50
Đỉa chỉ dịch vụ công cộng
5
Id_quanhuyen
Int
10
id quận huyện(vị trí của dịch vụ công cộng), tham chiếu đến bảng quận huyện
6
Sodt
Varchar
20
Số điện thoại
7
Website
Varchar
20
Website của dịch vụ công cộng
8
Mota
Varchar
1000
Mô tả chung về dịch vụ công cộng
9
Hinhanh
Varchar
50
Đường dẫn hình ảnh dịch vụ công cộng
10
Bando
Varchar
50
Đường dẫn bản đồ chỉ dẫn đi đến dịch vụ công cộng
11
id_user
Int
10
id user đăng quảng cáo dịch vụ công cộng, tham chiếu đến bảng tài khoản
12
Ngaydang
Date
10
Ngày dịch vụ công cộng được đăng quảng cáo
Bảng LoaiDichVuCongCong
STT
Tên trường
Kiểu dữ liệu
Độ dài
Miêu tả
1
id_loaidvcc
Int
10
id loại dịch vụ công cộng, id tự tăng
2
ten_loaidvcc
Varchar
20
Tên loại dịch vụ công cộng
3
Mota
Varchar
1000
Mô tả chung về loại hình dịch vụ công cộng
Bảng ChuyenXe
STT
Tên trường
Kiểu dữ liệu
Độ dài
Miêu tả
1
id_chuyenxe
Int
10
id của chuyến xe, id tự tăng
2
ten_chuyenxe
Varchar
20
Tên chuyến xe
3
Noidi
Varchar
20
Nơi xuất phát
4
Noiden
Varchar
20
Điểm đi đến
5
Mota
Varchar
1000
Mô tả chung về chuyến xe
6
Hinhanh
Varchar
50
Đường dẫn hình ảnh chuyến xe
7
Bando
Varchar
50
Đường dẫn bản đồ chỉ dẫn đi đến chuyến xe
8
id_user
Int
10
id user đăng quảng cáo chuyến xe, tham chiếu đến bảng tài khoản
9
Ngaydang
Date
10
Ngày chuyến xe được đăng quảng cáo
Bảng QuanHuyen
STT
Tên trường
Kiểu dữ liệu
Độ dài
Miêu tả
1
id_quanhuyen
Int
10
id quận huyện, id tự tăng
2
ten_quanhuyen
Varchar
20
Tên quận huyện
3
Thanhpho
Varchar
1000
Thuộc thành phố
Sơ đồ quan hệ giữa các bảng
Hình 25 : Sơ đồ quan hệ giữa các bảng
Thiết kế chương trình
Sơ đồ phân rã chức năng
Thông tin du lịch
Thông tin nhà hàng, khách sạn
Dịch vụ công cộng
Phương tiện đi lại
Xem
Tìm kiếm
Trang vàng
User đăng nhập
Quản lý thông tin quảng cáo
Chỉnh sửa thông tin cá nhân
Bình luận nhà hàng, khách sạn
Đăng mới
Chỉnh sửa
Xóa
Gia hạn
Hình 26 : Sơ đồ phân rã chức năng
Một số môdun chính
Modun tìm kiếm khách sạn
Từ Form nhận dữ liệu nhập vào để SearchHotel.java xử lý
Khởi tạo WhereString , nếu một trường nào khác null sẽ thêm truy vấn vào chuỗi WhereString.
Thêm chuỗi WhereString vào câu truy vấn để truy vấn
Lấy kết quả dạng List gán lại cho Form để hiển thị trên màn hình
Mã nguồn
String WhereString = "";
if(hotelName != null)
{
WhereString += "WHERE khachsan.ten_khachsan LIKE '%"+hotelName+"%'";
}
Integer star = ((ViewHotelsForm)form).getStart();
if(star!= null && star != 0)
{
if(WhereString.length()>0) WhereString+= " AND tieuchuan="+star;
else WhereString+= "WHERE tieuchuan="+star;
}
String type = ((ViewHotelsForm)form).getType();
if(type!=null && !type.equals("0"))
{
if(WhereString.length()>0) WhereString+= " AND khachsan.id_loaikhachsan="+type;
else WhereString+= "WHERE khachsan.id_loaikhachsan="+type;
}
String query = "SELECT id_khachsan,ten_khachsan,loaikhachsan.ten_loaikhachsan,diachi,tieuchuan,website,hinhanh,songaydangki,ngaydang from khachsan INNER JOIN loaikhachsan ON khachsan.id_loaikhachsan=loaikhachsan.id_loaikhachsan "+WhereString+" ORDER BY ngaydang DESC";
ResultSet rs = st.executeQuery(query);
java.util.Date ngayhientai= new java.util.Date();
while(rs.next())
{
ViewHotelsForm hotel = new ViewHotelsForm();
hotel.setId(rs.getString("id_khachsan"));
hotel.setHotelName(rs.getString("ten_khachsan"));
hotel.setAddress(rs.getString("diachi"));
hotel.setType(rs.getString("ten_loaikhachsan"));
hotel.setStart(rs.getInt("tieuchuan"));
hotel.setWebsite(rs.getString("website"));
hotel.setImage(rs.getString("hinhanh"));
Integer songayconlai= ((ngayhientai.getYear()+1900)-Integer.parseInt(rs.getString("ngaydang").substring(0,4)))*356 + (ngayhientai.getMonth()+1- Integer.parseInt(rs.getString("ngaydang").substring(5,7)))*30 + ngayhientai.getDate() - Integer.parseInt(rs.getString("ngaydang").substring(8,10));
songayconlai = rs.getInt("songaydangki") - songayconlai;
if(songayconlai > 0)
resultsHotel.add(hotel);
}
if(resultsHotel.isEmpty())
{
HttpSession session = request.getSession();
session.setAttribute("message","No result");
}
((ViewHotelsForm)form).setHotelsList(resultsHotel);
Modun xử lý tính hợp lễ của dữ liệu đăng kí
Nhận dữ liệu trừ Form vào gửi cho Validate của MemberForm.java xử lý
Kiểm tra các trường yêu cầu, nếu một trường nào bắt buộc bằng null sẽ thêm vào đối tượng ErrorMessage thông điệp tương ứng.
Mọi trường bắt buộc đều nhập đầy đủ sẽ tiếp tục kiểm tra tính hợp lệ của username và email (trong cơ sở dữ liệu không trùng). Nếu trùng sẽ thêm thông điệp vào đối tượng ErrorMessage
Nếu đối tượng ErrorMessage bằng null sẽ đưa qua cho RegisterAction.java xử lý đăng kí
Nếu đối tượng ErrorMessage khác null sẽ quay trở lại trang đăng kí và hiển thị thông điệp của ErrorMessage.
ActionErrors errors = new ActionErrors();
if(username != null)
{
if (username ==null || username.equals("")){
errors.add("validate", new ActionMessage("error.username.required"));
}
if(password == null || password.equals("")){
errors.add("validate", new ActionMessage("error.password.required"));
}
if(confirmPassword == null || confirmPassword.equals("")){
errors.add("validate", new ActionMessage("error.confirmPassword.required"));
}
if(name == null || name.equals("")){
errors.add("validate", new ActionMessage("error.name.required"));
}
if(email == null || email.equals("")){
errors.add("validate", new ActionMessage("error.email.required"));
}
if(username !=null && !username.equals(""))
{
try
{
Connection con = DataAccess.getConnection();
Statement st = con.createStatement();
String query="Select * from taikhoan where taikhoan='"+username+"'";
ResultSet rs = st.executeQuery(query);
if(rs.next()) {errors.add("validate", new ActionMessage("error.username_is_not_available"));}
}
catch(Exception e){System.out.println(e);}
}
if(password != null && confirmPassword != null && !password.equals(confirmPassword))
{
errors.add("validate", new ActionMessage("error.confirmPassword_is_wrong"));
}
if(email != null || !email.equals(""))
{
try
{
Connection con = DataAccess.getConnection();
Statement st = con.createStatement();
String query="Select * from taikhoan where email='"+email+"'";
ResultSet rs = st.executeQuery(query);
if(rs.next()) {errors.add("validate", new ActionMessage("error.email_is_not_available"));}
}
catch(Exception e){System.out.println(e);}
}
}
return errors;
Modun xử lý ajax
II.2.3.1. Xử lý kiểm tra tính hợp lệ của username
Bắt sự kiện khi người dùng bấm một chữ bất kì trên textbox username
Gửi yêu cầu kiểm tra username đến trang checkusername.jsp
Checkusername sẽ kiểm tra xem trong cơ sở dữ liệu đã có username trùng tên không. Nếu có sẽ trả về chuỗi String username đã được đăng kí . Nếu không sẽ trả về chuỗi String bạn có thể sử dụng username này.
Ajax nhận kết quả trả về và hiển thị lên màn hình
function showusername(str)
{
xmlHttp=GetXmlHttpObject();
if (xmlHttp==null)
{
alert ("Your browser does not support AJAX!");
return;
}
var url = "getusername.jsp";
url = url+ "?q=" + str;
url = url + "&sid=" + Math.random();
xmlHttp.onreadystatechange = stateChanged;
xmlHttp.open("GET",url,true);
xmlHttp.send(null);
}
function stateChanged()
{
if (xmlHttp.readyState == 4)
{
document.getElementById("txtHint").innerHTML = xmlHttp.responseText;
}
}
II.2.3.2. Xử lý kiểm tra tính hợp lệ của email
Bắt sự kiện khi người dùng đã nhập xong email
Gửi dữ liệu email người dùng nhập cho getemail.jsp
Getemail.jsp sẽ kiểm tra có @ trong dữ liệu nhập vào không. Nếu không sẽ trả về chuỗi String Email không hợp lệ . Nếu có thì kiểm tra trong cơ sở dữ liệu xem email này đã được đăng kí chưa. Nếu có thì sẽ trả về chuỗi Email đã được đăng kí .Nếu không sẽ trả về Email này sử dụng được.
function showemail(str)
{
xmlHttp=GetXmlHttpObject();
if (xmlHttp==null)
{
alert ("Your browser does not support AJAX!");
return;
}
var url = "getemail.jsp";
url = url+ "?q=" + str;
url = url + "&sid=" + Math.random();
xmlHttp.onreadystatechange = stateChanged1;
xmlHttp.open("GET",url,true);
xmlHttp.send(null);
}
function stateChanged1()
{
if (xmlHttp.readyState == 4)
{
document.getElementById("txtemail").innerHTML = xmlHttp.responseText;
}
}
CHƯƠNG 5
KẾT QUẢ THỬ NGHIỆM
Trang chính
Giới thiệu về Đà Nẵng, những nét nổi bật và đẹp nhất ở Đà Nẵng. Hai bên menu để có thể xem tất cả các thông tin của du lịch Đà Nẵng
Hình 27 : Hình ảnh trang chủ
Menu bên trái
- Các mục tìm kiếm nhà hàng, khách sạn, tiện ích, phương tiện đi lại.
- Tin tức du lịch, liệt kê 5 tin tức du lịch mới nhất.
- Giá vàng và ngoại tệ, nguồn từ sacombank và exibank
Menu bên phải
- Khách sạn mới đăng quảng bá
- Các món ăn ngon đặc sản của Đà Nẵng
- Thời tiết của một vài thành phố lớn của Việt Nam
Trang danh mục khách sạn
Thông tin về các khách sạn, resort, nhà nghỉ có trên địa bàn thành phố Đà Nẵng.
Hình 28 : Xem danh mục khách sạn
Sẽ thể hiện 3 kết quả trên 1 trang, và có link liên kết tới những trang tiếp theo
Menu phải xuất hiện khung tìm kiếm với các tiêu chí:
Tên khách sạn: tìm khách sạn có tên mà dữ liệu nhập vào là 1 phần của tên.
Loại khách sạn : có 3 loại là khách sạn, resort, nhà nghỉ
Vị trí : có thể tìm vị trí khách sạn theo quận huyện.
Tiêu chuẩn : có thể chọn tiêu chuẩn từ 1 -> 5 sao.
Trang chi tiết một khách sạn
Ở trang danh mục khách sạn, người xem có thể bấm vào liên kết là tên của khách sạn để có thể xem được chi tiết của khách sạn đó.
Hình 29 : Chi tiết khách sạn
Ở trang thông tin chi tiết khách sạn, người xem có thể xem thông tin chi tiết về khách sạn. Bao gồm giới thiệu chung, địa chỉ, tiêu chuẩn, giá phòng, website, số điện thoại, dịch vụ kèm theo và bản đỗ chỉ dẫn.
Phần dưới có phần bình luận của người xem về khách sạn này, người xem cũng có thể thêm bình luận bằng cách đăng nhập vào hệ thống và đăng bình luận.
Các phần nhà hàng, món ăn, tiện ích công cộng và phương tiện đi lại cũng có thể xem tương tự như khách sạn.
Trang ẩm thực Đà Nẵng
Trên trang này người xem có thể tìm kiếm các món ăn mà mình ưa thích. Sẽ tìm kiếm theo loại món ăn. Trang web hỗ trợ tùy chọn một số món ăn phổ biến. Với một món ăn người xem lựa chọn trang web sẽ liệt kê tất cả các món ăn đó và những nhà hàng , quán ăn nào bán món ăn đó. Các bạn cũng có thể xem chi tiết nhà hàng và giá cả từng loại món ăn.
Hình 30 : Ẩm thực Đà Nẵng
Phần quản lý của người dùng
Khi khách hàng đăng nhập vào hệ thống, sẽ hiện ra khung quản lý thông tin trên menu bên phải. Các thông tin quản lý: Quản lý khách sạn nhà hàng đăng quảng cáo, thay đổi thông tin cá nhân, xem hộp tin nhắn…
Hình 31 : Phần quản lý của người dùng
Trang quản lý thông tin khách sạn đăng
Khi người xem đăng nhập vào hệ thống, người xem có thể đăng thông tin quảng cáo nhà hàng khách sạn của mình.
Giao diện quản lý các mẫu tin đăng quảng cáo khách sạn của người dùng.
Hình 32 : Quản lý khách sạn đăng
Ở giao diện quản lý, người dùng chọn thêm mới để có thể thêm 1 khách sạn, mỗi khách sạn đăng bạn sẽ có 30 ngày miễn phí, nếu sau 30 ngày người dùng không trả tiền gia hạn thì mẫu tin đăng kí sẽ bị xóa. Bạn có thể gia hạn cho mẫu quảng cáo bằng cách bấm vào gia hạn.
Giao diện thêm mới một khách sạn
Hình 33 : Thêm mới một khách sạn
CHƯƠNG 6
KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN
Những kết quả đã đạt được
- Xây dựng được một web site cung cấp các thông tin du lich cho Đà Nẵng.
- Khi truy cập website mọi người có thể tìm kiếm các thông tin về du lịch về nhà hàng, khách sạn, các tiện ích công cộng, phương tiện đi lại trên thành phố để tránh khỏi bỡ ngỡ trước một thành phố mới lạ.
- Xây dựng cơ sở dữ liệu thích hợp để phục vụ cho chức năng tìm kiếm đạt hiệu quả cao hơn. Có thể dễ dàng tìm được thông tin thích hợp với những bước tìm kiếm đơn giản.
- Xây dựng được phần quản lý cho phép người quản lý có thể tùy chỉnh các thông tin cá nhân, quản lý các mẫu tin quảng cáo của mình.
- Khi xem một mẫu tin quảng cáo nhà hàng khách sạn trên trang web, người xem có thể bình luận thông tin để người khác có thể biết thêm chi tiết.
Tính khả thi, ưu điểm của website
- Qua trang giới thiệu các món ăn người xem có thể tìm kiếm những món ăn mình thích và vị trí gần nơi mình ở. Website chú trọng vào mục đích tìm kiếm này
- Những chủ nhà hàng khách sạn quán ăn có thể thông qua website quảng bá được hình ảnh của dịch vụ mình cho du khách. Điều này tạo nên được sự phong phú về dữ liệu của trang web.
- Giao diện website đẹp, các chức năng dễ sử dụng làm tăng tính hiệu quả của việc quản bá thông tin cá nhân, mọi người đều có thể sử dụng.
- Phần quản lý với các chức năng cơ bản : thêm, sửa, xóa có thể dễ dàng quản lý website.
- Website chỉ cho phép người dùng đăng quảng cáo miễn phí trong vòng 30 ngày, khách hàng muốn tiếp tục đăng quảng cáo phải nộp tiền, điều này tạo nên kinh phí để duy trì trang web.
Những hạn chế của đề tài
- Một số chức năng chưa phát triển được theo như thiết kế ban đầu như mục thông tin các công ty lữ hành, chức năng đánh giá.
- Chưa có chức năng nạp tiền vào tài khoản cho người dùng để có thể gia hạn đăng quảng cáo nhà hàng khách sạn.
- Việc tìm kiếm các tiện ích công cộng còn sơ sài, chưa có việc tìm kiếm ATM gần vị trí để dễ dàng trong việc quản lý tiền.
- Phần phương tiện đi lại tìm kiếm sơ sài. Chỉ tìm kiếm thông tin các chuyễn xê bus trên thành phố Đà Nẵng, chưa có chức năng tìm kiếm đi đến một địa điểm sẽ có bao nhiêu chuyến xe bus đi qua và đi vào lúc nào.
Hướng phát triển đề tài
- Hoàn thiện các chức năng của trang web, tìm kiếm tốt hơn, việc đăng quảng cáo nhà hàng và món ăn dễ dàng hơn.
- Phát triển chức năng nạp tiền vào tài khoản bằng các nhắn tin điện thoại.
- Thêm một số thông tin cho trang web như các công ty lữ hành ….
- Quản lý chặt chẽ việc đăng kí thành viên để tránh trường hợp thành viên đăng ký nhiều tài khoản để quảng cáo không mất tiền.
TÀI LIỆU THAM KHẢO
[1] Trần Kim Phong , Huỳnh Thị Khánh Duyên . Xây Dựng Ứng Dụng Web Với Struts Framework . NXB Giao thông vận tải 2007 , 264 trang
[2] Lê Minh Hoàng . Thiết Kế Web Với CSS . NXB Lao động Xã hội 2007 , 448 trang
[3] Hoàng Đức Hải . Thiết kế web với javaScript và Dom . NXB Phương Đông , 408 trang
[4] O'Reilly . Programming Jakarta Struts . Xuất bản năsm 2002
[5] Trang web
Các file đính kèm theo tài liệu này:
- Ứng dụng struts framework xây dựng trang vàng cho du lịch đà nẵng.doc