101005641-do-an

93
PHIẾU GIAO NHIỆM VỤ ĐỒ ÁN TỐT NGHIỆP 1. Mục đích nội dung của ĐATN Tìm hiểu công nghệ Struts, Hibernate và Spring. Xây dựng Demo ứng dụng tuyển dụng. 2. Các nhiệm vụ cụ thể của Đồ án tốt nghiệp Thực tập tại công ty TriaxVN để tìm hiểu về công nghệ Struts, Hibernate và Spring. Tìm hiểu nghiệp vụ và phân tích bài toán tuyển dụng. Xây dựng và cài đặt chương trình ứng dụng Demo. 3. Lời cam đoan của sinh viên: Tôi – Nguyễn Tuấn Minh – cam kết ĐATN là công trình nghiên cứu của bản thân tôi dưới sự hướng dẫn của Ths. Bùi Thị Hòa. Các kết quả nêu trong ĐATN là trung thực, không phải là sao chép toàn văn của bất kỳ công trình nào khác. Hà Nội, ngày 20 tháng 5 năm 2008 Tác giả ĐATN Nguyễn Tuấn Minh 4. Xác nhận của giáo viên hướng dẫn về mức độ hoàn thành của ĐATN và cho phép bảo vệ : Hà Nội, ngày 20 tháng 5 năm 2008 Giáo viên hướng dẫn Ths. Bùi Thị Hòa

Upload: ntung2961

Post on 12-Aug-2015

197 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: 101005641-Do-an

PHIẾU GIAO NHIỆM VỤ ĐỒ ÁN TỐT NGHIỆP

1. Mục đích nội dung của ĐATN

Tìm hiểu công nghệ Struts, Hibernate và Spring.

Xây dựng Demo ứng dụng tuyển dụng.

2. Các nhiệm vụ cụ thể của Đồ án tốt nghiệp

Thực tập tại công ty TriaxVN để tìm hiểu về công nghệ Struts, Hibernate và Spring.

Tìm hiểu nghiệp vụ và phân tích bài toán tuyển dụng.

Xây dựng và cài đặt chương trình ứng dụng Demo.

3. Lời cam đoan của sinh viên:

Tôi – Nguyễn Tuấn Minh – cam kết ĐATN là công trình nghiên cứu của bản thân tôi dưới sự hướng dẫn của Ths. Bùi Thị Hòa.

Các kết quả nêu trong ĐATN là trung thực, không phải là sao chép toàn văn của bất kỳ công trình nào khác.

Hà Nội, ngày 20 tháng 5 năm 2008Tác giả ĐATN

Nguyễn Tuấn Minh

4. Xác nhận của giáo viên hướng dẫn về mức độ hoàn thành của ĐATN và cho phép bảo vệ :

Hà Nội, ngày 20 tháng 5 năm 2008Giáo viên hướng dẫn

Ths. Bùi Thị Hòa

Page 2: 101005641-Do-an

TÓM TẮT NỘI DUNG ĐỒ ÁN TỐT NGHIỆP

Nội dung của đồ án này bao gồm những công việc sau:

Tìm hiểu về xu hướng phát triển ứng dụng Web trong giai đoạn hiện nay, thế hệ Web 2.0 và kỹ thuật AJAX.

Nghiên cứu, tìm hiểu công nghệ Struts, Hibernate và Spring. Đây là các công nghệ mã nguồn mở nổi tiếng nhất trong lĩnh vực lập trình ứng dụng Web dựa trên ngôn ngữ Java sử dụng theo mô hình MVC.

Áp dụng các công nghệ Struts, Hibernate, Spring và Ajax để xây dựng chương trình ứng dụng tuyển dụng trực tuyến.

Với những nội dung của đồ án được trình bày như trên, báo cáo đồ án tốt nghiệp được chia thành 3 chương. Nội dung của mỗi chương được trình bày như sau:

Chương 1: Giới thiệu chung về xu hướng phát triển các ứng dụng Web trong những năm gần đây. Trong đó, bao gồm việc tìm hiểu về công nghệ Web 2.0, kỹ thuật lập trình Ajax, kiến trúc J2EE trong Java và sơ lược một số Framework mã nguồn mở nổi tiếng trong xây dựng ứng dụng Web dựa trên ngôn ngữ Java.

Chương 2: Tập trung đi sâu tìm hiểu các công nghệ Struts, Hibernate và Spring với việc kế thừa các ưu điểm của mô hình lập trình Web điển hình: mô hình MVC. Đồng thời phân tích, đánh giá các điểm mạnh và điểm yếu của từng framework trong quá trình tích hợp xây dựng ứng dụng Web.

Chương 3: Dựa vào những kiến thức đã nghiên cứu từ chương 1 và chương 2. Ở chương 3, tác giả áp dụng chúng để xây dựng một bài toán demo, đó là bài toán tuyển dụng. Đây là một bài toán mang nhiều ý nghĩa thực tế và hoàn toàn có thể triển khai thành ứng dụng trong xã hội. Tuy nhiên, do thời gian hạn chế và do kinh nghiệm của người thiết kế còn thiếu nhiều nên bài toán mới chỉ dừng lại với một số module nhất định. Tác giả cũng hi vọng ứng dụng có thể được xây dựng hoàn chỉnh và triển khai được trong thời gian sắp tới.

Phần kết luận và đánh giá : Trong phần này, tác giả đưa ra một số kết quả đã thực hiện được trong quá trình thực hiện đồ án tốt nghiệp. Đồng thời đưa ra một số đánh giá về chương trình cũng như một số giải pháp và hướng phát triển của các công nghệ Struts, Hibernate và Spring trong tương lai.

Page 3: 101005641-Do-an

ABSTRACT OF THESIS

The content of this thesis includes the following parts :

Research on the trend of Web application development nowadays, web 2.0 generation as well as AJAX technique.

Studying and doing research Struts, Hibernate and Spring technology. They are the best open source code technology in field of Web application programing based on Java language and using MVC model.

Using Struts, Hibernate, Spring and Ajax technology to build a online application programe.

As the content was stated in the above paragraph, graduation thesis divide into 3 chapters. The content of each chapter was disposed in the following detail :

Chapter 1: General introduction about trend of web application development in some recent years. This chapter focus on studying web 2.0 technology, Ajax programing technique, J2EE architecture in Java as well as some the best open source code Frameworks in web application based on Java language.

Chapter 2: This chapter goes into the details of Struts, Hibernate and Spring technology by inheriting advantages of typical Web programing model: MVC model. At the same time, this part analyses and evaluates strengths and weaknesses of each framework in Web application, construction and integration process.

Chapter 3: Base on recherches from two chapters above, the author, in this chapter, applies theses knowledges to design a demo. This is a recruitment demo (program) which is significant in pratice and capable of applying in the society. However, because of lack of time and experiences, the program limits at some modules. The author hopes that this program will be fullfilled and applied in the near future.

Conclusion and assess: In this part, the author gives some results achieved in completing graduation thesis. Also, the author evalutates and gives some solutions and orientation to develop Struts, Hibernate and Spring technology in the future.

Page 4: 101005641-Do-an

LỜI NÓI ĐẦU

Ngày nay, ngành công nghệ thông tin đang phát triển như vũ bão và đi vào mọi mặt của đời sống, kinh tế, xã hội của con người. Đóng góp vào sự phát triển đó, vai trò của Web ngày càng trở nên quan trọng và là một công cụ đắc lực dẫn tới mọi thành công trong nhiều lĩnh vực trọng điểm. Với sự bùng nổ của truyền thông như hiện nay thì Web là phương thức lan truyền thông tin nhanh chóng, hiệu quả và kinh tế nhất. Rất nhiều tập đoàn sản xuất phần mềm lớn như IBM, Microsoft, Sun MicroSystem … đã tham gia vào lĩnh vực xây dựng và phát triển các ứng dụng Web. Tuy nhiên, các ứng dụng Web phát triển nhanh và mạnh mẽ như hiện nay không thể không kể đến một cộng đồng, đó là cộng đồng mã nguồn mở. Sự đóng góp của họ là vô cùng lớn lao với mục đích cao cả là phát triển công nghệ và phục vụ cộng đồng. Rất nhiều dự án lớn đã ra đời từ cộng đồng mã nguồn mở, có thể kể đến một số framework nổi tiếng như : Struts, Hibernate, Spring, JSF …

Ở Việt Nam, phát triển các ứng dụng Web là hướng đi đầy tiềm năng và hứa hẹn cho tất cả những ai yêu thích công nghệ thông tin nói chung và những kỹ sư phần mềm nói riêng.

Với tư cách là một kỹ sư phần mềm tương lai cùng với niềm đam mê công nghệ Web, đặc biệt là các công nghệ mã nguồn mở, em đã chọn cho mình đề tài “Công nghệ Struts, Hibernate và Spring trong xây dựng ứng dụng Web Tuyển dụng”. Trong thời gian thực hiện đồ án, nghiên cứu, tìm hiểu công nghệ em đã đạt được một số kết quả nhất định. Đó là cơ sơ quan trọng giúp em nắm bắt công nghệ và có thể làm việc tốt sau này.

Để có thể hoàn thành đồ án, đó là nhờ công lao to lớn của các thầy cô giáo trong trường Đại học Bách Khoa Hà Nội nói chung và các thầy cô trong khoa Công nghệ Thông tin, bộ môn công nghệ phần mềm nói riêng. Em xin gửi tới các thầy cô lời cám ơn chân thành nhất.

Em xin cám ơn cô Bùi Thị Hòa – Giảng viên chính bộ môn Công nghệ phần mềm, khoa Công nghệ Thông tin, trường Đại học Bách Khoa Hà Nội đã nhiệt tình giúp đỡ, hướng dẫn, chỉ bảo tận tình trong suốt thời gian em làm đồ án tốt nghiệp.

Em cũng xin gửi lời cám ơn đến Công ty Triax Việt Nam, các anh chị trong công ty: Anh Shishikura, chị Khánh Ngọc, anh Việt, anh Công… đã tạo mọi điều kiện, giúp đỡ và góp ý để em có thể hoàn thành tốt đồ án.

Cuối cùng, em xin gửi lời cám ơn chân thành tới gia đình, bạn bè đã động viên, chăm sóc, đóng góp ý kiến và giúp đỡ trong quá trình học tập, nghiên cứu và thực hiện tốt đồ án tốt nghiệp.

Hà Nội, tháng 5 năm 2008

Sinh viên: Nguyễn Tuấn Minh

Page 5: 101005641-Do-an

MỤC LỤC

CHƯƠNG I : TỔNG QUAN VỀ CÔNG NGHỆ WEB JAVA TRONG NHỮNG NĂM GẦN ĐÂY ................................................... 12

I.1. Công nghệ Web 2.0 ...................................................................... 12 I.2. Công nghệ AJAX ........................................................................ 14

I.3. Kiến trúc J2EE trong xây dựng ứng dụng Web .......................... 16 I.3.1. Kiến trúc J2EE ................................................................................... 16

I.3.1.1. Java Servlet .................................................................................. 19

I.3.1.2. JSP (Java Server Page) ............................................................... 19

CHƯƠNG II : STRUTS , HIBERNATE, SPRING TRONG LẬP TRÌNH ỨNG DỤNG WEB .................................................................. 22

II.1. Một số khái niệm trong lập trình ứng dụng Web ....................... 22 II.1.1. Framework là gì ? ............................................................................... 22

II.1.2. Hai mô hình kiến trúc trong ứng dụng Web ...................................... 22

II.1.2.1. Mô hình 1 .................................................................................... 22

II.1.2.1.1. Đặc điểm .............................................................................. 22

II.1.2.1.2. Ưu điểm ............................................................................... 23

II.1.2.1.3. Nhược điểm .......................................................................... 23

II.1.2.2 Mô hình 2 ..................................................................................... 23

II.1.2.2.1. Đặc điểm .............................................................................. 23

II.1.2.2.2. Ưu điểm ............................................................................. 24

II.1.3. Mô hình Model – View – Controller (MVC) .................................... 24

II.1.3.1. Đặc điểm ..................................................................................... 24

II.1.3.2. Model ......................................................................................... 25

II.1.3.3. View ............................................................................................. 25

II.1.3.4. Controller .................................................................................... 25

II.1.3.5. Cơ chế tương tác giữa 3 thành phần trong ứng dụng ............... 25

II.1.3.6. Ưu điểm của mô hình MVC ........................................................ 26

II.2. Struts framework ........................................................................ 26 II.2.1. Lịch sử hình thành .............................................................................. 26

II.2.2. Tổng quan về kiến trúc hệ thống ....................................................... 27

II.2.3. Các thành phần trong Struts ............................................................... 28

II.2.3.1. Actions ........................................................................................ 28

II.2.3.2. Interceptors ................................................................................. 30

II.2.3.3. Value Stack / OGNL .................................................................... 31

II.2.3.4. Result Types ................................................................................ 32

II.2.3.5. Results / View technologies ........................................................ 32

II.2.4. Thư viện thẻ trong Struts ................................................................... 33

II.2.4.1. Thư viện thẻ trong version 2.xx .................................................. 33

II.2.5. Cấu hình trong Struts ......................................................................... 34

II.2.5.1. Cấu hình trong version 2.xx ....................................................... 34

II.2.6. Ưu nhược điểm của Struts trong xây dựng ứng dụng Web .............. 35

Page 6: 101005641-Do-an

II.3. Hibernate framework ................................................................. 36 II.3.1. Lịch sử hình thành .............................................................................. 36

II.3.2. Một số khái niệm ................................................................................ 37

II.3.2.1. Các khái niệm liên quan đến object / relational persistence ..... 37

II.3.2.2. Persistence layer ......................................................................... 38

II.3.2.3. ORM (Object/Relational Mapping) ............................................ 39

II.3.3. Kiến trúc hệ thống .............................................................................. 40

II.3.4. Cấu hình trong Hibernate ................................................................... 41

II.3.5. Ưu nhược điểm của Hibernate trong lập trình ứng dụng Web ......... 43

II.4. Spring framework ....................................................................... 45 II.4.1. Lịch sử hình thành .............................................................................. 45

II.4.2. Các thành phần trong Spring .............................................................. 46

II.4.4. Cấu hình Spring .................................................................................. 48

II.4.5. Ưu điểm của Spring ........................................................................... 49

CHƯƠNG III : XÂY DỰNG ỨNG DỤNG TUYỂN DỤNG ............. 52

III.1. Giới thiệu bài toán tuyển dụng ................................................. 52 III.1.1. Mục đích ........................................................................................... 52

III.1.2. Mục tiêu của hệ thống ....................................................................... 52

III.2. Phân tích bài toán tuyển dụng .................................................. 53 III.2.1. Những yêu cầu về chức năng ........................................................... 53

III.2.1.1. Đối tượng người dùng và các chức năng ................................. 53

III.2.1.2. Biểu đồ các Use Case ................................................................ 54

III.2.1.2.1. Actor: Admin (Người quản trị) .......................................... 54

III.2.1.2.2. Actor: Company (Nhà tuyển dụng) .................................... 59

III.2.1.2.3. Actor: Advertiser (Nhà quảng cáo) .................................... 61

III.2.1.2.4. Actor: Candidate (Ứng viên) .............................................. 62

III.2.2. Lựa chọn giải pháp công nghệ ......................................................... 65

III.2.2.1. Bảng chi tiết các chức năng ..................................................... 65

III.3.1. Thiết kế dữ liệu ................................................................................. 73

III.3.1.1. Mô hình quan hệ thực thể ........................................................ 73

III.3.1.2. Thiết kế cơ sở dữ liệu ................................................................ 73

III.3.1.2.1. Bảng Account ..................................................................... 73

III.3.1.2.2. Bảng Role ........................................................................... 74

III.3.1.2.3. Bảng AccountRole .............................................................. 74

III.3.1.2.4. Bảng Function ..................................................................... 74

III.3.1.2.5. Bảng RoleFunction ............................................................. 75

III.3.1.2.6. Bảng Advertiser .................................................................. 75

III.3.1.2.7. Bảng Adver_Content .......................................................... 75

III.3.1.2.8. Bảng Job_Type ................................................................... 76

III.3.1.2.9. Bảng Company ................................................................... 76

III.3.1.2.10. Bảng Province .................................................................. 77

III.3.1.2.11. Bảng Category .................................................................. 77

Page 7: 101005641-Do-an

III.3.1.2.12. Bảng News ........................................................................ 77

III.3.1.2.13. Bảng Rec_Notice .............................................................. 78

III.3.1.2.14. Bảng Occupation .............................................................. 79

III.3.1.2.15. Bảng Candidate ................................................................ 79

III.3.1.2.16. Bảng Degree ..................................................................... 80

III.3.1.2.17. Bảng Candidate_Degree ................................................... 80

III.3.1.2.18. Bảng Friend ...................................................................... 80

III.3.1.2.19. Bảng Blog ......................................................................... 81

III.3.1.2.20. Bảng Blog_Comment ....................................................... 81

III.3.1.2.21. Bảng Work_Type ............................................................. 81

III.3.2. Thiết kế module ................................................................................ 82

III.3.2.1. Thiết lập môi trường lập trình .................................................. 83

III.3.2.2. Mô hình thiết kế module ............................................................ 84

III.3.2.3. Thiết kế tầng Model ................................................................... 84

III.3.2.4. Thiết kế tầng View ..................................................................... 87

III.3.2.5. Thiết kế tầng Controller ............................................................ 87

III.3.2.6. Các file cấu hình hệ thống ........................................................ 88

III.3.3. Thiết kế giao diện Web ..................................................................... 89

III.3.3.1. Thiết kế giao diện Admin .......................................................... 89

III.3.3.2. Thiết kế giao diện người dùng .................................................. 90

KẾT LUẬN VÀ ĐÁNH GIÁ ............................................................... 92

TÀI LIỆU THAM KHẢO .................................................................... 93

Page 8: 101005641-Do-an

MỤC LỤC HÌNH VẼ

Hình I.1 Mô hình “cổ điển” của một ứng dụng Web ...............................15

Hình I.2 Mô hình sử dụng AJAX của một ứng dụng Web........................16

Hình I.3 Ứng dụng đa tầng trong J2EE.....................................................18

Hình I.4 Mô hình ứng dụng Browser/Server.............................................19

Hình 1.5 Cơ chế hoạt động của JSP..........................................................20

Hình II.1 Mô hình 1 về kiến trúc ứng dụng Web......................................23

Hình II.2 Mô hình 2 về kiến trúc ứng dụng Web......................................24

Hình II.3 Mô hình MVC trong kiến trúc ứng dụng Web...........................25

Hình II.4 Cơ chế tương tác giữa các thành phần trong mô hình MVC......26

Hình II.5 Vòng đời request trong ứng dụng Struts2..................................28

Hình II.6 Persistence layer trong kiến trúc phân tầng...............................39

Hình II.7 Kiến trúc hệ thống trong Hibernate............................................40

Hình II.8 Các module trong Spring...........................................................47

Hình III.1. Các nhóm sử dụng hệ thống....................................................53

Hình III.2 Sơ đồ phân rã chức năng..........................................................54

Hình III.3 Use Case Admin quản lý Advertiser.........................................55

Hình III.4 Use Case Admin quản lý Advertisment....................................56

Hình III.5 Use Case Admin quản lý Candidate.........................................57

Hình III.6 Use Case Admin quản lý Company..........................................58

Hình III.7 Use Case Admin quản lý News................................................59

Hình III.8 Use Case Company quản lý Profile..........................................60

Hình III.9 Use Case Company quản lý tin tức...........................................60

Hình III.10 Use Case Company quản lý thông tin tuyển dụng..................61

Hình III.11 Use Case Advertiser quản lý quảng cáo.................................62

Hình III.12 Use Case Candidate quản lý Profile.......................................62

Hình III.13 Use Case Candidate quản lý Friends......................................63

Hình III.14 Use Case Candidate quản lý Blog...........................................64

Hình III.15 Sơ đồ diễn tiến chức năng LogIn............................................67

Hình III.16 Sơ đồ diễn tiến chức năng LogOut.........................................67

Hình III.17 Sơ đồ diễn tiến chức năng Add News....................................68

Hình III.18 Sơ đồ diễn tiến chức năng Edit News.....................................68

Hình III.19 Sơ đồ diễn tiến chức năng Delete News.................................69

Hình III.20 Sơ đồ diễn tiến chức năng Edit Profile...................................69

Hình III.21 Sơ đồ diễn tiến chức Add User...............................................70

Page 9: 101005641-Do-an

Hình III.22 Sơ đồ diễn tiến chức năng Edit User......................................70

Hình III.23 Sơ đồ diễn tiến chức năng Delete User...................................71

Hình III.24 Sơ đồ diễn tiến chức năng Company Search Candidate.........71

Hình III.25 Sơ đồ diễn tiến chức năng Company bookmarks Candidate. .72

Hình III.26 Sơ đồ diễn tiến chức năng Blog Individual............................72

Hình III.28 Các gói module chính.............................................................82

Hình III.29 Module admin.........................................................................83

Hình III.30 Module User...........................................................................83

Hình III.31 Mô hình thiết kế Module theo Struts......................................84

Hình III.32 Mô hình thiết kế tầng trong Controller...................................88

Hình III.33 Màn hình Login......................................................................89

Hình III.34 Màn hình giao diện chính.......................................................89

Hình III.35 Màn hình hiển thị danh sách...................................................90

Hình III.36 Màn hình thêm mới, cập nhật ................................................90

Hình III.37 Màn hình giao diện trang chủ.................................................91

Page 10: 101005641-Do-an

DANH MỤC BẢNG

Bảng 1: Danh sách các chức năng.............................................................66

Bảng 2: Bảng Account...............................................................................74

Bảng 3: Bảng Role.....................................................................................74

Bảng 4: Bảng AccountRole.......................................................................74

Bảng 5: Bảng Function..............................................................................75

Bảng 6: Bảng RoleFunction......................................................................75

Bảng 7: Bảng Advertiser...........................................................................75

Bảng 8: Bảng Adver_Content....................................................................76

Bảng 9: Bảng Job_Type............................................................................76

Bảng 10: Bảng Company...........................................................................77

Bảng 11: Bảng Province............................................................................77

Bảng 12: Bảng Category............................................................................77

Bảng 13: Bảng News.................................................................................78

Bảng 14: Bảng Rec_Notice.......................................................................79

Bảng 15: Bảng Occupation........................................................................79

Bảng 16: Bảng Candidate..........................................................................80

Bảng 17: Bảng Degree...............................................................................80

Bảng 18: Bảng Candidate_Degree.............................................................80

Bảng 19: Bảng Friend................................................................................81

Bảng 20: Bảng Blog..................................................................................81

Bảng 21: Bảng Blog_Comment.................................................................81

Bảng 22: Bảng Work_Type.......................................................................82

Page 11: 101005641-Do-an

DANH MỤC CÁC THUẬT NGỮ VÀ CÁC TỪ VIẾT TẮT TRONG BÁO CÁO TỐT NGHIỆP

STT Từ viết tắt Viết đấy đủ Ý nghĩa

1 JSF JavaServer FacesMột framework trong lập trình ứng dụng Web dựa trên công nghệ Java

2 MVC Model-View-Controller Một mô hình lập trình ứng dụng Web

3 JSP Java Server PagesMột ngôn ngữ lập trình Web phía máy chủ trên nền công nghệ Java

4 DOM Document Object ModelMô hình đối tượng tài liệu (Khái niệm dùng trong Ajax)

5 PC Personal Computer Máy tính cá nhân

6 IT Information Technology Công nghệ thông tin

7 JVM Java Virtual Machine Máy ảo Java

8 APIApplication Program Interface

Hệ giao tiếp lập trình ứng dụng

9 HTTPHypertext Transfer Protocol

Giao thức truyền siêu văn bản

10 CGICommon Gateway Interface

Giao thức cổng dùng chung

11 PL Presentation Layer Tầng trình diễn trong kiến trúc 3 tầng của Web.

12 W3CWorld Wide Web Conrotium

Là một tổ chức công nghiệp quốc tế thành lập năm 1994 nhằm phát triển các giao thức chung để phát triển WWW.

13 XMLExtensible Markup Language

Ngôn ngữ đánh dấu mở rộng do W3C tạo ra

14 Framework FrameworkTập hợp các lớp, giao diện để hỗ trợ giải quyết các vấn đề cụ thể trong quá trình xây dựng phần mềm

15 DB Database Cơ sở dữ liệu

16 AJAXAsynchronous JavaScript and XML

Là tập hợp của nhiều công nghệ với thế mạnh của riêng mình để tạo thành một sức mạnh mới

17 UI User Interface Giao diện người dùng

18 URLUniform Resource Locator

Địa chỉ của một trang Web

19 POJO Plain Old Java Object Đối tượng thuần Java

20 ERDEntity Relationship Diagram

Mô hình quan hệ thực thể

Page 12: 101005641-Do-an

CHƯƠNG I : TỔNG QUAN VỀ CÔNG NGHỆ WEB JAVA TRONG NHỮNG NĂM GẦN ĐÂY

I.1. Công nghệ Web 2.0

Sự phát triển mạnh mẽ của của ngành công nghệ thông tin trên thế giới với nhiều cuộc cách mạng trên nghiều lĩnh vực, thế hệ Web mới có những thay đổi quan trọng không chỉ ở nền tảng công nghệ mà còn ở cách thức sử dụng, hình thành nên môi trường cộng đồng mà ở đó mọi người cùng tham gia đóng góp cho xã hội “ảo” chứ không còn dừng lại ở quá trình “duyệt và xem” như trước kia.

Ngày nay, chúng ta đã rất quen thuộc với thuật ngữ “Web 2.0”. Vậy, Web 2.0 là gì ? Làm sao phân biệt được đâu là Web 1.0, đâu là Web 2.0 ? Web 2.0 đang trở nên thịnh hành và có phần được lăng xê quá mức. Thực chất, Web 2.0 có nghĩa là sử dụng web đúng với bản chất và khả năng của nó.

Mục tiêu của những người tiên phong xây dựng Internet là nhằm kết nối các nhà nghiên cứu và các máy tính của họ với nhau để có thể chia sẻ thông tin hiệu quả. Khi bổ dung World Wide Web (năm 1990), Tim Berners-Lee cũng nhằm mục tiêu tạo phương tiện cho phép người dùng tự do đưa thông tin lên Internet và dễ dàng chia sẻ với mọi người (trình duyệt Web đầu tiên do Berners-Lee viết bao gồm cả công cụ soạn thảo trang Web). Tuy nhiên, sau đó web đã phát triển theo hướng hơi khác mục tiêu ban đầu.

Tuy có một số ngoại lệ nhưng thế giới Web 1.0 (thế hệ Web trước 2.0) chủ yếu gồm các website “đóng” của các hãng thông tấn hay các công ty nhằm mục đích tiếp cận độc giả hay khách hàng hiệu quả hơn. Nó là phương tiện phát tin hơn là phương tiện chia sẻ thông tin. Chỉ đến gần đây, với sự xuất hiện của nhiều kỹ thuật mới như blog, wiki … web mới trở nên có tính cộng đồng (và cộng tác) hơn và trở nên gần hơn so với sự kỳ vọng và khả năng thực sự của nó.

Khái niệm Web 2.0 đầu tiên được Dale Dougherty, phó chủ tịch của Oreilly Media, đưa ra tại hội thảo Web 2.0 lần thứ nhất do Oreilly Media và MediaLive International tổ chức vào tháng 10/2004. Dougherty không đưa ra định nghĩa mà chỉ dùng các ví dụ so sánh phân biệt Web 1.0 và Web 2.0: “DoubleClick là Web 1.0; Google AdSense là Web 2.0. Ofoto là Web 1.0; Flickr là Web 2.0. Britannica online là Web 1.0; Wikipedia là Web 2.0 v.v…”.

Các đặc tính của Web 2.0 :

1. Web có vai trò nền tảng, có thể chạy mọi ứng dụng

2. Phục vụ mọi người

3. Tập hợp trí tuệ cộng đồng

4. Dữ liệu có vai trò then chốt

5. Phần mềm được cung cấp ở dạng dịch vụ web được cập nhật không ngừng và luôn là bản Beta

6. Phát triển ứng dụng dễ dàng và nhanh chóng, gọn nhẹ và thích hợp

Page 13: 101005641-Do-an

7. Phần mềm có thể chạy trên nhiều thiết bị

8. Người dùng tự chủ

Ban đầu, Web 2.0 được chú trọng tới yếu tố công nghệ, nhấn mạnh tới vai trò nền tảng ứng dụng. Nhưng đến hội thảo Web 2.0 lần 2 được tổ chức vào tháng 10/2005, Web 2.0 được nhấn mạnh đến tính chất sâu xa hơn – đó là yếu tố cộng đồng.

Công nghệ:

Trên thực tế, ứng dụng trên Web là thành phần rất quan trọng của Web 2.0. Hàng loạt công nghệ mới được phát triển nhằm làm cho ứng dụng trên web “mạnh” hơn, nhanh hơn và dễ sử dụng hơn, được xem là nền tảng của Web 2.0.

Kiến trúc công nghệ của Web 2.0 hiện vẫn đang được phát triển nhưng cơ bản bao gồm : phần mềm máy chủ, cơ chế cung cấp nội dung, giao thức truyền thông, trình duyệt và ứng dụng.

Cung cấp nội dung:

Bước phát triển đầu tiên và quan trọng nhất hướng đến Web 2.0 đó là cơ chế cung cấp nội dung, sử dụng các giao thức chuẩn hóa để cho phép người dùng sử dụng thông tin theo cách của mình (nghĩa là có khả năng tùy biến thông tin). Có nhiều giao thức được phát triển để cung cấp nội dung như RSS, RDF và Atom, tất cả đều dựa trên XML. Ngoài ra còn có các giao thức đặc biệt như FOAF và XFN dùng để mở rộng tính năng của Website hay cho phép người dùng tương tác.

Dịch vụ Web:

Các giao thức truyền thông 2 chiều là một trong những thành phần then chốt của kiến trúc Web 2.0. Có hai loại giao thức chính là REST và SOAP. REST (Representation State Transfer) là dạng yêu cầu dịch vụ web mà máy khách truyền đi trạng thái của tất cả giao dịch; còn SOAP (Simple Object Access Protocol) thì phụ thuộc vào máy chủ trong việc duy trì thông tin trạng thái. Với cả hai loại, dịch vụ Web đều được gọi qua API. Ngôn ngữ chung của dịch vụ Web là XML, nhưng có thể có ngoại lệ.

Một ví dụ điển hình của giao thức truyền thông thế hệ mới là Object Properties Broadcasting Protocol do Chris Dockree phát triển. Giao thức này cho phép các đối tượng ảo (tồn tại trên Web) tự biết chúng “là gì và có thể làm gì”, nhờ vậy có thể tự liên lạc với nhau khi cần.

Phần mềm máy chủ:

Web 2.0 được xây dựng trên kiến trúc web thế hệ trước nhưng chú trọng hơn đến phần mềm làm việc ở “hậu trường”. Cơ chế cung cấp nội dung chỉ khác phương thức cấp phát nội dung động (của Web 1.0 về danh nghĩa), tuy nhiên dịch vụ Web yêu cầu tiến trình làm việc và dữ liệu chặt chẽ hơn.

Các giải pháp phát triển theo hướng Web 2.0 hiện nay có thể phân ra làm 2 loại : hoặc xây dựng hầu hết các tính năng trên một nền tảng máy chủ duy nhất; hoặc xây dựng ứng dụng “gắn thêm” cho máy chủ web, có sử dụng giao tiếp API.

Cộng đồng:

Page 14: 101005641-Do-an

Công nghệ chỉ là bề nổi của Web 2.0, chính cộng đồng người dùng mới là yếu tố nền tảng tạo nên thế hệ web mới. Việc chuyển từ “duyệt và xem” sang “tham gia” là cuộc cách mạng thực sự, dĩ nhiên nhờ có sự phát triển công nghệ giúp hiện thực khả năng này nhưng ở đây muốn nhấn mạnh đến hành vi của người dùng đối với web.

Về cơ bản, Web 2.0 trao quyền nhiều hơn cho người dùng và tạo nên môi trường liên kết chặt chẽ các cá nhân với nhau. Giờ đây, có nhiều ví dụ cho thấy cộng đồng người dùng có thể đóng góp thông tin giá trị khi họ có phương tiện thích hợp. Wikipedia có lẽ là ví dụ nổi tiếng nhất. Tuy có nhiều học giả không đánh giá cao Wikipedia, nhưng họ lại quên một điều quan trọng : nó đủ tốt, miễn phí và nhiều người có thể đọc. Ngoài ra còn có những ví dụ khác như các site Reddit và Digg để cho người dùng quyết định thông tin gì là quan trọng, hay del.icio.us cho phép mọi người chia sẻ những địa chỉ Web hay.

Web 2.0 cho phép mọi người có thể đưa lên mạng bất cứ thông tin gì. Với số lượng người tham gia rất lớn, đến mức độ nào đó, qua quá trình sàng lọc, thông tin sẽ trở nên vô cùng giá trị. Ở đây, có sự tương đồng với thuyết chọn lọc tự nhiên.

Thật sự, Web 2.0 không phải là cái gì đó hoàn toàn mới mà là nó là sự phát triển từ web hiện tại. Nó vẫn là Web như chúng ta dùng lâu nay, chỉ có điều giờ đây chúng ta làm việc với Web theo cách khác. Các website không còn là những “ốc đảo” mà trở thành những nguồn thông tin và chức năng, hình thành nên môi trường điện toán phục vụ các ứng dụng web và người dùng.

I.2. Công nghệ AJAX

Thế hệ Web 2.0 đã bắt đầu và đã trải qua cả một chặng đường dài phía trước để có thể thay đổi những gì vốn đã trở nên quen thuộc với mọi người hiện nay. Nhưng đóng vai trò quan trọng góp phần làm nên thế hệ Web trong giai đoạn thứ hai là tổ hợp công nghệ AJAX.

AJAX là gì ?

Thuật ngữ AJAX xuất hiện lần đầu vào tháng 2 năm 2005, khi Jesse James Garrett của công ty AdapativePath định nghĩa. AJAX là viết tắt của cụm từ “Asynchonous JavaScript and XML”. Đó là bộ 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è tải đi tải lại toàn bộ trang web.Theo định nghĩa của Garrett thì : AJAX không phải là một công nghệ. Nó là tập hợp của nhiều công nghệ với thế mạnh của riêng mình để tạo thành một sức mạnh mới. 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 mô hình đối tượng tài liệu – DOM (Document Object Model).

Trao đổi và xử lý dữ liệu bằng XML và XSLT.

Truy cập dữ liệu theo kiểu bất đồng bộ (asynchronous) bằng XMLHttpRequest.

Page 15: 101005641-Do-an

Và tất cả các kỹ thuật trên được liên kết lại với nhau bằng Javascript.

Hầu hết các câu chuyện về nguồn gốc của AJAX được bắt đầu từ khi Microsoft phát triển công nghệ Remote Scripting vào năm 1998. Tuy nhiên, phương pháp tải không đồng bộ nội dung trên một trang Web đã xuất hiện trên thành tố IFRAME của Internet Explorer 3 (1996) và thành tố LAYER của Netscape 4.0 (1997). Khi giới thiệu Internet Explorer 4.0, Microsoft đã sử dụng mô hình đối tượng tài liệu. Đến năm 2000, Netscape hoàn toàn bị đánh mất thị trường trình duyệt vào tay hãng phần mềm của Bill Gates và thành tố LAYER cũng không được các chuyên gia phát triển web chú ý tới.

Phải tới vài năm sau, AJAX mới lại lôi kéo được sự quan tâm của giới công nghệ và trở thành công cụ cải tiến giao diện người dùng cho ứng dụng web. Từ đó, AJAX trở thành trung tâm trong mọi câu chuyện liên quan đến thế hệ Web 2.0.

Ở các ứng dụng Web truyền thống, khi người dùng cần một thay đổi dữ liệu trên trang Web, yêu cầu thay đổi được gửi về server dưới dạng HTTP request (hay còn gọi là postback), server sẽ xử lý yêu cầu này và gửi trả response chứa các thông tin dưới dạng HTML và CSS, trang HTML này sẽ thay thế trang cũ. Quy trình này được mô tả là nhấp-chờ và tải lại (click-wait-and-refresh).

Dưới đây là : Mô hình tương tác trong một ứng dụng Web truyền thống:

Hình I.1 Mô hình “cổ điển” của một ứng dụng Web

AJAX cho phép tạo ra một Ajax Engine nằm giữa giao tiếp này. Khi đó, các yêu cầu gửi request và nhận response do Ajax Engine thực hiện. Thay vì trả dữ liệu dưới dạng HTML và CSS trực tiếp cho trình duyệt Web, Web Server có thể gửi trả dữ liệu dạng XML và Ajax Engine sẽ tiếp nhận, phân tách và chuyển nó thành XHTML + CSS cho trình duyệt Web hiển thị.

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 người sử dụng cảm thấy kết quả xử lý được hiển thị tức thì mà không cần nạp lại trang. Mặt khác, sự kết hợp của các công nghệ web như CSS và XHTML làm cho việc trình bày trang web tốt hơn nhiều và giảm đáng kể dung lượng trang phải nạp. Đây là những lợi ích hết sức thiết thực mà AJAX đem lại.

Hình I.2 dưới đây mô tả mô hình sử dụng AJAX :

Page 16: 101005641-Do-an

Hình I.2 Mô hình sử dụng AJAX của một ứng dụng Web

Những nhược điểm của AJAX

AJAX có thể góp phần tạo nên một thế hệ mới cho ứng dụng Web. Tuy nhiên, nó cũng là một công nghệ “nguy hiểm” khi gây ra không ít rắc rối về giao diện người dùng và sau đây là một vài minh chứng :

Phím “Back” (trở lại trang trước) được đánh giá cao trong giao diện trang web chuẩn. Đáng tiếc chức năng này không hoạt động ăn khớp với Javascript và mọi người không thể tìm lại nội dung trước đó khi bấm phím Back. Bởi vậy, chỉ một vài sơ xuất nhỏ là dữ liệu trên trang web đã bị thay đổi và khó có thể khôi phục lại được. Đây là một trong những nguyên nhân chính khiến nghiều người không ủng hộ ứng dụng Javascript.

Bên cạnh đó, mọi người không thể lưu lại địa chỉ web vào thư mục Favourite (Bookmark) để xem lại về sau. Do áp dụng lớp trung gian để giao dịch, các ứng dụng AJAX không có một địa chỉ cố định cho từng nội dung. Khiếm khuyết này làm cho AJAX dễ “mất điểm” trong mắt người dùng.

Nhưng với sự cải thiện không ngừng trong thời gian sắp tới, AJAX sẽ trở thành phổ dụng cho tất cả các ứng dụng Web.

I.3. Kiến trúc J2EE trong xây dựng ứng dụng Web

I.3.1. Kiến trúc J2EE

J2EE là một khung ứng dụng Web hoạt động hiệu quả mà các công ty trên thế giới như IBM, Oracle, Sun áp dụng rất hiệu quả trong các dự án của họ. Điểm đặc biệt hơn nữa là khung ứng dụng này sử dụng các công nghệ mới nhất luông mang tính cạnh tranh cao ví dụ như Struts, Hibernate, Spring, JSF, EJB …

Tuy nhiên, J2EE không phải là một sản phẩm cụ thể mà chỉ là các đặc tả đưa ra bởi hãng Sun. Với kiến trúc J2EE, bạn phải lựa chọn, kết nối các thành phần khác nhau để hình thành nên mô hình phát triển ứng dụng. Bản thân Sun không đưa ra mô

Page 17: 101005641-Do-an

hình phát triển ở dạng đóng gói nhưng có khá nhiều sản phẩm từ các hàng thứ ba như : IBM, WebSphere, và BEA WebLogic, là các mô hình xây dựng hỗ trợ lập trình.

J2EE chỉ hỗ trợ ngôn ngữ lập trình Java và trong tương lai có lẽ cũng không có ngôn ngữ lập trình nào được hỗ trợ thêm bởi kiến trúc này. Nhưng khung ứng dụng J2EE và ngôn ngữ Java có tính khả chuyển cao. Một chương trình viết bởi Java được thực thi trên máy ảo Java (Java Virtual Machine) thay vì trực tiếp trên hệ điều hành cụ thể. Do đó, mã chương trình có thể chuyển từ một hệ điều hành này sang một hệ điều hành khác (có hỗ trợ JVM) để thực thi một cách dễ dàng. Tính khả chuyển về hệ điều hành này của J2EE có được là do phần lớn các sản phẩm J2EE đều hỗ trợ cho nhiều hệ điều hành.

Hơn thế nữa, J2EE cung cấp một thiết kế mẫu (design pattern) mà đã được đúc rút từ những kinh nghiệm thực tế của các chuyên gia phần mềm trên thế giới. Và bạn hoàn toàn được thừa hưởng các mẫu thiết kế này mà không cần phải bắt đầu xây dựng chi tiết từ đầu trong khi một loạt các công ty và nhóm phần mềm đã tiêu tốn thời gian và công sức để tìm ra những phương án tối ưu cho từng vấn đề họ đã gặp phải trong quá trình phát triển các dự án. Ví dụ với tầng Web của ứng dụng J2EE kinh điển, nếu chúng ta bắt tay từ đặc tả kỹ thuật (specification) của JSP và Servlet chúng cho phép xây dựng được những trang Web động riêng biệt rất tốt nhưng lại hỗ trợ rất ít trong việc quản lý luồng dữ liệu giữa các trang với nhau, đặc biệt chúng không tách rời hai tầng hiển thị (presentation) và tầng nghiệp vụ (business). Mô hình MVC (Model - View - Controller) lại là một mô hình thiết kế mang tính tổng thể để giải quyết vấn đề trên, nó được tạo bởi Krasner và Pope năm 1988 cho Smalltalk, cho phép xây dựng nên các ứng dụng phân tầng một cách rất hiệu quả bằng cách tạo ra những phương thức quản lý từng tầng một cách riêng rẽ và quản lý luồng dữ liệu. Trong J2EE, thì MVC cũng được xây dựng dựa trên những tính năng mạnh của công nghệ JSP và Servlet.

Nền tảng J2EE sử dụng mô hình ứng dụng phân tán đa tầng cho tất cả các ứng dụng Enterprise. Ứng dụng logic có thể chia làm nhiều thành phần tùy theo chức năng, rất nhiều các thành phần tạo nên ứng dụng J2EE và được cài đặt trên nhiều máy tính khác nhau.

Hình I.4 dưới đây mô tả kiến trúc đa tầng trong ứng dụng J2EE:

Page 18: 101005641-Do-an

Hình I.3 Ứng dụng đa tầng trong J2EE

Các thành phần Client-tier chạy trên máy client.

Các thành phần Web tier chạy trên J2EE server.

Các thành phần Business tier chạy trên J2EE server.

EIS (Enterprise information system)-tier chạy trên EIS server.

Mặc dù một ứng dụng J2EE có thể bao gồm ba hoặc bốn tầng như trong hình I.4, tuy nhiên các ứng dụng đa tầng J2EE trong thực tế thường sử dụng theo kiến trúc ba tầng bởi vì chúng được phân tán trên ba vị trí khác nhau : các máy client, máy J2EE server, và database.

Các thành phần J2EE

Các ứng dụng J2EE được tạo nên từ các thành phần. Một J2EE component bản thân nó là đơn vị phần mềm thực hiện một chức năng nhất định có các lớp và các file và có thể giao tiếp được với các thành phần khác. Đặc tả J2EE định nghĩa ra các thành phần sau :

Các ứng dụng máy khách và applet là các thành phần chạy trên client.

Các thành phần Java Servlet và JavaServer Pages (JSP) là các thành phần Web chạy trên server.

Các thành phần Enterprise JavaBean (EJB) là các thành phần nghiệp vụ chạy trên server.

Các thành phần J2EE được viết bằng ngôn ngữ lập trình Java và được biên dịch giống như trong các ngôn ngữ lập trình khác. Sự khác biệt giữa các thành phần J2EE và các lớp Java “chuẩn” là các thành phần J2EE được nhúng trong ứng dụng J2EE, được xác nhận để đảm bảo tính thống nhất theo như đặc tả J2EE, và được triển khai thành sản phẩm, nơi chúng có thể chạy và được quản lý bởi J2EE server.

Page 19: 101005641-Do-an

I.3.1.1. Java Servlet

Servlet được tạo ra vào năm 1997, Servlet là các thành phần đối tượng nhúng trên trình chủ Web server thực hiện xử lý yêu cầu và sinh ra các trang Web động trả về máy khách. Java Servlet là công nghệ nền tảng cho các công nghệ khác để tạo ra các ứng dụng Web có tính tương tác cao mà giao diện người dùng được sinh ra ở phía server. Công nghệ Java Servlet bao gồm 2 phần :

API của Java dùng bao gồm các yêu cầu và các câu trả lời và các đối tượng con của nó và bộ xử lý dùng để quản lý các đối tượng này.

Một cơ chế dùng để xác định các thuộc tính của ứng dụng Web ngoài mã của ứng dụng và có thể thay đổi lúc triển khai.

Một servlet là một lớp của Java xử lý động các yêu cầu và xây dựng các trả lời. Mặc dù servlet có thể dùng để trả lời bất kỳ một yêu cầu nào nhưng chúng thường dùng để hỗ trợ cho các ứng dụng Web.

Servlet là một thành phần ứng dụng Web không phụ thuộc vào hệ nền. Về bản chất thì Servlet là một chương trình Java (chỉ cần nạp một lần vào máy ảo) thường được sử dụng để chạy nền trên các máy ảo Java. Khi có một yêu cầu từ trình duyệt (Browser), máy chủ (server) sẽ phát lệnh thực hiện Servlet tương ứng, kết quả trả về của Servlet sẽ được máy chủ xử lý và trả về cho trình duyệt dưới dạng các trang HTML.

Hình I.4 Mô hình ứng dụng Browser/Server

I.3.1.2. JSP (Java Server Page)

Công nghệ JSP kế thừa tất cả các kỹ thuật động của công nghệ Java Servlet, nhưng nó lại cung cấp một cách tiếp cận tự nhiên hơn trong việc tạo ra các thành phần Web tĩnh, JSP có thể kết hợp giữa công nghệ sinh trang HTML tĩnh với công nghệ động sinh ra các trang HTML. JSP là công nghệ lập trình Web phía máy chủ của Java, JSP cho phép truy xuất, xử lý đơn giản, giúp cho lập trình viên xử lý dễ dàng.

Đặc trưng của công nghệ JSP:

• Cho phép trộn giữa mã Java và các thẻ HTML.

• Xây dựng các đối tượng phía máy chủ.

• JSP sử dụng các truy xuất và xử lý đơn giản như : trình bày giao diện, định dạng trang HTML, triệu gọi các Javabean, servlet khác …

Page 20: 101005641-Do-an

Cơ chế hoạt động của JSP có thể mô tả như sau :

Web Client Web Server

HTTP query

Response

Internet

JSP EngineJSP script

Java Compiler

Java Virtual Machine

Database

Byte code

Java code

JDBC

HTML page containing JSP script

HTML page

Hình 1.5 Cơ chế hoạt động của JSP

Nguyên tắc:

JSP script được viết lồng vào các trang HTML.

Khi có yêu cầu client, JSP Engine sẽ dịch JSP script thành mã Java.

Java Compiler dịch Java code thành bytecode.

Bytecode chạy trên máy ảo Java.

Các thuận lợi khi sử dụng công nghệ JSP :

Đối với ASP (Active Server Pages): ASP là công nghệ tương tự như JSP nhưng được cung cấp bởi Microsoft. Các thuận lợi của công nghệ JSP bao gồm : Thứ nhất, phần động trong một trang JSP được viết bằng Java chứ không phải là một ngôn ngữ nào khác của Microsoft, cho nên nó tạo ra sức mạnh hơn và dễ dàng hơn trong sử dụng nhờ những đặc tính nổi bật của Java đã nêu ở trên. Thứ hai, nó có thể phù hợp với bất kỳ hệ điều hành nào và Web server nào.

Đối với Servlet : JSP cung cấp những điều kiện thuận lợi hơn để tạo ra các trang HTML hợp lệ. Thêm vào đó, bằng việc phân chia thành hai phần riêng biệt, ta có thể phân chia công việc trong phát triển JSP cho nhiều người khác nhau, mỗi người một lĩnh vực riêng, phần xây dựng HTML tĩnh và phần động.

Đối với Server-Side Include (SSI) : SSI là một công nghệ hỗ trợ rộng rãi bao gồm các đoạn được định nghĩa bên ngoài đưa vào trong một trang Web tĩnh. JSP là một lựa chọn tốt nhất bởi vì nó cho phép bạn sử dụng servlet thay thế cho việc sử dụng chương trình gián đoạn để tạo ra các phần động trong một trang web.

Page 21: 101005641-Do-an

Đối với Javascript : Javascript có thể tự động tạo ra HTML trên trình client. Tuy nhiên, nó chỉ hỗ trợ điều này khi mà các thông tin đó thuộc về môi trường hoạt động của client. Với ngoại lệ của cookies, HTTP và định dạng dữ liệu đệ trình không hỗ trợ cho Javascript. Khi mà Javascript thực hiện trên trình client, JavaScript không thể truy nhập tài nguyên của phía trình chủ như các cơ sở dữ liệu, các danh sách, các thông tin quan trọng…

Với những lợi thế và những đặc điểm của mình dựa trên hướng mã nguồn mở và nhất là với sự ra đời của các framework nổi tiếng như : Struts, Hibernate, Spring, JSF, AJAX dựa trên nền tảng của công nghệ Java đã khuấy động lên một cuộc cách mạng trong lĩnh vực lập trình Web ứng dụng : “Chỉ trong một tương lai không xa, tất cả các ứng dụng phần mềm đều là ứng dụng Web”.

Page 22: 101005641-Do-an

CHƯƠNG II : STRUTS , HIBERNATE, SPRING TRONG LẬP TRÌNH ỨNG DỤNG WEB

II.1. Một số khái niệm trong lập trình ứng dụng Web

II.1.1. Framework là gì ?

Ngày nay, trong quá trình xây dựng một ứng dụng trên nền Web, có rất nhiều khung làm việc (framework) đã được xây dựng sẵn nhằm phục vụ cho mục đích chung nhất cũng như giúp cho những người lập trình viên phát triển ứng dụng một cách nhanh chóng và hiệu quả. Chúng ta đã nhắc nhiều đến thuật ngữ framework ở các phần trên và cũng đã có một số framework về Java được nhắc đến. Vậy, bản chất framework là gì, và nó có những đặc tính gì ?

Theo cộng đồng Wikepedia, framework là một khái niệm trong phát triển phần mềm dùng để chỉ những “cấu trúc hỗ trợ được định nghĩa”mà trong đó những dự án phần mềm khác có thể được sắp xếp vào đó và phát triển. Thông thường, một framework bao gồm những chương trình hỗ trợ, các thư viện lập trình và một ngôn ngữ scripting nằm giữa các phần mềm khác để giúp phát triển và gắn những thành phần khác nhau trong dự án phần mềm lại với nhau.

Một khung làm việc có 3 đặc tính sau :

1. Một khung công việc xây dựng sẵn các lớp (class) hoặc các thành phần (component), mỗi loại đó sẽ cung cấp một mức trừu tượng (abstraction) cho một vài khái niệm riêng biệt.

2. Một khung công việc sẽ định nghĩa ra tập hợp các cách thức để các mức trừu tượng đó cùng nhau giải quyết một vấn đề.

3. Các thành phần trong một khung công việc phải có tính sử dụng lại được.

II.1.2. Hai mô hình kiến trúc trong ứng dụng Web

II.1.2.1. Mô hình 1

II.1.2.1.1. Đặc điểm

Kiến trúc mô hình 1 là kiến trúc đơn giản nhất trong việc phát triển các ứng dụng Web. Trong mô hình 1, trình duyệt trực tiếp truy xuất đến các trang JSP. Hay nói cách khác, người sử dụng gửi các yêu cầu và nhận phản hồi trực tiếp qua các trang JSP. Điểm mạnh của mô hình kiến trúc này là mỗi trang JSP đều xử lý đầu vào của chính mình. Các ứng dụng sử dụng mô hình kiến trúc này thường có một dãy các trang JSP mà người dùng xử lý thông tin từ trang đầu tiên đến trang kế tiếp. Nếu cần, một trang servlet hoặc một trang HTML có thể thay thế cho trang JSP trong dãy.

Page 23: 101005641-Do-an

Hình II.1 Mô hình 1 về kiến trúc ứng dụng Web

II.1.2.1.2. Ưu điểm

Đây là mô hình đơn giản nhất, thoải mái để phát triển ứng dụng. Người lập trình có thể lần lượt xây dựng các trang web dựa theo chức năng đã chỉ rõ.

Kiến trúc này thích hợp với những ứng dụng web có quy mô nhỏ, ít chức năng và việc định hướng trang là đơn giản.

II.1.2.1.3. Nhược điểm

Khó tách rời công việc viết mã cho ứng dụng (thường thuộc về vai trò của người phát triển ứng dụng Web) và nhóm xây dựng ứng dụng (thường thuộc về vai trò của người thiết kế). Khi cần thay đổi giao diện người sử dụng (công việc của người thiết kế) thì chính người lập trình gần như lại phải thực hiện toàn bộ (thay đổi mã nguồn chương trình và mã HTML).

Do các trang JSP đều xử lý đầu vào của chính mình, ứng dụng là một dãy các trang JSP hoạt động kế tiếp tuần tự nhau, kết quả trang này là đầu vào cho trang kia, nên khi thay đổi, hay mở rộng các chức năng của ứng dụng thì rất khó thực hiện hoặc thực hiện rất phức tập và tốn nhiều thời gian. Do vây, mô hình 1 là cứng nhắc, không linh hoạt, không thích hợp với các dự án lớn.

II.1.2.2 Mô hình 2

II.1.2.2.1. Đặc điểm

Mô hình 2 là mô hình phổ biến được sử dụng hiện nay. Về cơ bản, đây là mô hình MVC (Model-View-Controller) mà các quá trình xử lý, điều khiển, hiển thị được tách rời nhau.

Điểm khác nhau quan trọng giữa mô hình 1 và mô hình 2 là trong mô hình 2, quá trình xử lý các yêu cầu từ phía người dùng không trực tiếp thông qua các trang JSP mà được thực hiện qua một Servlet. Các bước thực thi khi người dùng gửi yêu cầu như sau :

1. Controller Servlet xử lý các yêu cầu của người dùng (Điều này có nghĩa là liên kết trong JSP trỏ tới controller servlet).

Page 24: 101005641-Do-an

2. Controller Servlet sau đó sẽ tìm các JavaBean phù hợp dựa trên các tham số request (hoặc dựa trên các thuộc tính session).

3. Controller Servlet tự bản thân nó hoặc thông qua các controller khác giao tiếp với tầng trung gian hoặc trực tiếp tới database để lấy các dữ liệu phù hợp.

4. Controller thể hiện dữ liệu lấy được thông qua các JavaBean thông qua một trong các ngữ cảnh : request, session hoặc application.

5. Controller sau đó chuyển hướng đến phần hiển thị tiếp theo dựa trên request URL.

6. Phần hiển thị sử dụng các JavaBean đã được thiết lập ở bước 4 để hiển thị dữ liệu.

Hình II.2 Mô hình 2 về kiến trúc ứng dụng Web

II.1.2.2.2. Ưu điểm

Ưu điểm nổi bật trong kiến trúc của mô hình 2 so với mô hình 1 là ở khả năng sửa đổi, bảo trì và khả năng mở rộng hệ thống về sau của ứng dụng. Do vậy, mô hình 2 là một kiến trúc được áp dụng nhiều trong các ứng dụng lớn và mang tính thương mại cao.

II.1.3. Mô hình Model – View – Controller (MVC)

II.1.3.1. Đặc điểm

MVC là mô hình thiết kế mang tính tổng thể để giải quyết vấn đề có tính nghiệp vụ cao, thường áp dụng cho những dự án lớn và có tính thương mại cao. Mô hình MVC được tạo ra bởi Krasner và Pope năm 1988 cho Smalltalk, hiện tại được IBM và Apache ứng dụng trong các dự án của họ rất thành công. Đây là một giải pháp cho phép xây dựng các ứng dụng phân tầng một cách rất hiệu quả, bằng cách tạo ra những phương thức quản lý từng tầng một cách riêng rẽ. Trong J2EE, thì MVC cũng được xây dựng dựa trên những tính năng mạnh của công nghệ JSP và Servlet.

MVC có 3 thành phần chính : Model, View, Controller.

Page 25: 101005641-Do-an

Hình II.3 Mô hình MVC trong kiến trúc ứng dụng Web

II.1.3.2. Model

Trong mô hình kiến trúc MVC, đây là thành phần quan trọng nhất trong ứng dụng. Thành phần Model cung cấp một giao diện cho dữ liệu và các dịch vụ được sử dụng trong ứng dụng. Theo cách này, thành phần Controller sẽ không cần phải nhúng mã lệnh để thao tác trực tiếp với các dữ liệu trong ứng dụng. Thay vào đó, chúng sẽ trao đổi với thành phần Model để thực hiện thao tác và truy xuất dữ liệu. Thành phần Model có rất nhiều dạng khác nhau, nó có thể đơn giản là các JavaBean hoặc phức tạp hơn là Enterprise JavaBean hoặc Web Service.

II.1.3.3. View

Thành phần View trong mô hình MVC dùng để hiển thị dữ liệu ở phía người dùng của ứng dụng. Đó có thể là các dạng dữ liệu hiển thị cho việc nhập liệu đầu vào của người dùng cung cấp cho thành phần Controller hoặc cũng có thể là dữ liệu trả về từ Controller sau quá trình xử lý để hiển thị kết quả. Thông thường, thành phần View này có thể là các trang HTML, JSP hoặc một số dạng templete như Velocity hoặc FreeMarker …

II.1.3.4. Controller

Đây là thành phần điều khiển các luồng dữ liệu giữa các thành phần View và Model, phụ thuộc vào tác động của người sử dụng và chỉ ra các hành động và chuyển hướng hành động theo các yêu cầu của người dùng.

II.1.3.5. Cơ chế tương tác giữa 3 thành phần trong ứng dụng

Page 26: 101005641-Do-an

Hình II.4 Cơ chế tương tác giữa các thành phần trong mô hình MVC

II.1.3.6. Ưu điểm của mô hình MVC

a) Độ tin cậy cao (Reliability): Do trong mô hình MVC các lớp presentation và transaction được phân chia rõ ràng, điều đó cho phép ta thay đổi cách nhìn và cách cảm nhận về một ứng dụng phần mềm khi không phải biên dịch lại code của Model hoặc Controller.

b) Khả năng tái sử dụng và tính đáp ứng cao (High reuse and adaptability) : Mô hình MVC cho phép chúng ta sử dụng đa kiểu trong tầng View, tất cả các cách truy nhập mã code bên server. Điều đó bao gồm bất cứ thứ gì từ trình duyệt Web (HTTP) tới trình duyệt không dây (WAP).

c) Giá chi phí cho phát triển phần mềm và vòng đời thấp : Mô hình MVC tạo nhiều thuận lợi cho các lập trình viên mức thấp phát triển thêm ứng dụng của mình cũng như dễ dàng trong việc bảo trì giao diện người dùng.

d) Khả năng bảo trì dễ dàng (Maintainability): Do sự tách biệt trong lập trình các phần trong mô hình MVC nên tạo nhiều thuận lợi cho việc bảo trì và sửa đổi các ứng dụng Web.

Do mô hình MVC có những ưu điểm nổi bật như trên, nên trong thực tế hầu hết các ứng dụng Web ngày nay đều được xây dựng dựa trên mô hình MVC, đặc biệt đối với các ứng dụng có tính thương mại và độ phức tạp cao. Dưới đây giới thiệu một số framework hỗ trợ xây dựng ứng dụng dựa Web theo mô hình kiến trúc MVC.

II.2. Struts framework

II.2.1. Lịch sử hình thành

Struts nguồn gốc được tạo ra bởi Craig R.McClanahan và sau đó được chuyển giao cho dự án Jakarta của Apache Software Foundation (AFS) vào năm 2000. Vào tháng

Page 27: 101005641-Do-an

6 năm 2001, Struts đã phát hành phiên bản 1.0. Sau đó, có rất nhiều người đã tham gia đóng góp cả về mã nguồn và tài liệu cho dự án và Struts ngày càng trở nên hoàn thiện hơn.

Struts là một framework mã nguồn mở được phát triển trên nền tảng của ngôn ngữ Java, JSP nhằm mục đích tạo ra một thành phần chuẩn trong việc thiết kế ở tầng Web sử dụng MVC dựa trên nền tảng của J2EE. Với Struts, người lập trình sẽ không phải quan tâm đến việc xây dựng mô hình MVC như thế nào mà chỉ cần cấu hình và chạy tầng hiển thị của dự án, điều này cho phép giảm thiểu chi phí đào tạo, thời gian phát triển dự án nhanh hơn và cho phép hệ thống chạy ổn định trên các nền và hoặc module tích hợp khác nhau. Với Struts ta có thể tách làm 3 tầng làm việc riêng biệt một cách dễ dàng, thích hợp cho một dự án lớn, không bị nhập nhằng giữa việc tạo giao diện, xử lý và truy xuất cơ sở dữ liệu.

Struts hiện có hai phiên bản chính, đó là Struts 1.xx và 2.0x. Struts 1.xx được công nhận như một framework phổ biến nhất trong Java, Struts 1.xx đủ chín muồi và là một giải pháp tốt cho nhóm phát triển để giải quyết các vấn đề chung nhất. Struts 2.0x, kế thừa nền tảng của webwork framework, được tổ chức như một nền làm việc chuyên nghiệp với web, nhằm giải quyết các vấn đề phức tạp, mang tính nghiệp vụ cao.

II.2.2. Tổng quan về kiến trúc hệ thống

Struts tuy ra đời sau một số framework hoặc các công nghệ khác nhưng nó đã nhanh chóng được các nhà phát triển các ứng dụng trên nền Web chấp nhận và sử dụng rộng rãi. Là một framework được xây dựng áp dụng theo mô hình MVC, Struts tỏ ra rất thích hợp trong các dự án mang tính thương mại, nghiệp vụ cao và phức tạp, và trên hết, đây là một framework mã nguồn mở. Các nhà phát triển có thể tự do phát triển ứng dụng dựa trên Struts mà không phải mất chi phí nào.

Trong tài liệu này, tác giả chủ yếu đề cập đến Struts ở phiên bản 2.0x. Do phiên bản Struts 1.xx đã khá quen thuộc với nhiều người. Struts 2.0x là sự kết hợp giữa Struts và Webwork 2 (Một framework mã nguồn mở khác của Open Symphony). Mục đích của Struts2 là sự đơn giản – giúp các nhà phát triển xây dựng dễ dàng các ứng dụng Web. Để đạt được mục đích này, Struts2 hỗ trợ các tính năng làm giảm thiểu việc cấu hình trong các file XML thông qua các cài đặt ngầm định thông minh, các tiện ích chú thích và hỗ trợ các quy ước trong việc cấu hình.

Dưới đây là một số tính năng của Struts 2:

Struts2 là một Action based framework

Nhiều tùy chọn cấu hình file XML và Annotation

POJO-dựa trên các action giúp việc kiểm thử dễ dàng

Tích hợp Spring, Sitemesh và Tiles

Tích hợp ngôn ngữ OGNL

Hỗ trợ AJAX thông qua các thư viện thẻ

Nhiều tùy chọn ở tầng View (JSP, Freemarker, Velocity và XSLT)

Hỗ trợ mở rộng nhiều plug-in

Page 28: 101005641-Do-an

Các thành phần của Struts2:

Chuẩn MVC trong Struts2 được áp dụng với năm thành phần cốt lõi : actions, interceptors, value stack / OGNL, result types và results / view technologies.

Vòng đời request trong ứng dụng Struts 2 :

Hình II.5 Vòng đời request trong ứng dụng Struts2

1. Người dùng gửi request : Người dùng gửi các yêu cầu đến server.

2. FilterDispatcher xác định action phù hợp : FilterDispatcher nhận request và sau đó xác định Action tương ứng.

3. Các Interceptor được áp dụng : Các interceptor được cấu hình để áp dụng cho các chức năng như workflow, validation, file upload …

4. Thực thi Action : Phương thức Action được thực thi để thao tác với database lưu trữ, cập nhật, khôi phục dữ liệu…

5. Tạo ánh xạ đầu ra : Action tạo ánh xạ đầu ra thông qua tham số trả về của hàm.

6. Trả về kết quả của Request : Kết quả được trả về các interceptot theo thứ tự ngược lại giúp chúng ta clean-up bộ đệm hoặc thêm các xử lý phụ khác.

7. Hiển thị kết quả tới người sử dụng : Cuối cùng control được trả về cho servlet container, làm nhiệm vụ hiển thị dữ liệu đầu ra trên trình duyệt.

II.2.3. Các thành phần trong Struts

Như đã đề cập đến ở phần trên, Struts2 bao gồm năm thành phần cốt lõi là : Actions, Interceptors, Value Stack / OGNL, Result Types, Results / View technologies.

II.2.3.1. Actions

Actions là khái niệm cơ bản trong hầu hết các framework về ứng dụng web. Chúng là đơn vị làm việc cơ bản nhất liên quan tới HTTP request từ phía người dùng.

Trong Struts2, một action có thể được sử dụng theo các cách khác nhau :

Single Result :

Page 29: 101005641-Do-an

Đây là cách thức sử dụng đơn giản nhất của một action. Action thực thi và chỉ trả về một kết quả duy nhất. Trong trường hợp này, action có thể được mô tả như sau :

class MyAction {public void String execute() throws Exception {

return "success";}

}

Có vài điểm cần chú ý. Thứ nhất, lớp action này không cần kế thừa từ các lớp khác và cũng không cần thực thi một interface nào. Hay nói cách khác, lớp này là một POJO đơn giản. Thứ hai, lớp này chỉ có một phương thức là “execute”. Đây là quy ước ngầm định của Struts2. Nếu bạn muốn sử dụng nhiều phương thức khác nhau, bạn cần cấu hình trong file struts.xml.

Dưới đây là cách cấu hình dạng đơn giản nhất trong file struts.xml :<action name="my" class="com.struts.MyAction" >

<result>view.jsp</result></action>

Thuộc tính “name” cung cấp thông tin URL để thực thi action. Trong trường hợp này, URL sẽ có dạng “/my.action”. Phần mở rộng “.action” được cấu hình trong file “struts.properties”. Thuộc tính “class” cung cấp đường dẫn đến tên lớp mà action đó cần thực thi.

Multiple Result :

Tiếp theo, một cách phức tạp hơn sử dụng khi action có thể trả về nhiều kết quả khác nhau tùy thuộc vào xử lý logic theo yêu cầu của người sử dụng. Lớp action này có thể được mô tả đơn giản như sau :

class MyAction {public void String execute() throws Exception {

if( myLogicWorked() ) {return "success";

} else {return "error";}

} }

Ở đây, lớp action có thể trả về một trong hai giá trị khác nhau. Do vậy, chúng ta cần cấu hình trong file struts.xml :

<action name="my" class="com.struts.MyAction" ><result>view.jsp</result><result name="error">error.jsp</result>

</action>

Trong các ví dụ vừa rồi, chúng ta đã sử dụng những cách chung nhất để xác định kết quả cho một action. Tuy nhiên, trong thực tế, có bốn tùy chọn cho phép bạn thực hiện ý muốn này :

1. Phương thức action trả về giá trị kiểu String – giá trị trả về này sẽ được đối sánh với thuộc tính trong file cấu hình của struts.

2. Sử dụng tiện ích code behind plugin – Khi code behind plugin được sử dụng, các template hiển thị sẽ được tìm bởi sự móc nối tên action với xâu trả về từ action đó. Ví dụ, Nếu URL có dạng “/adduser.action” và giá trị trả về của action là “success” thì nó sẽ tìm đến file JSP có dạng “/adduser-succcess.jsp”.

Page 30: 101005641-Do-an

3. Sử dụng @Result annotation – Lớp action có thể được chú thích các kết quả trả về thông qua việc sử dụng các chú thích @Results và @Result. Xâu giá trị trả về cần được đối sánh với một trong những result được chú thích trong file cấu hình.

4. Sử dụng acion trả về một thể hiện lớp Result – Action không cần trả về giá trị String, thay vào đó nó có thể trả về một thể hiện của lớp Result đã được cấu hình để sẵn sàng sử dụng.

II.2.3.2. Interceptors

Nhiều tính năng hỗ trợ trong Struts2 framework được thực thi bằng việc sử dụng Interceptors; bao gồm việc xử lý exception, file upload, lifecycle callbacks và validation. Interceptors là khái niệm tương tự như với servlet filters hoặc các lớp JDK Proxy. Chúng hỗ trợ cách thức áp dụng tiền xử lý và hậu xử lý đối với action. Tương tự như servlet filters, các interceptors có thể có nhiều lớp và có thứ tự.

Dưới đây là một số loại Interceptor :

Spring Framework – ActionAutowiringInterceptor interceptor.

Request String và Form Values – ParametersInterceptor interceptor.

Servlet-based objects – ServletConfigInterceptor interceptor.

Hai interceptor đầu làm việc độc lập, không cần tới action, nhưng interceptor cuối thì khác. Nó làm việc với sự trợ giúp của các interface sau :

SessionAware – hỗ trợ truy xuất tới tới tất cả các thuộc tính của session thông qua Map.

ServletRequestAware – hỗ trợ truy xuất tới đối tượng HttpServletRequest.

RequestAware – hỗ trợ truy xuất tới các thuộc tính request thông qua Map.

ApplicationAware – hỗ trợ truy xuất tới tất cả các thuộc tính của application thông qua Map.

ServletResponseAware – hỗ trợ truy xuất tới đối tượng HttpServletResponse.

ParameterAware – hỗ trợ truy xuất tới tất cả các xâu request và các thuộc tính giá trị của form thông qua Map.

PrincipalAware – hỗ trợ truy xuất tới đối tượng PrincipleProxy, đối tượng này thực thi các phương thức của đối tượng HttpServletRequest, nhưng cung cấp qua proxy, cho phép thực hiện độc lập trong action.

ServletContextAware – hỗ trợ truy xuất tới đối tượng ServletContext.

Cấu hình Interceptors

Để cấu hình Interceptor, trước hết chúng ta cần định nghĩa interceptor. Sử dụng các thẻ <interceptors../> và <interceptor../> trực tiếp trong thẻ <package>. Ví dụ như dưới đây :

<package name="default" extends="struts-default"> <interceptors>

Page 31: 101005641-Do-an

<interceptor name="timer" class=".."/> <interceptor name="logger" class=".."/> </interceptors>

<action name="login" class="tutorial.Login"> <interceptor-ref name="timer"/> <interceptor-ref name="logger"/> <result name="input">login.jsp</result> <result name="success" type="redirect-action">/secure/home</result> </action></package>

Cần chú ý là các interceptor đã được định nghĩa cần phải được áp dụng cho action. Chúng ta có thể sử dụng interceptor trực tiếp trong thẻ <action/> như trong ví dụ trên. Sử dụng các cấu hình trên khôg hạn chế số lượng các interceptor áp dụng cho action. Khi cần, các interceptor theo danh sách thứ tự sẽ được thực hiện.

Một cách khác là sử dụng interceptor ngầm định cho package hiện tại :<default-interceptor-ref name="autowiring"/>

II.2.3.3. Value Stack / OGNL

Value stack – giốn như cái tên của nó, là một stack chứa các object. OGNL là viết tắt của cụm từ Object Graph Navigation Language, và cung cấp cách mô hình hóa để truy xuất các object trong value stack.

Value stack bao gồm các đối tượng theo thứ tự sau :

1. Temporary Objects – Các đối tượng tạm trong quá trình thực thi được tạo ra và lưu trong value stack; ví dụ như quá trình lặp hiển thị danh sách các đối tượng thông qua thẻ JSP.

2. Model Object – Nếu các đối tượng này được sử dụng, model object hiện tại sẽ được lưu trước đối tượng Action trong value stack.

3. Action Object – Đối tượng action được thực thi.

4. Named Objects – Đó là các đối tượng bao gồm #application, #session, # request, #attr và #parameter.

Việc truy xuất tới value stack có thể được thực hiện theo nhiều cách khác nhau. Cách thông thường nhất là thông qua các thẻ được hỗ trợ bởi JSP, Velocity và Freemarker. Các thẻ HTML thông thường được sử dụng để truy xuất các thuộc tính của các đối tượng từ value stack; các thẻ điều khiển (như if, elseif và iterator) được sử dụng với các biểu thức; và các thẻ dữ liệu dùng để thao tác với stack (thông qua phương thức set và push).

Khi sử dụng value stack, chúng ta không cần giữ lại phạm vi của đối tượng đích trong đó. Nếu bạn muốn thuộc tính là “name”, bạn chỉ cần truy vấn tới value stack với thuộc tính này. Mỗi thành phần trong stack, theo như thứ tự trên yêu cầu có một thuộc tính. Nếu như thuộc tính này trùng với thuộc tính mà ta truy vấn và nó sẽ trả về giá trị để sử dụng. Ngược lại, thành phần tiếp theo sẽ được truy vấn. Quá trình này sẽ được tiếp tục cho đến khi hết stack. Đây là một tính năng rất tốt, bởi vì bạn không

Page 32: 101005641-Do-an

cần phải quan tâm giá trị trong đó là gì – action, model hay HTTP request – Bạn chỉ cần biết là nếu có giá trị tồn tại trong stack thì nó sẽ được lấy ra.

OGNL là giải pháp để truy xuất các thuộc tính, phương thức của đối tượng trong value stack, nó chứa đầy đủ tính năng của một ngôn ngữ biểu thức. Nó giúp đơn giản hóa các biểu thức so với phương pháp sử dụng theo cách truyền thống (Ví dụ: sử dụng “person.address” thay vì dùng “getPerson().getAddress()”). OGNL hỗ trợ các tính năng như chuyển đổi kiểu dữ liệu, gọi các phương thức, thao tác và tạo các collection, ước lượng biểu thức…

II.2.3.4. Result Types

Trong Struts2 hỗ trợ nhiều kiểu result. Chúng có thể nhìn thấy, hoặc chúng có thể tương tác với môi trường.

Để cấu hình một action thực thi một result theo một kiểu xác định, chúng ta sử dụng thuộc tính “type”. Nếu không có thuộc tính “type” thì ngầm định kiểu là “dispatcher” – sẽ hiển thị kết quả trang JSP. Dưới đây là một dạng ví dụ đơn giản :

<action name="my" class="com.struts.MyAction" ><result type="dispatcher">view.jsp</result>

</action>

Cấu hình result type

Result type có thể được cấu hình trong thẻ <package …/>. Việc cấu hình tương tự như cấu hình với interceptor. Thuộc tính “name” cung cấp một định danh duy nhất cho result type, và thuộc tính class là đường dẫn tới lớp cần thực hiện. Có một thuộc tính ngầm định thứ ba là “default” – cho phép result type ngầm định được thay đổi.

<result-types><result-type name="dispatcher" default="true"

class="….dispatcher.ServletDispatcherResult"/><result-type name="redirect"

class="….dispatcher.ServletRedirectResult"/>…

</result-types>

II.2.3.5. Results / View technologies

Trong các ví dụ trước, chúng ta vẫn sử dụng JSP (Java Server Pages) để hiển thị ở tầng View. Mặc dù JSP là một lựa chọn phổ biến nhất, tuy nhiên, nó không phải là giải pháp duy nhất cho tầng hiển thị.

Có ba công nghệ khác có thể thay thế JSP trong một ứng dụng Struts2 :

Velocity Templates

Freemarker Templates

XSLT Transformations

Cú pháp của các ngôn ngữ tempalte này là khác nhau. Velocity và Freemarker khá giống với JSP. Tất cả các thuộc tính của action (thông qua các phương thức gettet) đều có thể sử dụng dễ dàng trong các templte này, giốn như việc sử dụng thư viện thẻ hỗ trợ trong JSP và OGNL. Tên của các template JSP sẽ được thay thế bằng tên của

Page 33: 101005641-Do-an

các templte dạng Velocity và Freemarker trong việc cấu hình các action. Dưới đây là ví dụ cấu hình cho tempalte Freemarker thay thế cho JSP :

<action name="my" class="com.fdar.infoq.MyAction" ><result type="freemarker">view.ftl</result>

</action>

XSLT result có một chút khác biệt. Thay vì thay thế tên tempalte với tên stylesheet, nó thêm các tham số để sử dụng. Tham số “stylesheetLocation” cung cấp tên của stylesheet sử dụng để biểu diễn XML. Nếu như không có tham số này, XML sẽ không được chuyển đổi tới người dùng.

II.2.4. Thư viện thẻ trong Struts

II.2.4.1. Thư viện thẻ trong version 2.xx

Thư viện thẻ thông thường :

Control Tags

• if• elseIf• else• append• generator• iterator• merge• sort

• subset

Data Tags

• a• action• bean• date• debug• i18n• include• param• property• push• set• text

• url

Thư viện thẻ UI :

Form Tags

• checkbox• checkboxlist• combobox• doubleselect• head• file• form• hidden• label• optiontransferselect• optgroup• password• radio• reset• select• submit• textarea• textfield• token

Non-Form UI Tags

• actionerror• actionmessage• component• div• fielderror

Ajax Tags

• a• autocompleter• bind• datetimepicker• div• head• submit• tabbedpanel• textarea• tree• treenode

Page 34: 101005641-Do-an

• updownselect

II.2.5. Cấu hình trong Struts

II.2.5.1. Cấu hình trong version 2.xx

Các file cấu hình cơ bản trong ứng dụng Struts2 bao gồm : web.xml, struts.xml và struts.properties.

File cấu hình web.xml

File cấu hình web.xml mô tả các file “nhân” của ứng dụng Web Java. Nó cũng có thể xem như là một thành phần “nhân” của Struts framework. Trong file web.xml, Struts định nghĩa ra các lớp FilterDispatcher, Servlet Filter và khởi tạo chúng để xử lý tất cả các request.

Để hỗ trợ FilterDispatcher, Struts cung cấp thêm lớp ActionContextCleanUp để xử lý nhiệm vụ dọn dẹp đối với các filter khác. Dưới đây là ví dụ đơn giản trong file cấu hình web.xml :<web-app id="WebApp" version="2.4"

xmlns="http://java.sun.com/xml/ns/j2ee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee

http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

<filter><filter-name>struts</filter-name><filter-class>

org.apache.struts2.dispatcher.FilterDispatcher</filter-class><init-param>

<param-name>actionPackages</param-name><param-value>com.mycompany.myapp.actions</param-

value></init-param>

</filter>

<filter-mapping><filter-name>struts</filter-name><url-pattern>/*</url-pattern>

</filter-mapping></web-app>

File cấu hình struts.properties

File cấu hình này cung cấp khả năng thay đổi hành vi ngầm định của framework.Tất cả các thuộc tính chứa trong file cấu hình “struts.properties” cũng có thể được cấu hình sử dụng thẻ “init-param” trong file “web.xml”, hoặc cũng có thể sử dụng thẻ “constant” trong file cấu hình “struts.xml”.

File thuộc tính ngầm định có tên là “default.properties” được chứa trong file jar struts2-core. Để có thể thay đổi các thuộc tính ngầm định, cần tạo ra file “struts.properties” trong thư mục gốc của project. Sau đó , thêm các thuộc tính mà bạn muốn thay đổi. Giá trị mới tạo sẽ ghi đè lên giá trị ngầm định.

Trong môi trường phát triển, các thuộc tính sau có thể cần thay đổi :

Page 35: 101005641-Do-an

struts.i18n.reload = true - cho phép reload lại các file trong ứng dụng.

struts.devMode = true - cho phép chế độ phát triển cải hiện khả năng debug.

struts.configuration.xml.reload = true – cho phép reload lại các file cấu hình XML khi có sự thay đổi mà không cần reload lại toàn bộ ứng dụng web trong servlet container.

File cấu hình struts.xml

File cấu hình “struts.xml” chứa các thông tin cấu hình cho các action khi thực thi trong ứng dụng. Nó cũng chứa các tham số để khởi tạo các tài nguyên, bao gồm :

Các interceptor : hỗ trợ việc tiền xử lý và hậu xử lý các request.

Các lớp action : dùng để gọi tầng nghiệp vụ và truy xuất dữ liệu.

Các Result: chuẩn bị để hiển thị dữ liệu sử dụng JSP, Velocity và Freemarker.

Dưới đây là ví dụ về file cấu hình “struts.xml” :<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"><struts>

<package name="account" namespace="/account"extends="tiles-default">

<action name="create" method="create"class="vn.tricc.action.account.CreateAccount"><result name="create"

type="tiles">account.create</result></action>

<action name="createCompleted" method="createCompleted"class="vn.tricc.action.account.CreateAccount"><result name="createCompleted" type="redirect-

action">list</result></action>

</package></struts>

II.2.6. Ưu nhược điểm của Struts trong xây dựng ứng dụng Web

Struts kế thừa toàn bộ những ưu điểm từ mô hình MVC mang lại : độ tin cậy cao, khả năng tái sử dụng và khả năng đáp ứng cao, giá chi phí chp phát triển và vòng đời thấp, khả năng bảo dưỡng dễ dàng, thực thi ứng dụng nhanh.

Với Struts người lập trình không phải quan tâm đến việc xây dựng MVC như thế nào mà chỉ cần cấu hình và chạy tầng hiển thị của dự án, điều này cho phép giảm thiểu chi phí đào tạo, thời gian phát triển dự án nhanh hơn và cho phép hệ thống chạy ổn định trên các nền hoặc các module tích hợp khác nhau.

Theo tinh thần MVC trong Struts, Struts Framework không có yêu cầu ràng buộc đặc biệt với thành phần Model, kết nối và thao tác với cơ sở dữ liệu. Vì vậy, khi xây dựng các thành phần Model trong ứng dụng Struts có thể sử dụng

Page 36: 101005641-Do-an

rất nhiều lựa chọn : sử dụng EJB (Enterprise JavaBean), JDO (Java Data Object), Hibernate, hay các JavaBean thông thường.

Struts là một framework cho tầng web phát triển mạnh nhất trong những năm gần đây. Các hãng sản xuất như Borland, Oracle, hay IBM đều cố gắng đưa ra sản phẩm hỗ trợ và tích hợp Struts trong việc xây dựng các ứng dụng web. Chính vì vậy, nó tạo ra một cộng đồng sử dụng Struts đông đảo và tạo nên những sản phẩm của các hãng thứ ba, xây dựng những thành phần và module hỗ trợ và sử dụng Struts, làm phong phú thêm thư viện cho người lập trình web. Đặc biệt đã có rất nhiều sản phẩm phần mềm được xây dựng trên nền của Struts framework và đã được sử dụng một cách thành công, ví dụ như phần mềm WebSphere Server.

Một trong những mục đích chính của Struts là cài đặt một framework dựa trên model 2 của Sun để giảm thiểu các nhiệm vụ chung và có tính lặp lại trong việc xây dựng các trang Servlet và JSP.

Từ những phân tích trên, ta thấy rõ ràng rằng Struts là một framework đầy hứa hẹn trong lập trình ứng dụng web. Tuy nhiên, trong giai đoạn hiện nay, JSF đang trong quá trình hoàn thiện và bổ sung các tính năng và xây dựng hệ thống thư viện thẻ của mình và hứa hẹn sẽ mang lại nhiều tính năng linh động hơn. Các phiên bản mới được cập nhật từ phiên bản ban đầu của JSF 1.0 đến JSF 1.1 và hiện nay là JSF 2.7 tích hợp cho Swing và AJAX. Đây là một sự cạnh tranh giữa Struts và JSF.

Hệ thống các thẻ thư viện hỗ trợ cho giao diện người dùng của Struts là chưa thống nhất và đầy đủ. Điều này một phần là do Struts là mã nguồn mở trên nền công nghệ Java. Do đó, việc xây dựng hệ thống thư viện là do các tổ chức, cá nhân đóng góp. Điều này tuy là rất tốt vì sẽ tận dụng được trí tuệ cộng đồng . Nhưng cũng đòi hỏi cần có sự hợp tác để có thể hệ thống hóa lại thư viện từ sự đóng góp đó.

Bộ khung Struts có trách nhiệm tương tác với các thiết bị máy khách (client) và cung cấp các công cụ hỗ trợ để kết hợp 3 tầng : trình diễn trực quan (visual presentation), logic ứng dụng (application logic) và tầng logic nghiệp vụ (business logic). Tuy vậy, sự kết nối với tầng cơ sở dữ liệu thì Struts tỏ ra không mạnh, chính vì vậy mà Struts thường kết hợp với các framework điều khiển dữ liệu, và Hibernate tỏ ra rất hữu hiệu trong việc hỗ trợ Struts trong lĩnh vực này. Nhưng vai trò và sức mạnh của Struts vẫn được thể hiện rõ khi kết hợp với các công nghệ khác như: JSP, AJAX, JSF …

II.3. Hibernate framework

II.3.1. Lịch sử hình thành

Hibernate là một dự án đầy tham vọng với đích nhắm là đưa ra một giải pháp toàn diện cho vấn đề quản lý Persistent Data trong Java. Nó gián tiếp giúp cho các ứng dụng có thể tương tác với cơ sở dữ liệu quan hệ. Nó giúp cho các Developer đơn giản hóa đối với các vấn đề nghiệp vụ phải xử lý thủ công. Hibernate tích hợp được với

Page 37: 101005641-Do-an

hầu hết các ứng dụng mới hiện nay và không yêu cầu thay đổi phá vỡ các thành phần còn lại của hệ thống.

Một ứng dụng có thể chia làm 3 phần như sau : phần giao diện người dùng (GUI layer), phần xử lý nghiệp vụ (business layer), và phần chứa dữ liệu (data layer). Cụ thể, business layer có thể chia nhỏ ra thành 2 layer con là business logic layer (chỉ quan tâm đến ý nghĩa của các nghiệp vụ, các tính toán nhằm thỏa mãn yêu cầu người dùng) và persistence layer. Persistence layer chịu trách nhiệm giao tiếp với data layer (thường là một hệ quản trị cơ sở dữ liệu quan hệ - RDBMS). Persistence sẽ đảm nhiệm các nhiệm vụ mở kết nối, truy xuất và lưu dữ liệu vào các RDBMS.

Việc phân chia ra như vậy có lợi ích là công việc sẽ được tách bạch. Người nào lo thiết kế và xử lý GUI thì chỉ việc chú tâm vào công việc đó. Người lo business layer thì chỉ cần tập trung vào thiết kế và phát triển làm sao thỏa mãn các requirement của khách hàng mà không phải chú tâm đến các khía cạnh thực hiện bên dưới. Còn người lo persistence layer thì chỉ chú trọng đến các khía cạnh thực hiện và giải quyết các technical issues mà thôi. Cũng như sẽ có những DBA (DB Administrators) lo việc cài đặt và tạo các object trong các RDBMS.

Như vậy, persistence layer là một layer có nhiệm vụ kết nối RDBMS và truy xuất, thao tác dữ liệu đã được lưu trữ cũng như lưu trữ dữ liệu mới vào chúng. Hibernate chính là một framework cho persistence layer. Có thể thấy rằng nhờ có Hibernate framework mà giờ đây khi phát triển một ứng dụng, ta chỉ cần chú tâm vào những layer khác mà không phải bận tâm nhiều về persistence layer nữa. Tương tự như vậy, nếu bạn có một UI framework, bạn cũng sẽ không phải bận tâm nhiều về GUI layer nữa.

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

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

II.3.2. Một số khái niệm

II.3.2.1. Các khái niệm liên quan đến object / relational persistence

Persistence là gì ?

Hầu hết các ứng dụng đều đòi hỏi dữ liệu persistent. Persistence là một khái niệm cơ bản trong quá trình phát triển ứng dụng. Nếu một hệ thống thông tin không duy trì được dữ liệu khi nó không hoạt động thì hệ thống đó khó có thể được sử dụng tốt. Khi nói về persistence trong Java, chúng ta thường nói về việc lưu trữ dữ liệu trong

Page 38: 101005641-Do-an

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

Persistence trong các ứng dụng hướng đối tượng

Trong một ứng dụng hướng đối tượng, persistence cho phép một đối tượng có thể “sống” lâu hơn. Trạng thái của đối tượng có thể được lưu trên ổ đĩa, và một đối tượng với cùng trạng thái đó có thể lại được tạo ra ở một thời điểm khác trong tương lai.

Các cơ sở dữ liệu quan hệ ngày nay hỗ trợ biểu diễn có cấu trúc của dữ liệu persistent, nó cho phép thao tác, sắp xếp, tìm kiếm và kết tập dữ liệu. Các hệ quản trị cơ sở dữ liệu hỗ trợ việc quản lý tính toàn vẹn của dữ liệu, chia sẻ dữ liệu đa người dùng với nhiều ứng dụng khác nhau. Chúng bảo đảm tính toàn vẹn của dữ liệu thông qua các quy tắc được thực thi bởi các ràng buộc. Hệ quản trị cơ sở dữ liệu cũng hỗ trợ việc bảo mật nhiều cấp đối với dữ liệu.

Một ứng dụng sử dụng Hibernate thường không làm việc trực tiếp với các thực thể trong cơ sở dữ liệu, chúng sẽ sử dụng các mô hình hướng đối tượng tương ứng với các thực thể trong cơ sở dữ liệu để thao tác và xử lý dữ liệu. Ví dụ: Nếu cơ sở dữ liệu của một hệ thống bán hàng trực tuyến có 2 bảng là ITEM và BID thì trong ứng dụng Java sẽ định nghĩa ra 2 lớp tương ứng là Item và Bid.

Sau đó, thay vì làm việc trực tiếp với các dòng và cột của result-set SQL, tầng business sẽ tương tác với các đối tượng này. Tầng business sẽ không được thực thi trong cơ sở dữ liệu (như là một stored procedure); nó được thực thi trong Ứng dụng Java ở tầng ứng dụng. Điều này cho phép tầng business có thể sử dụng các khái niệm hướng đối tượng phức tạp như tính kế thừa hay tính đa hình.Ví dụ, Chúng ta có thể sử dụng các chuẩn thiết kế như Strategy, Mediator, và Composite.

Cần chú ý là: Không phải tất cả các ứng dụng Java đều được thiết kế theo cách này. Đối với các ứng dụng đơn giản, việc thực hiện theo mô hình này lại trở nên không phù hợp. Đối với các ứng dụng phức tạp mà có thể sử dụng lại các stored procedure sẵn có thì SQL và JDBC API lại là một giải pháp tốt cho việc thực thi và giao tiếp với cơ sở dữ liệu.

Tuy nhiên, trong trường hợp các ứng dụng mang tính nghiệp vụ cao, cách tiếp cận theo mô hình này sẽ giúp cho việc cải thiện việc dùng lại code và nâng cao khả năng bảo trì.

II.3.2.2. Persistence layer

Hình II.9 dưới đây thể hiện mối liên hệ giữa tầng persistence với các tầng khác trong một ứng dụng. Các tầng liên hệ với nhau theo các nguyên tắc :

• Các tầng giao tiếp với nhau theo thứ tự từ trên xuống dưới. Một tầng chỉ phụ thuộc trực tiếp vào tầng ở ngay dưới nó.

• Mỗi tầng không biết đến các tầng khác mà không phải ở ngay dưới nó.

Page 39: 101005641-Do-an

Hình II.6 Persistence layer trong kiến trúc phân tầng

Presentation layer : Tầng giao diện người dùng – là tầng cao nhất. Đó chính là các mã lệnh dùng để biểu diễn hiển thị và điều hướng trang trên màn hình.

Business layer : Tầng tiếp theo của ứng dụng- nằm dưới tầng presentation. Tầng business có nhiệm vụ thực hiện bất cứ quy tắc nghiệp vụ nào hoặc các yêu cầu hệ thống được xác định từ người sử dụng. Tầng này thường bao gồm một số các thành phần điều khiển – các mã lệnh dùng khi kích hoạt các quy tắc nghiệp vụ. Trong một số hệ thống, tầng này có thể chứa biểu diễn của các thực thể nghiệp vụ.

Persistence layer : Tầng persistence là một nhóm các lớp và các thành phần cho việc lưu trữ và phục hồi dữ liệu. Chức năng của tầng này là chứa các mô hình của các thực thể nghiệp vụ (thậm chí nó chỉ là mô hình metadata).

Database: Cơ sở dữ liệu nằm ngoài ứng dụng Java. Nó biểu diễn trạng thái của hệ thống. Nếu cơ sở dữ liệu SQL được sử dụng, nó bao gồm các lược đồ quan hệ và các stored procedure.

Helper and utility classes: Mỗi một ứng dụng có một tập helper hoặc các lớp tiện ích được sử dụng trong mỗi tầng (ví dụ như các lớp Exception để xử lí lỗi). Các thành phần này không phải là một dạng tầng vì chúng không tuân theo nguyên tắc trong kiến trúc tầng.

II.3.2.3. ORM (Object/Relational Mapping)

Như đã giới thiệu sơ qua ở phần trên, ORM được tự động (và trong suốt) ánh xạ persistence object tới các bảng trong cơ sở dữ liệu quan hệ, sử dụng metadata để mô tả việc ánh xạ giữa các đối tượng và cơ sở dữ liệu.

Một ORM bao gồm bốn phần sau :

Một API để thực thi các thao tác cơ bản CRUD trên đối tượng của các lớp persistent.

Một ngôn ngữ hay API để xác định các truy vấn tới các lớp và các thuộc tính của lớp.

Một tiện ích cho việc xác định ánh xạ metadata.

Page 40: 101005641-Do-an

Một kỹ thuật cho việc thực thi ORM để liên hệ với các đối tượng với các thao tác checking, fetching và các hàm tối ưu khác.

Với ORM, ứng dụng sẽ tương tác với các ORM API và các lớp ánh xạ từ cơ sở dữ liệu và nó được trừu tượng hóa dưới SQL/JDBC. Dựa trên các tính năng hay việc thực thi đặc biệt, ORM cũng có thể làm các nhiệm vụ như locking, caching, relieving một ứng dụng.

II.3.3. Kiến trúc hệ thống

Hình II.10 dưới đây mô tả các thành phần quan trọng nhất của Hibernate trong các tầng business và persistence. Chúng ta có thể thấy tầng business nằm trên tầng persistence, và nó hoạt động như là trình khách (client) của tầng persistence theo kiến kiểu kiến trúc tầng truyền thống.

Các interface như trong hình có thể được chia ra thành các loại sau :

Các interface được gọi bởi ứng dụng để thực thi các thao tác cơ bản CRUD (Create, Retrieve, Update, Delete) và các hành vi truy vấn. Đó là các phần chính của sự phụ thuộc nghiệp vụ ứng dụng / logic điều khiển trong Hibernate. Chúng bao gồm : Session, Transaction và Query.

Các interface được gọi từ các mã lệnh trong ứng dụng để cấu hình Hibernate, hầu hết đó là các lớp Configuration.

Các interface CallBack cho phép ứng dụng tương tác với các sự kiện xảy ra trong Hibernate, như Interceptor, Lifecycle, và Validatable.

Các interface cho phép mở rộng chức năng mapping của Hibernate, bao gồm UserType, CompositedUserType, và IdentifierGenerator. Các interface này được thực hiện bởi các mã lệnh trong ứng dụng (nếu cần thiết).

Hình II.7 Kiến trúc hệ thống trong Hibernate

Page 41: 101005641-Do-an

Hibernate có thể sử dụng các thành phần sẵn có của Java API, bao gồm JDBC, Java Transaction API (JTA), và Java Naming and Directory Interface (JNDI). JDBC hỗ trợ các mức cơ bản của việc trừu tượng hóa các chức năng chung của các cơ sở dữ liệu quan hệ, nó cho phép hầu như bất cứ cơ sở dữ liệu nào với JDBC driver có thể được hỗ trợ bởi Hibernate. JNDI và JTA cho phép Hibernate có thể tích hợp với các J2EE application server.

II.3.4. Cấu hình trong HibernateCác file cấu hình cơ bản nhưng không thể thiếu trong ứng dụng Hibernate bao gồm :

1. Persistence class:

Persistence class là một Plain Old Java Object (POJO model). Một POJO tương tự như một JavaBean, có những phương thức getter và setter để truy cập các thuộc tính của nó. Persistence class có những đặc điểm sau :

Nó thay thế hướng đối tượng cho các bảng ở cơ sở dữ liệu.

Các thuộc tính của bảng trở thành các biến instance của persistence class.

Kiểu dữ liệu của các biến instance là domain của thuộc tính.

Đối tượng của persistence class thay thế cho hàng của bảng trong cơ sở dữ liệu.

2. Mapping file:

Mapping file là một file XML chứa ánh xạ chi tiết giữa persistence class và bảng nó đại diện. Các thành phần bắt buộc của file XML này là :

Hibernate – mapping : Đây là thành phần gốc bao gồm tất cả các thành phần khác.

Class : Được sử dụng để ánh xạ tên bảng thành persistence class. Tên thuộc tính được sử dụng để xác định tên lớp. Ví dụ, để ánh xạ một bảng có tên là ORDER thành một persistence class với tên đầy đủ là vn.triax.persist.Order sẽ như sau : <class name=”vn.triax.persist.Order” table=”ORDER”>…</class>

Id : Thành phần này sử dụng để ánh xạ khóa chính của bảng thành một biến instance của class. Giá trị của khóa chính có thể được tự động tạo ra.Thành phần generator có thể được sử dụng để thông báo cho Hibernate một lớp sẽ được sử dụng ở đâu để tự động tạo id, hoặc id được gán bởi ứng dụng :

<id name="id" type="string" unsaved-value="null"><column name="id" sql-type="char(32)" not-null="true"/><generator class="assigned"/>

</id>

Property : Thành phần này thuộc về các cột thành phần con của bảng, ánh xạ những thuộc tính khác (hoặc các cột thành những biến instance của persistence class). Thuộc tính name của property chứa tên của biến như một giá trị. Thuộc tính name của thành phần column chứa tên của cột và biến instance được ánh xạ. Các thuộc tính length và sql-type trỏ đến độ dài và kiểu dữ liệu của cột.

Page 42: 101005641-Do-an

<property name="name"><column name="name" sql-type="char(255)" not-

null="true"/></property>

Dưới đây là một ví dụ cụ thể của file mapping :<?xml version="1.0" encoding="utf-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><!--

Mapping file autogenerated by MyEclipse Persistence Tools--><hibernate-mapping>

<class name="vn.tricc.domain.Accounts" table="accounts"schema="public"><id name="accountId" type="java.lang.Integer">

<column name="account_id" /><generator class="increment" />

</id><property name="username" type="java.lang.String">

<column name="username" length="20" not-null="true" />

</property><property name="password" type="java.lang.String">

<column name="password" length="50" not-null="true" />

</property><property name="status" type="java.lang.String">

<column name="status" length="1" not-null="true" /></property><set name="accountRoles" inverse="true">

<key><column name="account_id" not-null="true" />

</key><one-to-many class="vn.tricc.domain.AccountRole" />

</set></class>

</hibernate-mapping>

3. Hibernate Configuration file :

Đây là file cấu hình, khởi tạo các tài nguyên trong hệ thống, bao gồm khởi tạo các thông tin về cơ sở dữ liệu, cấu hình transaction và tạo ánh xạ tới các file mapping. Dưới đây là một ví dụ cụ thể của file cấu hình này :<?xml version='1.0' encoding='UTF-8'?><!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<!-- Generated by MyEclipse Hibernate Tools. --><hibernate-configuration>

<session-factory>

<property name="connection.username">postgres</property><property name="connection.url">

jdbc:postgresql://localhost:5432/tricc</property><property name="dialect">

org.hibernate.dialect.PostgreSQLDialect

Page 43: 101005641-Do-an

</property><property name="connection.password">postgres</property><property name="connection.driver_class">

org.postgresql.Driver</property>

<mapping resource="vn/tricc/domain/Roles.hbm.xml" /><mapping resource="vn/tricc/domain/AccountRole.hbm.xml" /> <mapping resource="vn/tricc/domain/Accounts.hbm.xml"

/>

</session-factory>

</hibernate-configuration>

II.3.5. Ưu nhược điểm của Hibernate trong lập trình ứng dụng Web

Ưu điểm :

1. Hibernate là một Relational Persistence cho Java :

Làm việc với cả phần mềm hướng đối tượng và cơ sở dữ liệu quan hệ là một nhiệm vụ phức tạp với JDBC vì có sự không tương xứng giữa dữ liệu được biểu diễn trong đối tượng đối với cơ sở dữ liệu quan hệ. Vì thế với JDBC, người lập trình phải viêt code để ánh xạ dữ liệu của mô hình đối tượng biểu diễn mô hình dữ liệu quan hệ và các lược đồ dữ liệu tương ứng. Hibernate là một giải pháp ORM rất mạnh và linh động để ánh xạ các lớp Java tới các bảng trong cơ sở dữ liệu. Hibernate bản thân nó đã được đảm bảo tính nhất quán bằng cách sử dụng các file XML giúp cho người lập trình không phải viết code như đối với JDBC.

2. Transparent Persistence

Việc tự động ánh xạ các đối tượng Java với các bảng trong cơ sở dữ liệu được gọi là Transparent Persistence. Hibernate hỗ trợ persistence trong suốt và người lập trình không cần viết code một cách rõ ràng để ánh xạ các bảng trong cơ sở dữ liệu tới các đối tượng trong ứng dụng trong khi tương tác với RDBMS.

3. Hỗ trợ ngôn ngữ truy vấn

JDBC chỉ hỗ trợ ngôn ngữ SQL truyền thống. Người lập trình sẽ phải tìm những cách thức phù hợp nhất để truy xuất cơ sở dữ liệu. Hibernate hỗ trợ ngôn ngữ truy vấn mạnh mẽ là HQL, một ngôn ngữ có đầy đủ các tính năng như ngôn ngữ SQL và những phần mở rộng khác giúp cho giải quyết các vấn đề truy vấn phức tạp.

4. Database dựa vào code

Ứng dụng sử dụng JDBC để xử lý dữ liệu persistent sẽ có số lượng code rất lớn. Đó là những mã lệnh để ánh xạ dữ liệu bảng tới đối tượng của ứng dụng. Khi một bảng bị thay đổi hoặc database có sự thay đổi thì số lượng code phải

Page 44: 101005641-Do-an

thay đổi theo sẽ rất lớn và phức tạp. Hibernate hỗ trợ ánh xạ ngay trong bản thân nó. Những ánh xạ giữa các bảng và các đối tượng ứng dụng được thồn qua các file XML. Nếu có bất cứ sự thay đổi nào trong database hay các bảng thì ta chỉ cần thay đổi thuộc tính của file XML.

5. Giảm chi phí bảo trì

Với JDBC, người lập trình sẽ phải xử lý các result set và chuyển đổi nó thành các đối tượng Java để có thể sử dụng dữ liệu persistent trong ứng dụng. Vì vậy với JDBC, việc ánh xạ giữa các đối tượng Java và các bảng trong database là công việc thủ công. Hibernate giảm thiểu các dòng mã lệnh bằng cách duy trì việc ánh xạ object-table ngay trong nó và trả kết quả về ứng dụng thông qua các lớp Java. Nó giúp các lập trình viên giảm bớt gánh nặng xử lý thủ công đối với dữ liệu persistent, do vậy làm giảm thời gian phát triển và chi phí bảo trì.

6. Thực hiện tối ưu

Các dữ liệu được giữ lại trong bộ đệm, sử dụng trong ứng dụng để giảm thiểu quá trình truy xuất đĩa cứng. Hibernate, với transparent persistence, bộ đệm được thiết lập trong không gian làm việc của ứng dụng. Các relational tuple được đưa vào bộ đệm như là một kết quả của truy vấn. Nó giúp cải thiện tốc độ thực thi nếu ứng dụng client đọc các dữ liệu giống nhau ở nhiều thời điểm và ghi nhiều lần.

7. Mã nguồn mở và hoàn toàn miễn phí

Hibernate là dự án mã nguồn mở và miễn phí sử dụng cho cả quá trình phát triển lẫn triển khai sản phẩm.

8. Độ tin cậy cao và dễ mở rộng phạm vi

Phạm vi áp dụng Hibernate thích hợp trong bất cứ môi trường nào. Không có vấn đề gì nếu sử dụng nó với mạng Intranet với hàng trăm nghìn server. JDBC không thể dễ dàng làm được điều này.

Nhược điểm :

1. Sử dụng Hibernate là không khả thi với các ứng dụng :

• Đơn giản, sử dụng một database và không có sự thay đổi.

• Cần đưa dữ liệu tới các bảng trong database mà không dùng đến các truy vấn SQL.

• Không có các đối tượng được ánh xạ tới hai bảng khác nhau.

Hibernate có nhiều tầng và tương đối phức tạp. Vì vậy, đối với các loại ứng dụng trên thì giải pháp sử dụng JDBC là lựa chọn tốt nhất.

2. Sự hỗ trợ Hibernate trên Internet là chưa đủ.

3. Bất cứ ai muốn duy trì ứng dụng sử dụng Hibernate sẽ cần phải hiểu về Hibernate.

4. Đối với dữ liệu phức tạp, việc ánh xạ từ đối tượng tới các bảng không làm giảm thời gian thực hiện và có thể làm tăng thời gian chuyển đổi.

Page 45: 101005641-Do-an

5. Hibernate không cho phép một số kiểu truy vấn được hỗ trợ trong JDBC. Ví dụ, nó không cho phép insert nhiều đối tượng (persistent data) tới các bảng đồng thời sử dụng một câu truy vấn. Người lập trình sẽ phải viết nhiều câu truy vấn để insert mỗi đối tượng.

II.4. Spring framework

II.4.1. Lịch sử hình thành

Spring là một application framework mã nguồn mở, được giới thiệu vào năm 2002. Rod Johnson đã đưa ra ý tưởng này từ kinh nghiệm làm việc với kiến trúc J2EE.

Ông đã viết cuốn sách với tiêu đề : “J2EE Development without EJB” để giới thiệu khái niệm trình chứa hạng nhẹ (lightweight container) với lý luận : EJB có giá trị của nó nhưng không phải lúc nào cũng cần thiết và phù hợp cho tất cả ứng dụng.

Theo Rod Johnson thì EJB không phức tạp nhưng nó cố gắng cung cấp giải quyết cho các vấn đề phức tạp. EJB được phát triển chính cho các giao dịch, đối tượng được phân phát ở trên các máy khác. Nhưng một số Enterprise Project không có mức độ phức tạp và vẫn sử dụng EJB và thậm chí các ứng dụng đơn giản lại trở nên phức tạp. Trong trường hợp này thì Spring là một lựa chọn.

Các framework phổ biến khác như Struts, JSF, Tapestry …là các framwork tốt cho tầng Web nhưng khi chúng ta sử dụng framework này, chúng ta phải cung cấp thêm framework khác để giải quyết tầng enterprise mà tích hợp tốt với các framework này. Spring làm giảm bớt vấn đề này bằng cách cung cấp một framework toàn diện bao gồm :

• Core bean container

• MVC framework

• AOP integration framework

• JDBC integration framework

• EJB integration framework

Các mặt mạnh trong kiến trúc Spring bao gồm :

Spring tổ chức các tầng trung gian một cách hiệu quả, mà không quan tâm liệu người dùng có sử dụng EJB hay không. Spring sẽ thăm dò xem có nên để người dùng tự quyết định nếu người dùng chỉ dùng Struts hoặc các framework khác với các API của J2EE. Và thành phần được coi là quan trọng nhất trong tầng trung gian, các dịch vụ quản lý cấu hình của Spring có thể đưa vào một tầng kiến trúc nào đó của một môi trường thực thi bất kỳ.

Spring sẽ giúp loại bỏ tình trạng lan tràn Singleton trong nhiều dự án. Theo một số nhà nghiên cứu, đây là một vấn đề lớn, làm suy giảm khả năng kiểm thử và tính hướng đối tượng.

Spring sẽ khiến cộng đồng dần quên đi nhu cầu sử dụng các định dạng file thuộc tính thiết kế thông qua việc quản lý cấu hình nhất quán trong các ứng dụng và các dự án. Với IoC (Inversion of Control) và DI (Dependency

Page 46: 101005641-Do-an

Injection), người dùng chỉ cần quan sát các thuộc tính JavaBean của lớp cho các tham số khởi tạo mà không cầ phải đọc Javadoc hay mã nguồn.

Spring giúp công việc lập trình trở nên hiệu quả hơn bằng cách giảm chi phí lập trình giao diện, mà không phải là các lớp.

Spring được thiết kế để các ứng dụng phụ thuộc ở mức tối thiểu vào các hàm API. Phần lớn các đối tượng giao dịch trong các ứng dụng Spring đều không có sự phụ thuộc nào vào Spring.

Các ứng dụng xây dựng trên nền Spring rất dễ kiểm thử đơn vị.

Spring biến việc sử dụng EJB là một tùy chọn thay vì là thành phần bắt buộc trong kiến trúc ứng dụng. Người dùng có thể chọn cài đặt các chuẩn thương mại như POJO hoặc EJB cục bộ mà không ảnh hưởng tới mã gọi.

Spring còn trợ giúp giải quyết nhiều vấn đề mà không cần EJB. Spring cung cấp một công cụ thay thế EJB phù hợp với các ứng dụng. Ví dụ, Spring sử dụng AOP để phân phối các quản lý khai báo mà không dùng container EJB, thậm chí không cần JTA, nếu chỉ cần làm việc với một cơ sở dữ liệu.

Spring cung cấp một framework nhất quán để truy cập cơ sở dữ liệu, dù người dùng sử dụng JDBC hay một số sản phẩm ánh xạ O/R như TopLink, Hibernate hoặc một cài đặt JDO.

Spring sử dụng một mô hình lập trình đơn giản, nhất quán trong nhiều lĩnh vực, biến công cụ này trở thành một “loại hồ gắn kết” kiến trúc lý tưởng. Có thể thấy rõ điều này khi so sánh với với JDBC, JMS, JavaMail, JNDI và nhiều hàm API quan trọng khác.

II.4.2. Các thành phần trong Spring

Spring framework có thể được xem như một kiến trúc chứa 7 module. Chắc năng của mỗi thành phần như sau :

1. Core container:

Core container cung cấp các chức năng cơ bản của Spring. Thành phần chính của nó là BeanFactory, một cài đặt của Factory Pattern. BeanFactory áp dụng IoC pattern để đặc tả sự phụ thuộc từ code của ứng dụng.

2. Spring Context/Application Context

Spring context là một file cấu hình để cung cấp thông tin ngữ cảnh của Spring. Spring context cung cấp các service như JNDI access, EJB integration, e-mail, internalization, validation, và scheduling functionality.

Page 47: 101005641-Do-an

Hình II.8 Các module trong Spring

3. Spring AOP (Aspect-Oriented):

Spring AOP module tích hợp chức năng lập trình hướng khía cạnh vào Spring framework thông qua cấu hình của nó. Spring AOP module cung cấp các dịch vụ quản lý giao dịch cho các đối tượng trong bất kỳ ứng dụng nào sử dụng Spring. Với Spring AOP, chúng ta có thể sử dụng tích hợp declarative transaction management vào trong ứng dụng mà không cần dựa vào EJB component.

Spring AOP module cũng đưa lập trình metadata vào trong Spring. Sử dụng cái này chúng ta có thể thêm annotation vào mã nguồn để hướng dẫn Spring nơi và làm thế nào để liên hệ với aspect.

4. Spring DAO

Tầng JDBC và DAO đưa ra một cây phân cấp exception để quản lý kết nối đến database, điều khiển exception và thông báo lỗi thông qua vendor của database. Tầng exception đơn giản điều khiển lỗi và giảm khối lượng code mà chúng ta cần viết như mở và đóng kết nối. Module này cũng cung cấp các dịch vụ quản lý giao dịch cho các đối tượng trong ứng dụng Spring.

5. Spring ORM

Spring có thể tích hợp với một vài ORM framework để cung cấp Object Relation tool bao gồm : JDO, Hibernate, OJB và iBatis SQL Maps.

6. Spring web module

Nằm trên application context module, cung cấp context cho các ứng dụng Web. Spring cũng hỗ trợ tích hợp với Struts, JSF và WebWork. Web module cũng làm giảm bớt các công việc điều khiển request và gắn các tham số của request vào các đối tượng domain.

7. Spring MVC Framework

MVC framework cài đặt đầy đủ các đặc tính của MVC pattern để xây dựng các ứng dụng web. MVC framework cấu hình thông qua giao diện và chứa đựng một

Page 48: 101005641-Do-an

số kỹ thuật view bao gồm : JSP, Velocity, Tiles và generation of PDF và Excel file.

II.4.4. Cấu hình Spring

Người dùng Spring thường cấu hình ứng dụng của họ trong các file XML định nghĩa bean. Thẻ gốc của một tài liệu XML định nghĩa bean là <bean>. Thành phần <beans> chứa một hoặc nhiều định nghĩa <bean>. Chúng ta thường chỉ ra lớp và thuộc tính của từng định nghĩa bean. Chúng ta cũng phải xác định id – đây sẽ là tên sử dụng khi tham chiếu đến bean trong mã chương trình.

Hãy xem xét một ví dụ đơn giản thực hiện việc cấu hình 3 đối tượng ứng dụng với các mối quan hệ thường thấy trong các ứng dụng J2EE:

• Một J2EE DataSource

• Một DAO sử dụng DataSource

• Một đối tượng nghiệp vụ sử dụng DAO trong quá trình làm việc

Trong ví dụ dưới đây, chúng ta sử dụng một BasicDataSource từ dự án Jakarta Commons DBCP. (ComboPooledDataSource từ dự án C3PO cũng là một lựa chọn tốt). Cũng giống như các lớp sẵn có khác, BasicDataSource có thể dễ dàng được sử dụng trong một Spring bean factory vì nó có thể được cấu hình theo kiểu JavaBean. Phương thức close cần được gọi để shutdown được đăng ký thông qua thuộc tính “destroy-method” của Spring nhằm tránh cho BasicDataSource không phải cài đặt bất kỳ giao diện Spring nào.

<beans> <bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/mydb" /> <property name="username" value="someone" /></bean>

Tất cả các thuộc tính của BasicDataSource mà chúng ta chèn vào là các String, vì vậy, chúng ta chỉ ra giá trị của chúng bằng thuộc tính “value”. (Cách làm ngắn gọn này được giới thiệu trong Spring 1.2. Nó là một cách thay thế tiện lợi cho phần tử con <value> - rất hữu ích cho các giá trị mà thuộc tính XML gặp khó khăn trong việc định nghĩa). Spring sử dụng cơ chế JavaBean PropertyEditor chuẩn để chuyển đổi các biểu diễn String thành các kiểu khác khi cần thiết.

Bây giờ, chúng ta định nghĩa DAO, gồm một bean tham chiếu tới DataSource. Các mối quan hệ giữa các bean được chỉ ra bằng cách sử dụng thuộc tính “ref” hay phần tử <ref>:

<bean id="exampleDataAccessObject" class="example.ExampleDataAccessObject"> <property name="dataSource" ref="myDataSource" /> </bean>

Page 49: 101005641-Do-an

Đối tượng nghiệp vụ có một tham chiếu tới DAO, và một thuộc tính kiểu int (exampleParam). Trong trường hợp này, chúng ta sử dụng cú pháp phần tử con quen thuộc với những người đã từng sử dụng các phiên bản Spring trước:

<bean id="exampleBusinessObject" class="example.ExampleBusinessObject">

<property name="dataAccessObject"> <ref bean="exampleDataAccessObject"/>

</property> <property name="exampleParam"> <value>10</value> </property></bean>

Các mối quan hệ giữa các đối tượng thường được thiết lập một cách tường minh trong cấu hình. Tuy nhiên, Spring cũng cung cấp cái mà chúng ta gọi là hỗ trợ “autowire”, trong đó chỉ ra các phụ thuộc giữa các bean. Hạn chế của việc này – cũng như với PicoContainer – là nếu có nhiều bean thuộc một kiểu cụ thể thì không thể tìm ra thực thể mà phụ thuộc của kiểu đó áp dụng cho. Về mặt tích cực, các phụ thuộc không thoả mãn có thể được phát hiện khi khởi tạo factory. (Spring cũng cung cấp một cơ chế kiểm tra phụ thuộc tùy chọn cho cấu hình tường minh để đạt được mục đích này).

Chúng ta có thể sử dụng tính năng autowire như sau, nếu không muốn viết mã tường minh cho các mối quan hệ này:

<bean id="exampleBusinessObject"class="example.ExampleBusinessObject" autowire="byType">

<property name="exampleParam" value="10" /></bean>

Như vậy, với cách này, Spring sẽ tìm ra thuộc tính dataSource của exampleBusinessObject cần được thiết lập cho cài đặt của DataSource mà nó tìm thấy trong biểu diễn BeanFactory. Sẽ phát sinh lỗi nếu không có, hoặc có nhiều hơn một bean của kiểu yêu cầu trong biểu diễn BeanFactory. Chúng ta vẫn cần thiết lập thuộc tính exampleParam, vì nó không phải là một tham chiếu.

Hãy chú ý tới các bộ thiết lập thuộc tính (property setter) trong các lớp nghiệp vụ - tương ứng với các tham chiếu XML trong tài liệu định nghĩa bean. Chúng được gọi bởi Spring trước khi đối tượng được sử dụng.

Lưu ý rằng các thuộc tính JavaBean không được khai báo trên các giao diện nghiệp vụ mà các đối tượng gọi làm việc với. Chúng là một cài đặt chi tiết. Chúng ta có thể dễ dàng “plug-in” các lớp cài đặt khác nhau với các thuộc tính bean khác nhau mà không làm ảnh hưởng tới các đối tượng hay lời gọi liên quan.

II.4.5. Ưu điểm của Spring

Quản lý phiên. Spring giúp kiểm soát hiệu quả, dễ dàng, và an toàn các đơn vị công việc như các phiên làm việc Hibernate hay TopLink. Mã liên quan chỉ sử dụng riêng công cụ ORM thường cần phải sử dụng kèm một đối tượng “Session” để kiểm soát tính hiệu quả và giao dịch thích hợp. Spring có thể tạo mới và liên kết một phiên tới luồng hiện tại một cách trong suốt, bằng cách sử dụng hoặc hướng tiếp cận kiểu lá chắn AOP, hoặc sử dụng một lớp bao

Page 50: 101005641-Do-an

“template” tường minh tại mức mã Java. Do vậy, Spring giải quyết được nhiều vấn đề liên quan tới sử dụng ảnh hưởng tới nhiều người dùng của công nghệ ORM.

Quản lý tài nguyên. Các ngữ cảnh ứng dụng (application context) Spring có thể kiểm soát vị trí và cấu hình của các Hibernate SessionFactories, các nguồn dữ liệu JDBC cũng như các nguồn tài nguyên liên quan khác. Do vậy, Spring Framework cho phép các giá trị này được dễ dàng quản lý và thay đổi.

Quản lý giao dịch tích hợp. Spring cho phép bạn bao mã ORM bằng một lá chắn phương thức AOP, hoặc một lớp bao “template” tường minh tại mức mã Java. Trong bất kỳ trường hợp nào, ngữ nghĩa giao dịch đều được kiểm soát giúp bạn, và việc kiểm soát giao dịch thích hợp trong trường hợp xảy ra các ngoại lệ cũng được quan tâm. Như chúng ta sẽ đề cập sau đây, bạn cũng nhận được lợi ích của khả năng sử dụng và tráo đổi các bộ quản lý giao dịch khác nhau, mà không bị ảnh hưởng tới mã ORM liên quan. Ngoài ra, một lợi ích khác mà Spring đem lại là mã JDBC liên quan có thể hoàn toàn tích hợp với mã ORM, trong hầu hết các công cụ hỗ trợ ORM. Điều này rất hữu ích cho việc kiểm soát tính năng không tuân theo ORM.

Bao đóng ngoại lệ. Như được đề cập ở trên, Spring có thể bao đóng các ngoại lệ từ tầng ORM, chuyển đổi chúng từ các ngoại lệ độc quyền của các hãng thành một tập các ngoại lệ trừu tượng thời gian chạy. Điều này cho phép bạn kiểm soát hầu hết các ngoại lệ bền bỉ nhất, đó là những ngoại lệ không có khả năng khôi phục, chỉ ở trong các tầng thích hợp, mà không làm ảnh hưởng tới các cụm catch/throw và các khai báo ngoại lệ được sử dụng thường xuyên. Bạn có thể vẫn bẫy và kiểm soát các ngoại lệ ở bất kỳ nơi nào cần thiết. Lưu ý rằng các ngoại lệ JDBC (bao gồm cả các đặc trưng cụ thể của DB) cũng được chuyển đổi tới cùng hệ thống cấp bậc, nghĩa là bạn có thể thực hiện một số thao tác với JDBC bên trong một mô hình lập trình nhất quán.

Tránh sự bó buộc của các nhà cung cấp. Các giải pháp ORM có các đặc tính hiệu năng khác, và không có giải pháp nào thỏa mãn được tất cả. Thay vào đó, bạn có thể sẽ nhận thấy rằng tính năng cụ thể lại không phù hợp với một cài đặt sử dụng công cụ ORM của bạn. Vì vậy, một giải pháp khôn ngoan là tách kiến trúc của bạn khỏi các cài đặt phụ thuộc công cụ. Nếu bạn cần chuyển tới một cài đặt khác vì các lý do liên quan tới chức năng, hiệu năng, hay các mối quan tâm khác, thì việc sử dụng Spring hiện tại có thể khiến việc chuyển đổi được dễ dàng hơn rất nhiều. Sự trừu tượng của Spring trong Transactions và Exceptions của công cụ ORM, cùng với hướng tiếp cận IoC cho phép bạn dễ dàng chuyển đổi trong các đối tượng ánh xạ/DAO cài đặt chức năng truy cập dữ liệu khiến nó dễ cô lập tất cả các mã phụ thuộc vào ORM cụ thể trong một lĩnh vực của ứng dụng mà không làm ảnh hưởng tới sức mạnh của công cụ ORM. Ứng dụng mẫu PetClinic đi kèm với Spring demo lợi ích của tính khả chuyển mà Spring đem lại thông qua việc cung cấp các biến sử dụng JDBC, Hibernate, TopLink và Apache OJB để cài đặt tầng tồn tại lâu dài (pesistence layer).

Dễ dàng kiểm thử. Sự chuyển đổi hướng tiếp cận điều khiển của Spring khiến nó dễ dàng chuyển đổi cài đặt và vị trí của nguồn tài nguyên như các session factory của Hibernate, các nguồn dữ liệu, trình quản lý giao diện, và các

Page 51: 101005641-Do-an

cài đặt đối tượng ánh xạ (nếu cần thiết). Việc này giúp dễ dàng hơn rất nhiều trong việc cô lập và kiểm thử từng đoạn mã liên quan một cách tách biệt.

Page 52: 101005641-Do-an

CHƯƠNG III : XÂY DỰNG ỨNG DỤNG TUYỂN DỤNG

III.1. Giới thiệu bài toán tuyển dụng

III.1.1. Mục đích

Hiện nay, nền kinh tế nước ta đang trong quá trình hội nhập, các công ty, doanh nghiệp cũng bước vào giai đoạn cạnh tranh khốc liệt hơn. Nhu cầu về nguồn nhân lực có chuyên môn tốt, kỹ năng cao đang là vấn đề rất quan trọng. Tuy vậy, các công ty hay doanh nghiệp gặp khá nhiều khó khăn trong quá trình tìm kiếm các ứng viên đủ các điều kiện cần thiết cho công việc của mình. Rất nhiều công ty đã phải tuyển các nhân viên về và phải trải qua quá trình training tương đối dài thì những nhân viên đó mới đáp ứng được với yêu cầu công việc. Điều này gây lãng phí về thời gian, công sức và tiền bạc. Do vậy, họ rất muốn có hệ thống mà có thể giúp họ tìm kiếm được các ứng viên có đủ năng lực cũng như chuyên môn đáp ứng được ngay với công việc. Ngược lại, đối với những người đang tìm kiếm công việc phù hợp, họ cũng rất cần một hệ thống có thể giúp họ tìm những công ty, doanh nghiệp một cách nhanh chóng, hiệu quả đáp ứng được các yêu cầu của họ. Hệ thống tuyển dụng trực tuyến xây dựng với mục đích là cầu nối giữa các doanh nghiệp và các ứng viên, nó giúp cho hai bên có thể tìm kiếm thông tin về nhau một cách nhanh chóng, linh hoạt, thuận tiện.

III.1.2. Mục tiêu của hệ thốngMục tiêu của hệ thống là dịch vụ cho hai nhân tố chính : nhà tuyển dụng và ứng viên (người tìm việc).

Đối với nhà tuyển dụng: Nhà tuyển dụng sử dụng hệ thống để cập nhật thông tin về công ty mình, đưa ra các thông báo tuyển dụng đến công chúng. Ngoài ra, nhà tuyển dụng còn sử dụng hệ thống để tìm kiếm các ứng viên phù hợp với yêu cầu công việc của mình, gửi lời mời đến ứng viên và nếu ứng viên chấp nhận có thể hẹn gặp phỏng vấn và trao đổi các thỏa thuận cần thiết. Đối với ứng viên trong hệ thống mà hiện đang thuộc công ty mình, nhà tuyển dụng có thể đưa ra các đánh giá về họ, thông qua đó những nhà tuyển dụng khác có thể biết thêm các thông tin cần thiết về người mà mình đang quan tâm.

Đối với các ứng viên: Với các ứng viên đang tìm kiếm một công việc phù hợp. Họ có thể sử dụng hệ thống để cập nhật các thông tin về bản thân, các kinh nghiệm, kỹ năng và các dự án đã và đang tham gia (cập nhật CV). Các ứng viên ngoài chức năng tìm kiếm các công ty, doanh nghiệp thỏa mãn yêu cầu của mình, họ có thể tìm kiếm các ứng viên khác và lưu vào danh bạ bạn bè (có thể cho mục đích kết bạn hoặc chia sẻ kinh nghiệm trong công việc).

Đối với những khách thông thường : Họ có thể sử dụng hệ thống để tìm kiếm các công việc thông thường và xem các thông tin mà hệ thống cung cấp. Họ có thể đăng ký tài khoản của một ứng viên hoặc liên hệ với người quản trị để trả một chi phí nhất định để có một tài khoản của một nhà tuyển dụng.

Page 53: 101005641-Do-an

III.2. Phân tích bài toán tuyển dụng

III.2.1. Những yêu cầu về chức năng

III.2.1.1. Đối tượng người dùng và các chức năng

Đối tượng sử dụng hệ thống bao gồm 4 nhóm chính :

Nhóm quản trị : Có vai trò quản trị tài nguyên hệ thống, quản lý thông tin về các nhóm khác.

Nhóm các nhà tuyển dụng : Sử dụng hệ thống để quản lý tin tức, thông tin tuyển dụng của công ty mình, tìm kiếm ứng viên.

Nhóm nhà quảng cáo : Sử dụng hệ thống để quảng cáo thông tin về công ty mình.

Nhóm các ứng viên : Có chức năng quản lý thông tin cá nhân, tìm kiếm các công ty tuyển dụng, quản lý blog và liên kết bạn bè.

Hình III.1. Các nhóm sử dụng hệ thống

Sơ đồ phân rã các chức năng :

Page 54: 101005641-Do-an

Recruitment System

Admin(Quản trị )

Advertiser(Người quảng cáo )

Company(Nhà tuyển dụng )

Candidate(Ứng viên)

QL hệ thống

QL Advertiser

Thêm

Sửa

Xóa

QL Company

Thêm

Sửa

Xóa

QL Candidate

Thêm

Sửa

Xóa

QL tài khoản

Thêm quảng cáo

Sửa quảng cáo

Xóa quảng cáo

QL tài khoản

Cập nhật thông tin

Đăng thông báo

Tìm ứng viên

Gửi email liên hệ

Lưu các ứng viên mà mình quan

tâm(bookmarks )

QL tài khoản

Cập nhật CV, thông tin khác

Tự ứng tuyển (email liên hệ đến

company)

Tìm kiếm

Tìm ứng viên

Tìm Company

Bookmarks

Các công ty mình quan tâm

Các ứng viên khác

QL tin tức

QL Blog

Kiết xuất Báo cáo

Kiết xuất Báo cáo

Hình III.2 Sơ đồ phân rã chức năng

III.2.1.2. Biểu đồ các Use Case

III.2.1.2.1. Actor: Admin (Người quản trị)

Chức năng quản lý Advertiser :

Page 55: 101005641-Do-an

Hình III.3 Use Case Admin quản lý Advertiser

Chức năng quản lý Advertisment :

Page 56: 101005641-Do-an

Hình III.4 Use Case Admin quản lý Advertisment

Chức năng quản lý Candidate :

Page 57: 101005641-Do-an

Hình III.5 Use Case Admin quản lý Candidate

Chức năng quản lý Company :

Page 58: 101005641-Do-an

Hình III.6 Use Case Admin quản lý Company

Chức năng quản lý News :

Page 59: 101005641-Do-an

Hình III.7 Use Case Admin quản lý News

III.2.1.2.2. Actor: Company (Nhà tuyển dụng)

Chức năng quản lý thông tin cá nhân :

Page 60: 101005641-Do-an

Hình III.8 Use Case Company quản lý Profile

Chức năng quản lý tin tức :

Hình III.9 Use Case Company quản lý tin tức

Chức năng quản lý thông tin tuyển dụng :

Page 61: 101005641-Do-an

Hình III.10 Use Case Company quản lý thông tin tuyển dụng

III.2.1.2.3. Actor: Advertiser (Nhà quảng cáo)

Chức năng quản lý quảng cáo :

Page 62: 101005641-Do-an

Hình III.11 Use Case Advertiser quản lý quảng cáo

III.2.1.2.4. Actor: Candidate (Ứng viên)

Chức năng quản lý thông tin cá nhân :

Hình III.12 Use Case Candidate quản lý Profile

Page 63: 101005641-Do-an

Chức năng quản lý Friends :

Hình III.13 Use Case Candidate quản lý Friends

Chức năng quản lý Blog :

Page 64: 101005641-Do-an

Hình III.14 Use Case Candidate quản lý Blog

Như vậy, có thể tổng kết lại hệ thống có các chức năng chính sau :

Với vai trò của Admin:

• Công nhận Admin

• Quản lý Advertiser

• Quản lý Advertisment

• Quản lý Candidate

• Quản lý Company

• Quản lý News

Với vai trò của nhà tuyển dụng:

• Công nhận Company

• Quản lý thông tin cá nhân

Page 65: 101005641-Do-an

• Quản lý tin tức

• Quản lý thông tin tuyển dụng

Với vai trò của nhà quảng cáo:

• Công nhận Advertiser

• Quản lý thông tin quảng cáo

Với vai trò của ứng viên:

• Công nhận Candidate

• Quản lý thông tin cá nhân

• Quản lý Friends

• Quản lý Blog

III.2.2. Lựa chọn giải pháp công nghệ

Từ những phân tích về yêu cầu thực tế của bài toán, hệ thống cần xây dựng có tính cộng đồng, tương tác cao giữa những người sử dụng. Do vậy, giải pháp sử dụng môi trường Web là lựa chọn tối ưu nhất. Chỉ có trên môi trường Web, các nhà tuyển dụng mới có thể dễ dàng tìm kiếm thông tin về các ứng viên, quản lý tin tức và đưa ra các thông tin tuyển dụng. Với việc sử dụng môi trường Web, mức độ lan truyền thông tin là vô cùng lớn và các nhà tuyển dụng có thể dễ dàng đạt được những mục đích mà mình mong muốn. Môi trường Web còn là một lựa chọn tốt cho các nhà quảng cáo muốn quảng bá, thông tin, hình ảnh của công ty mình. Đối với các ứng viên, những người có nhu cầu tìm những công việc mà mình mong muốn thì môi trường Web cũng là một hình thức giúp cho họ có thể tìm kiếm được các thông tin một cách nhanh chóng và hiệu quả. Thông qua hệ thống Web này, các ứng viên có thể liên kết bạn bè và quản lý nhật ký cá nhân.

Với việc lựa chọn môi trường Web, công nghệ mà tác giả muốn áp dụng cho hệ thống là công nghệ Web 2.0 kết hợp với công nghệ Web của Java là Struts và Hibernate. Với việc sử dụng ngôn ngữ Java, hệ thống sẽ được tăng cường tính an toàn, bảo mật. Ngoài ra, đây là ngôn ngữ đa nền, có thể chạy trên nhiều hệ điều hành khác nhau. Sử dụng công nghệ Struts và Hibernate sẽ giúp hệ thống được xây dựng theo mô hình MVC (đây là mô hình chuẩn mà nhiều công ty, doanh nghiệp lớn thường áp dụng trong quá trình phát triển phần mềm). Với việc tuân theo mô hình MVC, hệ thống sẽ nâng cao tính ổn định, tính đáp ứng cao, dễ nâng cấp và bảo trì.

III.2.2.1. Bảng chi tiết các chức năng Mã chức

năngTên chức năng Mô tả

Chức năng chung F001 LogIn

Cho phép người dùng hợp lệ đăng nhập vào hệ thống.

F002 LogOutCho phép người dùng thoát khỏi hệ thống bất kì lúc nào.

F003 Add News Admin và nhà tuyển dụng có thể thêm mới tin tức.

F004 Edit News Admin và nhà tuyển dụng có thể biên tập lại nội dung tin tức.

Page 66: 101005641-Do-an

F005 Delete NewsCho phép Admin và nhà tuyển dụng có thể xóa nội dung tin tức.

F006 Add AdvertismentAdmin và nhà quảng cáo thêm mới nội dung quảng cáo

F007 Edit AdvertismentThay đổi nội dung quảng cáo (thuộc quyền của Admin và nhà quảng cáo tương ứng).

F008 Delete AdvertismentXóa nội dung quảng cáo (thuộc quyền của Admin và nhà quảng cáo tương ứng).

F009 Edit Profile

Chức năng Edit Profile áp dụng chung cho Admin, nhà tuyển dụng, nhà quảng cáo và ứng viên, cho phép họ có quyền thay đổi thông tin cá nhân của mình.

Admin

F010 Add UserChức năng cho phép Admin tạo mới tài khoản cho người dùng.

F011 Edit UserChức năng cho phép Admin thay đổi thông tin tài khoản người dùng, thay đổi quyền của người dùng.

F012 Delete User Chức năng xóa tài khoản người dùng.

Company

F013 Add Recruitment NoticeChức năng cho phép nhà tuyển dụng thêm mới thông tin tuyển dụng.

F014 Edit Recruitment NoticeNhà tuyển dụng có thể thay đổi lại nội dung thông báo tuyển dụng.

F015 Delete Recruitment Notice

Chức năng cho phép nhà tuyển dụng xóa các thông báo tuyển dụng.

F016 Search CandidateNhà tuyển dụng có thể sử dụng hệ thống để tìm kiếm thông tin về các ứng viên mà mình quan tâm.

F017 Bookmarks Candidate

Khi tìm được các ứng viên mà mình quan tâm, nhà tuyển dụng có thể lưu lại các ứng viên này để sau này có thể liên hệ.

Candidate

F018 Search Candidate

Ứng viên có thể sử dụng hệ thống để tìm kiếm thông tin về các ứng viên khác, thông qua đó, có thể liên kết bạn bè.

F019 Search Company

Ứng viên có thể tìm kiếm các công ty, nhà tuyển dụng mà mình quan tâm, thông qua đó, gửi hồ sơ ứng tuyển.

F020 Bookmarks Company

Sau khi tìm được các công ty hay nhà tuyển dụng mà mình quan tâm, các ứng viên có thể lưu lại để sau này dễ dàng liên hệ.

F021 Blog Individual

Đây là chức năng cá nhân của các ứng viên, họ có thể tạo, chỉnh sửa hoặc xóa các entry trong Blog của mình. Các thông tin trong Blog có thể được comment bởi các thành viên khác.

Bảng 1: Danh sách các chức năng

III.2.2.2. Một số biểu đồ diễn tiến các chức năng :

Chức năng F001: LogIn

Page 67: 101005641-Do-an

Hình III.15 Sơ đồ diễn tiến chức năng LogIn

Chức năng F002: Logout

Hình III.16 Sơ đồ diễn tiến chức năng LogOut

Chức năng F003: Add News

Page 68: 101005641-Do-an

Hình III.17 Sơ đồ diễn tiến chức năng Add News

Chức năng F004: Edit News

Hình III.18 Sơ đồ diễn tiến chức năng Edit News

Chức năng F005: Delete News

Page 69: 101005641-Do-an

Hình III.19 Sơ đồ diễn tiến chức năng Delete News

Chức năng F009: Edit Profile

Hình III.20 Sơ đồ diễn tiến chức năng Edit Profile

Chức năng F010: Add User

Page 70: 101005641-Do-an

Hình III.21 Sơ đồ diễn tiến chức Add User

Chức năng F011: Edit User

Hình III.22 Sơ đồ diễn tiến chức năng Edit User

Chức năng F012: Delete User

Page 71: 101005641-Do-an

Hình III.23 Sơ đồ diễn tiến chức năng Delete User

Chức năng F016: Company Search Candidate

Hình III.24 Sơ đồ diễn tiến chức năng Company Search Candidate

Chức năng F017: Company bookmarks Candidate

Page 72: 101005641-Do-an

Hình III.25 Sơ đồ diễn tiến chức năng Company bookmarks Candidate

Chức năng F021: Blog Individual

Hình III.26 Sơ đồ diễn tiến chức năng Blog Individual

III.3. Thiết kế và cài đặt chương trình

Page 73: 101005641-Do-an

III.3.1. Thiết kế dữ liệu

III.3.1.1. Mô hình quan hệ thực thể

Account Role FunctionBelong to Has

Username

PasswordAccountID RoleIDRoleName

Description

FunctionID

FunctionName

Description

AccountRole RoleFunction

Company

JobType

Province

News

Recruitment Notice

JobTypeIDName

Description

ProvinceID

NamePostalCode

NewsIDTitle

ShortContent

Content

Category

CategoryID

Name

Description

Has

RecNoticeID

JobName

Requirement

Has

Belong to

Do

Has

CompanyID

Name

Description

Advertiser Adver_Content

AdvertiserID

NameLimit Advertisment

AdverContentID Title

Image

Site_UrlHas

CandidateDegree Friend

BlogOccupation

DegreeIDName

OccupationID Name

FriendID

Fiend_of_CandidateID

BlogID

Title

Content

BlogCommentBlogCommentID

Content

Has

Has

Has

Has

Has

CandidateDegree1

N

1

N

N1

1

1N

N

1 N

1

N

1

N

1

1

N

1 N 1 N

1

N

Hình III.27 Mô hình ERD

III.3.1.2. Thiết kế cơ sở dữ liệu

III.3.1.2.1. Bảng Account

Page 74: 101005641-Do-an

Tên trường PK FK Kiều DL Độ dài Ý nghĩa

ACCOUNT_ID О INT 11 Mã của người dùng

LOGIN_NAME VARCHAR 25 Tên đăng nhập của người dùng

LOGIN_PASSWORD VARCHAR 150 Mật khẩu đăng nhập, mã hóa MD5

STATUS TINYINT 1 Trạng thái, 0: Active – 1: Disable

REG_USER INT 11 ID của người đăng ký

UPD_USER INT 11 ID của người cập nhật

REG_DTTM DATETIME Ngày giờ đăng ký

UPD_DTTM DATETIME Ngày giờ cập nhật

Bảng 2: Bảng Account

III.3.1.2.2. Bảng Role

Tên trường PK FK Kiều DL Độ dài Ý nghĩa

ROLE_ID О INT 11 Mã của vai trò

NAME VARCHAR 255 Tên của vai trò

DESCRIPTION VARCHAR 1000 Mô tả vai trò

REG_USER INT 11 ID của người đăng ký

UPD_USER INT 11 ID của người cập nhật

REG_DTTM DATETIME Ngày giờ đăng ký

UPD_DTTM DATETIME Ngày giờ cập nhật

Bảng 3: Bảng Role

III.3.1.2.3. Bảng AccountRole

Tên trường PK FK Kiều DL Độ dài Ý nghĩa

ACCOUNT_ID О О INT 11 Mã của người dùng

ROLE_ID О О INT 11 Mã của vai trò

REG_USER INT 11 ID của người đăng ký

UPD_USER INT 11 ID của người cập nhật

REG_DTTM DATETIME Ngày giờ đăng ký

UPD_DTTM DATETIME Ngày giờ cập nhật

Bảng 4: Bảng AccountRole

III.3.1.2.4. Bảng Function

Tên trường PK FK Kiều DL Độ dài Ý nghĩa

FUNCTION_ID О INT 11 Mã của chức năng

NAME VARCHAR 100 Tên của chức năng

DESCRIPTION VARCHAR 1000 Mô tả chức năng

Page 75: 101005641-Do-an

REG_USER INT 11 ID của người đăng ký

UPD_USER INT 11 ID của người cập nhật

REG_DTTM DATETIME Ngày giờ đăng ký

UPD_DTTM DATETIME Ngày giờ cập nhật

Bảng 5: Bảng Function

III.3.1.2.5. Bảng RoleFunction

Tên trường PK FK Kiểu DL Độ dài Ý nghĩa

ROLE_ID О О INT 11 Mã của vai trò

ACCOUNT_ID О О INT 11 Mã của chức năng

REG_USER INT 11 ID của người đăng ký

UPD_USER INT 11 ID của người cập nhật

REG_DTTM DATETIME Ngày giờ đăng ký

UPD_DTTM DATETIME Ngày giờ cập nhật

Bảng 6: Bảng RoleFunction

III.3.1.2.6. Bảng Advertiser

Tên trường PK FK Kiều DL Độ dài Ý nghĩa

ADVERTISER_ID О О INT 11 Mã của người quảng cáo

NAME VARCHAR 255 Tên người quảng cáo

DESCRIPTION VARCHAR 1000 Mô tả về người quảng cáo

LIMIT_ADVER INT 4 Số lượng quảng cáo được phép

REG_USER INT 11 ID của người đăng ký

UPD_USER INT 11 ID của người cập nhật

REG_DTTM DATETIME Ngày giờ đăng ký

UPD_DTTM DATETIME Ngày giờ cập nhật

Bảng 7: Bảng Advertiser

III.3.1.2.7. Bảng Adver_Content

Tên trường PK FK Kiều DL Độ dài Ý nghĩa

ADVER_ID О INT 11 Mã của quảng cáo

ADVERTISER_ID О INT 11 Mã của người quảng cáo

TITLE VARCHAR 255 Tiêu đề của quảng cáo

IMAGE VARCHAR 255 Đường dẫn tới ảnh(Flash) quảng cáo

SITE_URL VARCHAR 255 Địa chỉ Website

POSITION VARCHAR 2 Vị trí hiển thị quảng cáo

CLICK_COUNT INT 11 Số lượng lượt click vào quảng cáo

START_DATE DATETIME Ngày bắt đầu quảng cáo

END_DATE DATETIME Ngày kết thúc quảng cáo

Page 76: 101005641-Do-an

IS_DISPLAY TINYINT 1 Trạng thái hiển thị quảng cáo

REG_USER INT 11 ID của người đăng ký

UPD_USER INT 11 ID của người cập nhật

REG_DTTM DATETIME Ngày giờ đăng ký

UPD_DTTM DATETIME Ngày giờ cập nhật

Bảng 8: Bảng Adver_Content

III.3.1.2.8. Bảng Job_Type

Tên trường PK FK Kiều DL Độ dài Ý nghĩa

JOB_TYPE_ID О INT 11 Mã của loại công việc

JOB_TYPE_CODE VARCHAR 50 Mã viết tắt

NAME VARCHAR 255 Tên loại công việc

DESCRIPTION VARCHAR 1000 Mô tả loại công việc

PẢRENT_ID INT 11 Mã của danh mục cha

REG_USER INT 11 ID của người đăng ký

UPD_USER INT 11 ID của người cập nhật

REG_DTTM DATETIME Ngày giờ đăng ký

UPD_DTTM DATETIME Ngày giờ cập nhật

Bảng 9: Bảng Job_Type

III.3.1.2.9. Bảng Company

Tên trường PK FK Kiều DL Độ dài Ý nghĩa

COMPANY_ID О INT 11 Mã của công ty

JOB_TYPE_ID О INT 11 Mã loại công việc

PROVINCE_ID О INT 11 Mã tỉnh thành

NAME VARCHAR 300 Tên công ty

WORK_DESCRIPTION TEXT Mô tả công việc

POSTAL_CODE 20 Mã bưu điện

LOGO VARCHAR 255 Logo công ty

SLOGAN VARCHAR 255 Slogan công ty

ADDRESS VARCHAR 1000 Địa chỉ trụ sở chính công ty

BRANCHS TEXT Địa chỉ các chi nhánh khác

PHONE_NUMBER VARCHAR 15 Số điện thoại công ty

FAX_NUMBER VARCHAR 100 Số fax công ty

SITE_URL VARCHAR 255 Địa chỉ Website

EMAIL VARCHAR 255 Địa chỉ email của công ty

FOUNDATION DATETIME Ngày thành lập công ty

REG_USER INT 11 ID của người đăng ký

UPD_USER INT 11 ID của người cập nhật

Page 77: 101005641-Do-an

REG_DTTM DATETIME Ngày giờ đăng ký

UPD_DTTM DATETIME Ngày giờ cập nhật

Bảng 10: Bảng Company

III.3.1.2.10. Bảng Province

Tên trường PK FK Kiều DL Độ dài Ý nghĩa

PROVINCE_ID О INT 11 Mã của tỉnh thành

NAME VARCHAR 255 Tên của tỉnh thành

AREA_CODE VARCHAR 10 Mã bưu điện của tỉnh thành

REG_USER INT 11 ID của người đăng ký

UPD_USER INT 11 ID của người cập nhật

REG_DTTM DATETIME Ngày giờ đăng ký

UPD_DTTM DATETIME Ngày giờ cập nhật

Bảng 11: Bảng Province

III.3.1.2.11. Bảng Category

Tên trường PK FK Kiều DL Độ dài Ý nghĩa

CATEGORY_ID О INT 11 Mã của loại tin

NAME VARCHAR 255 Tên của loại tin

DESCRIPTION VARCHAR 500 Mô tả loại tin

PARENT_ID INT 11 Mã của danh mục cha

ORDER_NO INT 11 Thứ tự hiển thị

REG_USER INT 11 ID của người đăng ký

UPD_USER INT 11 ID của người cập nhật

REG_DTTM DATETIME Ngày giờ đăng ký

UPD_DTTM DATETIME Ngày giờ cập nhật

Bảng 12: Bảng Category

III.3.1.2.12. Bảng News

Tên trường PK FK Kiều DL Độ dài Ý nghĩa

NEWS_ID О INT 11 Mã của tin tức

CATEGORY_ID О INT 11 Mã của loại tin tức

COMPANY_ID О INT 11 Mã của công ty

TITLE VARCHAR 255 Tiêu đề tin tức

SHORT_CONTENT TEXT Nội dung giới thiệu

CONTENT TEXT Nội dung chi tiết

IMG_THUMB VARCHAR 255 Ảnh thu nhỏ

IMG_LARGE VARCHAR 255 Ảnh lớn

VIEW_NUM INT 11 Số lượt xem

Page 78: 101005641-Do-an

ORDER_NO INT 11 Thứ tự hiển thị

AUTHOR VARCHAR 50 Tên tác giả

SOURCE VARCHAR 200 Nguồn tin tức

IS_DISPLAY TINYINT 1 Có phải tin hot không ?

IS_DISPLAY TINYINT 1Trạng thái có hiển thị tin tức không ?

REG_USER INT 11 ID của người đăng ký

UPD_USER INT 11 ID của người cập nhật

REG_DTTM DATETIME Ngày giờ đăng ký

UPD_DTTM DATETIME Ngày giờ cập nhật

Bảng 13: Bảng News

III.3.1.2.13. Bảng Rec_Notice

Tên trường PK FK Kiều DL Độ dài Ý nghĩa

REC_NOTICE_ID О INT 11 Mã của thông báo tuyển dụng

COMPANY_ID О INT 11 Mã của công ty

WORK_TYPE_ID О INT 11 Mã loại hình công việc

PROVINCE_ID О INT 11 Mã tỉnh, thành (Nơi làm việc)

WORK_NAME VARCHAR 255 Tên công việc

WORK_REQUIREMENT TEXT Yêu cầu đối với công việc

WORK_DESCRIPTION TEXT Mô tả công việc

WORK_TIME VARCHAR 255 Thời gian làm việc

SKILL_REQUIREMENT TEXTYêu cầu về kỹ năng, kinh nghiệm

WORK_PLACE VARCHAR 255 Nơi làm việc

SALARY VARCHAR 255 Mức lương

QUOTA VARCHAR 100 Số lượng người cần tuyển

INTEREST TEXT Quyền lợi của ứng viên

PROMISE TEXT Triển vọng thăng tiếns

RECORD_INFO TEXT Thông tin về hồ sơ

REG_DATE DATETIME Ngày đăng tin tuyển dụng

PERIOD_DATE DATETIME Ngày hết hạn tuyển dụng

RECORD_RECEIVER VARCHAR 100 Người nhận hồ sơ

EMAIL_RECEIVER VARCHAR 100 Email người liên hệ

CONTACT_NAME VARCHAR 100 Tên người liên hệ

CONTACT_PHONE VARCHAR 15 Điện thoại liên hệ

CONTACT_ADDRESS VARCHAR 500 Địa chỉ liên hệ

REG_USER INT 11 ID của người đăng ký

UPD_USER INT 11 ID của người cập nhật

REG_DTTM DATETIME Ngày giờ đăng ký

Page 79: 101005641-Do-an

UPD_DTTM DATETIME Ngày giờ cập nhật

Bảng 14: Bảng Rec_Notice

III.3.1.2.14. Bảng Occupation

Tên trường PK FK Kiều DL Độ dài Ý nghĩa

OCCUPATION_ID О INT 11 Mã của nghề nghiệp

OCCUPATION_CODE VARCHAR 10 Mã viết tắt

NAME VARCHAR 255 Tên của nghề nghiệp

DESCRIPTION VARCHAR 1000 Mô tả nghề nghiệp

PẢRENT_ID INT 11 Mã của danh mục cha

REG_USER INT 11 ID của người đăng ký

UPD_USER INT 11 ID của người cập nhật

REG_DTTM DATETIME Ngày giờ đăng ký

UPD_DTTM DATETIME Ngày giờ cập nhật

Bảng 15: Bảng Occupation

III.3.1.2.15. Bảng Candidate

Tên trường PK FK Kiều DL Độ dài Ý nghĩa

CANDIDATE_ID О INT 11 Mã của ứng viên

OCCUPATION_ID О INT 11 Mã của nghề nghiệp

FULLNAME VARCHAR 100 Tên đầy đủ của ứng viên

SEX TINYINT 1 Giới tính: 1 - Nam; 0 - Nữ

BIRTHDAY DATE Ngày sinh

MOBILE VARCHAR 12 Số điện thoại di động

PHONE VARCHAR 15 Số điện thoại cố định

NATIVE_COUNTRY VARCHAR 200 Quê quán của ứng viên

CONTACT_ADDRESS VẢRCHAR 300 Địa chỉ liên hệ

EMAIL VARCHAR 100 Email của ứng viên

WEBSITE VARCHAR 255 Website của ứng viên

BLOG_URL VARCHAR 255 Địa chỉ Blog của ứng viên

FOREIGN_LEVEL VARCHAR 500 Trình độ ngoại ngữ

WORK_HISTORY TEXTCác công ty trước đây đã làm việc

PROJECT_HISTORY TEXT Các dự án lớn đã tham gia

SPEC_SKILL VARCHAR 1000 Kỹ năng chuyên môn

HOBBY VARCHAR 1000 Sở thích cá nhân

SELF_EXPRESSIVE TEXT Tự bạch về bản thân

WORK_EXPECT TEXTCông việc mong muốn trong tương lai

AMBITION TEXT Tham vọng, hoài bão

Page 80: 101005641-Do-an

SALARY_REQUIREMENT VARCHAR 500 Yêu cầu về mức lương

WORK_REQUIREMENT VARCHAR 1000 Yêu cầu về công việc

IMG1 VARCHAR 255 Ảnh cá nhân 1

IMG2 VARCHAR 255 Ảnh cá nhân 2

IMG3 VARCHAR 255 Ảnh cá nhân 3

IS_PUBLISH TINYINT 1Có công khai thông tin CV không ?

REG_USER INT 11 ID của người đăng ký

UPD_USER INT 11 ID của người cập nhật

REG_DTTM DATETIME Ngày giờ đăng ký

UPD_DTTM DATETIME Ngày giờ cập nhật

Bảng 16: Bảng Candidate

III.3.1.2.16. Bảng Degree

Tên trường PK FK Kiều DL Độ dài Ý nghĩa

DEGREE_ID О INT 11 Mã của bằng cấp

NAME VARCHAR 100 Tên của bằng cấp

DESCRIPTION VARCHAR 1000 Mô tả bằng cấp

REG_USER INT 11 ID của người đăng ký

UPD_USER INT 11 ID của người cập nhật

REG_DTTM DATETIME Ngày giờ đăng ký

UPD_DTTM DATETIME Ngày giờ cập nhật

Bảng 17: Bảng Degree

III.3.1.2.17. Bảng Candidate_Degree

Tên trường PK FK Kiều DL Độ dài Ý nghĩa

DEGREE_ID О О INT 11 Mã của bằng cấp

CANDIDATE_ID О О INT 11 Mã của ứng viên

NAME VARCHAR 100 Tên của chuyên ngành bằng cấp

DESCRIPTION VARCHAR 1000 Mô tả về chuyên ngành bằng cấp

REG_USER INT 11 ID của người đăng ký

UPD_USER INT 11 ID của người cập nhật

REG_DTTM DATETIME Ngày giờ đăng ký

UPD_DTTM DATETIME Ngày giờ cập nhật

Bảng 18: Bảng Candidate_Degree

III.3.1.2.18. Bảng Friend

Tên trường PK FK Kiều DL Độ dài Ý nghĩa

FRIEND_ID О INT 11 Mã ID bạn bè

Page 81: 101005641-Do-an

CANDIDATE_ID О INT 11 Mã của ứng viên

FRIEND_OF_CANDIDATE_ID INT 11 Mã bạn của ứng viên

REG_USER INT 11 ID của người đăng ký

UPD_USER INT 11 ID của người cập nhật

REG_DTTM DATETIME Ngày giờ đăng ký

UPD_DTTM DATETIME Ngày giờ cập nhật

Bảng 19: Bảng Friend

III.3.1.2.19. Bảng Blog

Tên trường PK FK Kiều DL Độ dài Ý nghĩa

BLOG_ID О INT 11 Mã của Blog

CANDIDATE_ID О INT 11 Mã của ứng viên

TITLE VARCHAR 255 Tiêu đề của Blog

IMAGE VARCHAR 255 Ảnh của Blog

CONTENT TEXT Nội dung Blog

IS_DISPLAY TINYINT 1 Trạng thái có hiển thị hay không ?

BLOG_DATE DATETIME Ngày viết Blog

REG_USER INT 11 ID của người đăng ký

UPD_USER INT 11 ID của người cập nhật

REG_DTTM DATETIME Ngày giờ đăng ký

UPD_DTTM DATETIME Ngày giờ cập nhật

Bảng 20: Bảng Blog

III.3.1.2.20. Bảng Blog_Comment

Tên trường PK FK Kiều DL Độ dài Ý nghĩa

BLOG_COMMENT_ID О INT 11 Mã của Blog Comment

BLOG_ID О INT 11 Mã của Blog

CANDIDATE_COMMENT_ID INT 1000Mã của ứng viên viết comment

COMMENT_NAME VARCHAR 100Tên của người viết comment

CONTENT TEXT Nội dung viết comment

REG_USER INT 11 ID của người đăng ký

UPD_USER INT 11 ID của người cập nhật

REG_DTTM DATETIME Ngày giờ đăng ký

UPD_DTTM DATETIME Ngày giờ cập nhật

Bảng 21: Bảng Blog_Comment

III.3.1.2.21. Bảng Work_Type

Tên trường PK FK Kiều DL Độ dài Ý nghĩa

Page 82: 101005641-Do-an

WORK_TYPE_ID О INT 11 Mã của loại hình công việc

NAME INT 11 Tên loại hình công việc

DESCRIPTION INT 1000 Mô tả loại hình công việc

REG_USER INT 11 ID của người đăng ký

UPD_USER INT 11 ID của người cập nhật

REG_DTTM DATETIME Ngày giờ đăng ký

UPD_DTTM DATETIME Ngày giờ cập nhật

Bảng 22: Bảng Work_Type

III.3.2. Thiết kế module

Mỗi một trang Web được thiết kế và xây dựng từ các module riêng biệt. Các module được thiết kế dựa trên framework của Struts và Hibernate, sau đó chúng sẽ được tích hợp lại với nhau để tạo nên các chức năng riêng của trang.

Hệ thống tuyển dụng chia làm 2 module chính, đó là module quản trị và module người sử dụng. Sơ đồ các gói module như sau:

Gói module chính :

Hình III.28 Các gói module chính

Module Admin :

Page 83: 101005641-Do-an

Hình III.29 Module admin

Module User :

Hình III.30 Module User

III.3.2.1. Thiết lập môi trường lập trình

Môi trường lập trình được thiết lập cho hệ thống như sau:

- Windows XP, Windows Server 2003

- Web Server : Tomcat 6.0.14 hoặc các phiên bản mới hơn

- Java JDK 1.6

- J2EE 1.4

- IDE Eclipse 3.3 (hoặc MyEclipse 6.0)

- MySQL 5.0.45

- Framework Library : Struts 2.0.11, Hibernate 3.1, Spring 2.5

- UML Design : JUDE Comunity 5.2.1

Page 84: 101005641-Do-an

III.3.2.2. Mô hình thiết kế module

Để thiết kế các module, chúng ta sử dụng mô hình MVC được mô tả như dưới đây :

Hình III.31 Mô hình thiết kế Module theo Struts

Trong đó:

Tầng View : Đây là thành phần hiển thị phía người dùng, giúp người dùng có thể tương tác với hệ thống, nó là thể hiện cho chức năng của các module trong chương trình. Đây là các phần lập trình về JSP, CSS, Javascript, Ajax, TagLib …

Tầng Controller : Đây chính là phần nghiệp vụ xử lý của hệ thống. Có thể nói, đây là “trái tim” của hệ thống. Controller tiếp nhận yêu cầu từ phía người dùng, lựa chọn điều hướng các action, kết hợp với tầng Model xử lý các yêu cầu và hiển thị kết quả ở tầng View tới người sử dụng.

Tầng Model : Đó là các lớp mô hình hóa cơ sở dữ liệu. Thông thường đó là các JavaBean ánh xạ từ các bảng trong cơ sở dữ liệu và được mô hình hóa với các quan hệ hướng đối tượng. Các lớp này được tạo ra với sự hỗ trợ của công cụ Hibernate.

III.3.2.3. Thiết kế tầng Model

Tầng Model bao gồm ba thành phần chính:

Các lớp Java (JavaBean): ánh xạ từ các bảng trong cơ sở dữ liệu. Đây là các lớp thuần Java, chứa các thuộc tính tương ứng với các cột của bảng và các phương thức setter và getter.

Các file xml định nghĩa ánh xạ (*.hbm.xml): Đó là các file xml mô tả việc ánh xạ từ một bảng trong cơ sở dữ liệu thành một đối tượng trong Java, trong đó mô tả rõ sự chuyển đổi tên trường trong bảng thành tên thuộc tính trong đối tượng và sự chuyển đổi kiểu dữ liệu tương ứng.

File cấu hình ánh xạ cơ sở dữ liệu (hibernate.cfg.xml): Đây là file chứa các thông tin để kết nối tới cơ sở dữ liệu, bao gồm: tên cơ sở dữ liệu, tên

Page 85: 101005641-Do-an

username, password truy nhập, tên các file định nghĩa ánh xạ và các thông tin cấu hình khác.

Dưới đây là ví dụ mô tả các thành phần trên (ở đây lấy ví dụ với bảng account là bảng chứa thông tin truy nhập của người dùng):

Lớp JavaBean(Account.java):package vn.rec.domain;

import java.util.Date;import java.util.HashSet;import java.util.Set;

public class Account implements java.io.Serializable {

// Fields

private Integer accountId;private String loginName;private String loginPassword;private Byte status;

// Constructors

/** default constructor */public Account() {}

/** minimal constructor */public Account(Integer accountId, String loginName, String

loginPassword, Byte status) {this.accountId = accountId;this.loginName = loginName;this.loginPassword = loginPassword;this.status = status;

}

// Property accessors

public Integer getAccountId() {return this.accountId;

}

public void setAccountId(Integer accountId) {this.accountId = accountId;

}

public String getLoginName() {return this.loginName;

}

public void setLoginName(String loginName) {this.loginName = loginName;

}

public String getLoginPassword() {return this.loginPassword;

}

public void setLoginPassword(String loginPassword) {this.loginPassword = loginPassword;

}

Page 86: 101005641-Do-an

public Byte getStatus() {return this.status;

}

public void setStatus(Byte status) {this.status = status;

}}

File xml định nghĩa ánh xạ(Account.hbm.xml):<?xml version="1.0" encoding="utf-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><!-- Mapping file autogenerated by MyEclipse Persistence Tools--><hibernate-mapping> <class name="vn.rec.domain.Account" table="account" catalog="recruitment"> <id name="accountId" type="java.lang.Integer"> <column name="account_id" /> <generator class="identity" /> </id> <property name="loginName" type="java.lang.String"> <column name="login_name" length="50" not-null="true" /> </property> <property name="loginPassword" type="java.lang.String"> <column name="login_password" length="150" not-null="true" /> </property> <property name="status" type="java.lang.Byte"> <column name="status" not-null="true" /> </property> <set name="accountRoles" inverse="true"> <key> <column name="account_id" not-null="true" /> </key> <one-to-many class="vn.rec.domain.AccountRole" /> </set> <set name="advertisers" inverse="true"> <key> <column name="advertiser_id" not-null="true" unique="true" /> </key> <one-to-many class="vn.rec.domain.Advertiser" /> </set> <set name="companies" inverse="true"> <key> <column name="company_id" not-null="true" unique="true" /> </key> <one-to-many class="vn.rec.domain.Company" /> </set> <set name="candidates" inverse="true"> <key> <column name="candidate_id" not-null="true" unique="true" /> </key> <one-to-many class="vn.rec.domain.Candidate" />

Page 87: 101005641-Do-an

</set> </class></hibernate-mapping>

File cấu hình(hibernate.cfg.xml):<?xml version='1.0' encoding='UTF-8'?><!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<!-- Generated by MyEclipse Hibernate Tools. --><hibernate-configuration>

<session-factory><property name="connection.username">root</property><property name="connection.url">

jdbc:mysql://localhost:3306/recruitment?useUnicode=true&amp;characterEncoding=UTF-8

</property><property name="dialect">

org.hibernate.dialect.MySQLDialect</property><property name="myeclipse.connection.profile">

MySQL DB</property><property name="hbm2ddl.auto">update</property><property name="connection.password">123456</property><property name="connection.driver_class">

com.mysql.jdbc.Driver</property>

<property name="show_sql">true</property><property name="hibernate.transaction.factory_class">

org.hibernate.transaction.JDBCTransactionFactory</property><mapping resource="vn/rec/domain/AccountRole.hbm.xml" /><mapping resource="vn/rec/domain/Function.hbm.xml" /><mapping resource="vn/rec/domain/Account.hbm.xml" /><mapping resource="vn/rec/domain/Role.hbm.xml" />

</session-factory>

</hibernate-configuration>

III.3.2.4. Thiết kế tầng View

Tầng view bao gồm các file CSS, JavaScript, các file template như JSP, Velocity hoặc FreeMarker… làm nhiệm vụ giao tiếp giữa người dùng với hệ thống. Đó là các thành phần giúp người dùng nhập liệu, gửi yêu cầu tới hệ thống và lấy dữ liệu đã được xử lý ở tầng Controller để trả về phía người dùng. Các file JSP có sử dụng các thư viện thẻ (TagLig) của Struts2 và JSTL để hỗ trợ xử lý cũng như hiển thị dữ liệu.

III.3.2.5. Thiết kế tầng Controller

Tầng Controller được thiết kế bao gồm ba thành phần chính sau :

Các lớp DAO (Data Access Object) : Đây là các lớp truy xuất dữ liệu từ cơ sở dữ liệu thực dựa trên các đối tượng JavaBean đã được ánh xạ quan hệ (là tầng

Page 88: 101005641-Do-an

dưới cùng gần Database nhất). Việc truy xuất dữ liệu bao gồm các thao tác CRUD (Create,Retrive,Update,Delete) và một số thao tác nghiệp vụ khác. Các lớp này thực thi với sự hỗ trợ của ngôn ngữ HQL và quản lý transaction của Spring framework.

Các lớp Service : Đây là tầng nằm trên tầng DAO. Các lớp trong tầng này chủ yếu có nhiệm vụ thực hiện các chức năng nghiệp vụ của hệ thống và nó trực tiếp gọi các lớp xử lý thao tác với cơ sở dữ liệu của tầng DAO.

Các lớp Action : Đây là tầng trên cùng trong tầng nghiệp vụ, nó nằm trên tầng Service và trực tiếp gọi các phương thức của các lớp trong tầng Service để xử lý các yêu cầu từ phía người dùng.

Có thể mô tả cách bố trí và thực thi các tầng như hình vẽ dưới đây :

Action Layer

Service Layer

DAO Layer

Database Server

Hình III.32 Mô hình thiết kế tầng trong Controller

Nguyên tắc thực thi là : Các lớp thuộc tầng trên chỉ có thể truy xuất được đến các lớp ở ngay dưới nó. Ví dụ, Các lớp thuộc tầng Action chỉ có thể truy xuất đến các lớp thuộc tầng Service và các lớp thuộc tầng Service cũng chỉ có thể truy xuất đến các lớp thuộc tầng DAO. Không có thứ tự truy xuất ngược lại từ dưới lên trên.

III.3.2.6. Các file cấu hình hệ thống

Các file cần thiết trong cấu hình hệ thống bao gồm :

File web.xml : Đây là file cấu hình chung của hệ thống, bao gồm các thông tin về việc sử dụng các gói thư viện, định nghĩa và khởi tạo các file cấu hình khác, định dạng unicode, định nghĩa các bộ lọc bảo mật, dọn rác …

File struts.xml : Đây là file cấu hình của Struts framework. Nó có thể khởi tạo các Bean, hằng số và đặc biệt nó ánh xạ các action từ phía người sử dụng đến các lớp và phương thức tương ứng cần xử lý và sau đó là điều hướng hiển thị đến tầng view.

File applicationContext.xml : Đây là file cấu hình của Spring framework. Nó có thể định nghĩa loại kết nối và giao tiếp với cơ sở dữ liệu. Ngoài ra, nó còn chứa thông tin về các Bean trong hệ thống bao gồm các bean về DAO, Service phục vụ cho quá trình xử lý nghiệp vụ từ phía các action.

File tiles.xml : Đây là file cấu hình hỗ trợ cho việc sử dụng layout của tầng view. Việc sử dụng layout giúp chia trang Web thành các thành phần nhỏ hơn và sử dụng lại các thành phần chung. Điều này giúp giảm thiểu lượng code và giúp cho việc lập trình trở nên ngắn gọn, đơn giản và dễ bảo trì.

Page 89: 101005641-Do-an

III.3.3. Thiết kế giao diện Web

Đây là giai đoạn thiết kế các prototype cho trang Web. Nội dung công việc bao gồm xác định giao diện dưới dạng bố cục, các chức năng, các trường hợp sử dụng và sự liên kết giữa các trang trong tổng thể một Web site.

III.3.3.1. Thiết kế giao diện Admin

Giao diện màn hình Login

Hình III.33 Màn hình Login

Giao diện chính

Hình III.34 Màn hình giao diện chính

Giao diện hiển hiển thị danh sách

Page 90: 101005641-Do-an

HEADER

Menu

FOOTER

Function Management Add Cancel

No

Total : 100 First Prev 1 2 3 … 9 Next Last

Name …. ….

…. …. …. …. …. ….

1

2

Hình III.35 Màn hình hiển thị danh sách

Giao diện thêm mới, cập nhật (Popup Windows)

Hình III.36 Màn hình thêm mới, cập nhật

III.3.3.2. Thiết kế giao diện người dùng

Giao diện trang chủ :

Page 91: 101005641-Do-an

Hình III.37 Màn hình giao diện trang chủ

Page 92: 101005641-Do-an

KẾT LUẬN VÀ ĐÁNH GIÁ

Kết quả đạt được

Đồ án này đã đạt được những kết quả cơ bản sau:

Tìm hiểu công nghệ Struts, Hibernate và Spring, kết hợp với Ajax tạo thành một nền tảng trong lập trình ứng dụng Web.

Xây dựng một ứng dụng tuyển dụng với các chức năng cơ bản dựa trên các công nghệ trên.

Đánh giá

Về mặt nghiên cứu công nghệ, sau khi hoàn thành đồ án tác giả đã nắm bắt được các đặc điểm, và vai trò của chúng trong xây dựng ứng dụng Web, biết cách sử dụng và tích hợp ba framework trong một ứng dụng cụ thể. Tuy nhiên, do thời gian tìm hiểu có hạn nên còn nhiều tính năng cũng như kỹ thuật xử lý tác giả còn chưa nắm bắt được.

Về xây dựng bài toán tuyển dụng, ứng dụng đã đạt được một số kết quả nhất định. Do thời gian hạn hẹp và kiến thức của người thiết kế còn nhiều hạn chế nên chương trình còn một số module chưa hoàn thiện cũng như một số module đã xây dựng nhưng chưa được tối ưu. Hy vọng, trong thời gian sắp tới, hệ thống sẽ được xây dựng hoàn thiện và tối ưu để có thể đưa vào sử dụng.

Hướng phát triển:

Hiện nay, công nghệ Struts, Hibernate và Spring vẫn đang được phát triển mạnh mẽ và được sử dụng tương đối rộng rãi trong các ứng dụng Web, đặc biệt là các ứng dụng có quy mô lớn, phức tạp. Đây đều là những công nghệ mã nguồn mở dựa trên ngôn ngữ Java. Với sự phát triển mạnh mẽ của công nghệ tri thức, đã có khá nhiều công nghệ Web mới ra đời cạnh tranh với các công nghệ trên. Tuy nhiên, Struts, Hibernate và Spring vẫn được nhiều người yêu thích và sử dụng rộng rãi trong nhiều ứng dụng khác nhau.

Đồ án này tập trung nghiên cứu về công nghệ Struts, Hibernate và Spring và áp dụng xây dựng bài toán tuyển dụng trực tuyến. Đây là bài toán hay và có thể mở rộng và phát triển trong tương lai. Với việc hoàn thiện được các chức năng như đã mô tả và phân tích trong đồ án, ứng dụng có thể được triển khai trong thực tế và đáp ứng được nhiều nhu cầu cần thiết của người sử dụng.

Page 93: 101005641-Do-an

TÀI LIỆU THAM KHẢO Các tài liệu tham khảo :

Struts in Action (Ted N. Husted, Cedric Dumoulin, George Franciscus, David Winterfeldt)

Struts Survival Guide (Srikanth Shenoy)

Struts: The Complete Reference (James Holmes )

Jakarta Struts for Dummies (Mike Robinson, Ellen Finkelstein)

Professional Jakarta Struts (James Goodwill, Richard Hightower)

Apress - Beginning Apache Struts (Arnold Doray)

Apress - Pro Apache Struts with Ajax (John Carnell, Rob Harrop, Kunal Mittal)

Manning – Webwork in Action (Patrick Lightbody, Jason Carreira)

Starting Struts 2 (Ian Roughley)

Apress – Expert Spring MVC and Web Flows (Seth Ladd, Keith Donald)

Spring Reference (Document of www.springframework.org)

Manning - Spring in Action 2007 (Craig Walls, Ryan Breidenbach)

Spring Live (Matt Raible)

Agile Java Development with Spring, Hibernate and Eclipse (Anil Hemrajani)

Hibernate reference (Document of www.hibernate.org)

Manning - Java persistence with Hibernate (Christian Bauer, Gavin King)

Manning - Hibernate in Action (Christian Bauer, Gavin King)

Các trang Web tham khảo :

http://www.struts.apache.org

http://www.springframework.org

http://www.hibernate.org

http://www.roseindia.net

http://www.java.sun.com/j2ee

http://www.javavietnam.org

http://www.java-source.net/open-source

http://www.wikipedia.org

http://www.blogjava.net

Và rất nhiều các trang diễn đàn và blog khác