KHOÁ LUẬN TỐT NGHIỆP ĐẠI HỌC HỆ CHÍNH QUY
Ngành: Công nghệ thông tin HÀ NỘI - 2010
STRUTS 2 VÀ ỨNG DỤNG QUẢN LÝ CHẤT
LƯỢNG DỊCH VỤ HOME PHONE
KHOÁ LUẬN TỐT NGHIỆP ĐẠI HỌC HỆ CHÍNH QUY
Ngành: Công nghệ thông tin
Cán bộ hướng dẫn: ThS. Lê Hồng Hải
HÀ NỘI - 2010
Khóa luận với đề tài "Xây dựng ứng dụng quản lý chất lượng dịch vụ Home
Phone sử dụng Struts 2 và Hibernate" sẽ đưa ra những cái nhìn tổng quát về công
nghệ JSP/ Servlet chạy trên máy chủ ứng dụng J2EE, những ưu nhược điểm của công
nghệ này và cách khắc phục với điểm mạnh của framework Struts 2. Ngoài ra, sự kết
hợp giữa Struts 2 với Hibernate - một framework hỗ trợ ánh xạ từ cở sở dữ liệu thành
các đối tượng phục vụ tốt nhất cho việc phát triển ứng dụng. Cuối cùng, khóa luận nêu
những vận dụng của công nghệ trong việc xây dựng ứng dụng quản lý chất lượng dịch
vụ Home Phone với các module và chức năng cụ thể sử dụng dữ liệu của ứng dụng
được lấy từ trực tiếp từ cơ sở dữ liệu của Viettel Technologies. MỤC LỤC
Chương 1: MÔ TẢ HỆ THỐNG 7
Module Agent: 8
Module Core: phần nhân của hệ thống, xử lý các yêu cầu nhận được từ agent 8
Module Web: (nhiệm vụ chính của khóa luận thực hiện) 8
Chương 2: CÔNG NGHỆ STRUTS 2 VÀ HIBERNATE 11
2.1. Giới thiệu 11
2.2. Servlet/JSP: 11
2.3. Struts 12
2.4. Struts 2 16
2.4.1. Vòng đời của các yêu cầu trong Struts 2 16
2.4.2. Kiến trúc Struts 2 17
2.4.3. Ứng dụng đơn giản với Struts 2: 18
2.5. Truy cập, sử dụng dữ liệu trong database. 23
2.6. Hibernate và những ưu việt 23
2.6.1. Hibernate framework 23
2.6.2 Một ví dụ về kết hợp giữa Struts 2 và Hibernate: 27
Chương 3: GIẢI QUYẾT BÀI TOÁN 35
hàng tin dùng để có những sửa chữa nâng cấp kịp thời cho hệ thống và có những biện
pháp chăm sóc khách hàng hợp lý.
Trong quá trình phát triển hệ thống, rất may mắn cho tôi là được tham gia xây
dựng một bộ phận của hệ thống. Trong khóa luận của tôi, tôi sẽ trình bày kỹ hơn về các
vấn đề này.
Chương 1: MÔ TẢ HỆ THỐNG
Dịch vụ Home Phone (dịch vụ điện thoại cố định không dây) là một dịch vụ tiềm
năng và quan trọng trong sự phát triển viễn thông của tập toàn Viettel. Để phát triển tốt
dịch vụ, cần có một hệ thống đánh giá chất lượng dịch vụ cập nhật thường xuyên các
thông số để có những đánh giá chủ quan về cơ cấu hệ thống (chất lượng cuộc gọi, tiềm
năng phát triển thuê bao và chất lượng sóng…)
Hệ thống quản lý chất lượng dịch vụ Home Phone (Home Phone service quality
management system) đã giải quyết vấn đề này. Mô hình dưới đây mô tả quá trình hoạt
động của hệ thống.
Hình 1.1: Mô hình hệ thống Home Phone. Trên mỗi máy điện thoại cố định không dây Home Phone đều được gắn thêm một
con chip để tương tác với các tín hiệu nhận được từ hệ thống. Agent được định nghĩa
như là phần nhân trong mỗi máy điện thoại cố định, đặc trưng riêng cho mỗi máy. Các trạm BTS trải rộng từ các vùng, đến các tỉnh thành phố. Ở phía đầu cuối, các
máy điện thoại (agent) được thiết lập cấu hình trong từng cell của trạm. Khi hệ thống tác
động yêu cầu về các máy Home Phone, yêu cầu sẽ thông qua các cell để tương tác.
Yêu cầu xây dựng ứng dụng web với các module sau:
thời gian.
Đồ thị phân bố số mẫu theo giá trị của chất lượng sóng (áp dụng cho 1
agent, 1 cell, 1 tỉnh/thành, 1 khu vực hoặc toàn mạng) chọn 1 hoặc nhiều
khoảng thời gian.
Đồ thị phân bố % số mẫu cường độ sóng tốt/ tổng số mẫu trong ngày (áp
dụng cho 1 agent, 1 cell, 1 tỉnh/ thành, 1 khu vực hoặc toàn mạng) theo thời
gian, chọn khoảng thời gian( config: ngưỡng tốt)
Đồ thị phân bố % số mẫu chất lượng sóng tốt/ tổng số mẫu trong ngày (áp
dụng cho 1 agent, 1 cell, 1 tỉnh/thành, 1 khu vực, hoặc toàn mạng) theo thời
gian, chọn khoảng thời gian (config: ngưỡng tốt)
Đồ thị giá trị CSR (tỷ lệ cuộc gọi thành công/ tổng số cuộc gọi) trong ngày
(áp dụng cho 1 agent, 1 cell, 1 tỉnh/thành, 1 khu vực hoặc toàn mạng) theo
thời gian, chọn khoảng thời gian.
Đồ thị phân bố % agent đang hoạt động, agent phát sinh nhiều cuộc gọi
(config: số cuộc gọi), % agent thay đổi serving cell, % agent activated mới,
% agent activated mới phát sinh cuộc gọi trong ngày theo thời gian (1
tỉnh/thành, 1 khu vực hoặc toàn mạng); chọn khoảng thời gian.
Báo cáo thống kê: (các báo cáo hàng ngày) dạng bảng (gửi qua email hàng ngày, thống
kê cho ngày hôm qua, cho phép list agent-> xem chi tiết agent)
% agent đang hoạt động
% agent phát sinh cuộc gọi.
% agent phát sinh nhiều cuộc gọi.
% agent thay đổi serving cell.
% agent activated mới
% agent mới activated phát sinh cuộc gọi.
% số mẫu có cường độ sóng tốt.
% số mẫu có chất lượng sóng tốt.
% CSR.
Cảnh báo: (là các dạng báo cáo hàng ngày, gửi qua mail hàng ngày) (nếu có dữ liệu)
(config: max, sort: giảm dần)
những đặc tính ưu việt của Struts 2 sẽ được trình bày ở chương 2, tôi tin mọi người sẽ
nắm được những tính ưu việt của công nghệ này.
Chương 2: CÔNG NGHỆ STRUTS 2 VÀ HIBERNATE
2.1. Giới thiệu
Java là một nền tảng phát triển các ứng dụng phần mềm có vị trí rất lớn trong
những năm cuối thế kỉ 20, đầu thế kỉ 21. Đánh dấu sự trưởng thành của mô hình lập
trình hướng đối tượng, nó được coi là một nền tảng mang tính cách mạng trong nghành
phần mềm. Mô hình máy ảo Virtual Machine đã cho phép các ứng dụng viết bằng Java
có thể chạy trên nhiều hệ điều hành khác nhau. Vì thế Java là ngôn ngữ vẫn được rất
nhiều các nhà thiết kế lựa chọn làm ngôn ngữ phát triển chính cho hệ thống của mình.
2.2. Servlet/JSP:
Servlet/JSP là một bộ phận của công nghệ J2EE (Java 2 Platform, Enterprise
Edition) phiên bản của Java chạy trên các máy chủ ứng dụng.
Servlet:
Servlet API được phát triển dựa trên những điểm mạnh của Java platform nhằm
giải quyết vấn đề của CGI và trình chủ server API. Nó là một API đơn giản hỗ trợ tất cả
các Web server và thậm chí các ứng dụng máy chủ dùng để kiểm tra và quản lý các
công việc trên server (load –balancing). Nó giải quyết vấn đề thực thi bằng việc thực
hiện tất cả các yêu cầu như những dòng trong một xử lý, hoặc trên một hệ thống load-
balancing sẽ là mỗi xử lý trên một server trong kết chùm cluster. Các servlet dễ dàng
chia sẽ tài nguyên. Bạn có thể sử dụng JavaMail để đọc và gửi mail, Java DataBase
Connect (JDBC) để truy cập các database, lớp File và những lớp quan hệ để truy cập hệ
thống file, RMI, CORBA, Enterprise Java Beans (EJB) để truy cập các hệ thống kế
thừa…
JSP:
tới.
2.3. Struts
Struts là một framework phục vụ việc phát triển các ứng dụng Web trên Java. Sử
dụng mẫu thiết kế Model-View-Controller (MVC), Struts giải quyết rất nhiều các vấn
đề liên quan đến các ứng dụng Web hướng business đòi hỏi hiệu năng cao sử dụng Java
servlet và JSP. Ứng dụng chạy trực tiếp trên JSP/Servlet chưa đáp ứng hết được yêu cầu
bảo mật và chuyên nghiệp cho một hệ thống lớn. Struts cơ bản định hình lại cách các
Web programmer nghĩ về và cấu trúc một ứng dụng Web.
2.3.1. Kiến trúc 3 tầng MVC
Hình 2.1: Kiến trúc 3 tầng MVC Kiến trúc MVC là việc chia tất cả mục của một ứng dụng ra làm ba thành phần
(component) khác nhau Model (Mô hình), View (Giao diện) và Controller (Bộ điều
khiển). Các thành phần của kiến trúc MVC có một trách nhiệm duy nhất và không phụ
thuộc vào các thành phần khác.
- Model (Mô hình): Model được giao nhiệm vụ cung cấp dữ liệu cho cơ sở dữ liệu và
lưu dữ liệu vào các kho chứa dữ liệu.
Tất cả các nghiệp vụ logic được thực thi ở Model.
Dữ liệu vào từ người dùng sẽ thông qua View được kiểm tra ở Model trước khi lưu vào
cơ sở dữ liệu. Việc truy xuất, xác nhận, và lưu dữ liệu là một phần của Model .
- View (Giao diện): View hiển thị các thông tin cho người dùng của ứng dụng và được
giao nhiệm vụ cho việc nhận các dữ liệu vào từ người dùng, gửi đi các yêu cầu đến bộ
điều khiển, sau đó là nhận lại các phản hồi từ bộ điều khiển và hiển kết quả cho người
dùng.
Các trang HTML, JSP, các thư viện thẻ và các file nguồn là một phần của thành phần
View
- Controller (bộ điều khiển): Controller là tầng trung gian giữa Model và View.
Controller được giao nhiệm vụ nhận các yêu cầu từ phía máy khách. Một yêu cầu
của dữ liệu ở cả phía server và client.
2.3.3. Các phiên bản của struts.
Hiện nay struts đã phát triển 2 phiên bản là struts 1x và struts 2x. Có một số khác
biệt trong cấu trúc của 2 phiên bản. Dưới đây là một số khác biệt cơ bản:
Tính năng Struts 1 Struts 2
Action classes
(Lớp hoạt
động)
- Sử dụng lớp abstract (lớp
trừu tượng), không sử
dụng interface (lớp giao
diện).
- Action yêu cầu bắt buộc
phải kế thừa từ một lớp
abstract nào đó.
- Action có thể là bất kỳ lớp
Java nào.
- Cung cấp sẵn 1 interface
chung cho các action là
ActionSupport, tuy nhiên
không bắt buộc thực thi
action này
Threading
Model
(Mô hình
luồng)
Các Action là độc nhất vì
thế chúng phải được
thread-safe bởi vì chỉ có
API của servlet bởi chúng tạo
các POJO đơn giản.
Testability
(Khả năng kiểm
tra)
Ứng dụng Struts1 có một
vấn đề chính trong việc
testing bởi vì phương thức
execute phụ thuộc vào
Servlet API. Struts
TestCase cung cấp một tập
hợp các đối tượng Mock
cho Struts 1
Các Action có thể test các
khởi tạo Action.Các Action là
một POJO đơn giản và không
phụ thuộc framework,vì thế
việc test trở lên đơn giản hơn
Harvesting
Input
(Kết quả đầu
vào)
Struts1 sử dụng một đối
tượng ActionForm để giữ
các input.Giống như các
Action, tất cả các
ActionForms cần được
thừa kế lớp ActionForm cơ
dựa trên từng lớp, không
được cấu hình dựa trên thể
hiện của lớp.
Struts 2 sử dụng OGNL đối
với việc chuyển kiểu dữ liệu. Control Of
Action
Execution
(Kiểm soát thực
thi)
Mỗi module trong Struts 1
có sự tách rời Request
Processors (vòng
đời),trong khi tất cả các
Action trong module cần
phải chia sẻ cùng vòng
đời.
Trong Struts 2 các vòng đời
khác nhau được tạo ra dựa
trên nền tảng Action thông
qua ngăn xếp chặn
(Interceptor Stacks).Các stack
tùy biến được tạo ra và sử
dụng với Action khác nhau.
Sự khác nhau như trên, với những ưu điểm của Struts 2 so với Struts 1 làm Struts
2 trở thành công cụ hữu ích cho các nhà thiết kế phần mềm Web hiện tại và tương lai.
2.4. Struts 2
- FilterDispatcher: tiếp đến, FilterDispatcher (bộ điều khiển lọc) được gọi, nó
quay lại sử dụng ActionMapper để xác định Action nào được triệu gọi. Nếu action
được yêu cầu được triệu gọi thì FilterDispatcher ủy nhiệm việc điều khiển lại cho
ActionProxy.
- ActionProxy:ActionProxy nhận sự giúp đỡ từ bộ quản lý cấu hình file
(Configuration Files manager), được khởi tạo từ file struts.xml. Sau đó ActionProxy
tạo ra một ActionInvocation, thực thi (implement) từ mẫu lệnh. ActionInvocation xử
lý triệu gọi bộ chặn (Interceptors) nếu nó được cấu hình và sau đó triệu gọi Action.
ActionInvocation tìm kiếm kết quả thích hợp, sau đó kết quả được thực thi, nó triệu
gọi việc sinh ra trang các JSP hoặc các mẫu.
Sau đó, các Interceptor được thực thi một lần nữa theo thứ tự ngược lại. Việc trả
về kết quả cuối cùng thông qua các bộ lọc được cấu hình trong file web.xml. Nếu bộ
lọc ActionContextCleanUp được cấu hình, thì FilterDispatcher không dọn dẹp
ThreadLocal ActionContext. Nếu bộ lọc ActionContextCleanUp không có thì
FilterDispatcher sẽ dọn dẹp tất cả các ThreadLocal tồn tại.
2.4.3. Ứng dụng đơn giản với Struts 2:
Hiển thị thông điệp “Hello world”
Sử dụng Eclipse Java EE IDE for Web Developers.
o Tạo 1 project mới:
Tải gói struts 2 tại trang chủ của struts:
http://struts.apache.org/2.1.8.1/index.html
Copy các file sau từ thư mục \struts-2.0.11-all\struts-2.0.11\lib vào thư mục
WEB_INF/lib của ứng dụng ta mới tạo:
struts2-core.jar, xwork.jar, ognl.jar, freemarker.jar, commons-logging.jar
o Sử dụng Server: Apache TomCat 6.0.20 download tại địa chỉ:
http://tomcat.apache.org/
Với Eclipse, chọn New ->Project-> Dynamic Web Project. Sau đó đặt tên cho
project, mặc định để chạy trên server Tom Cat 6.0 . Các bước thiết lập cấu hình cho hệ
thống như dưới đây:
Bước 2: Thành phần “Controller”.
- Tạo file cấu hình điều khiển struts.xml trong thư mục: struts2tutorial\WEB-INF\src
với nội dung: File struts.xml sẽ có mặt trong classpath của ứng dụng, ta có thể đặt file này
trong jar và trong thư mục lib của ứng dụng hoặc cũng có thể đặt nó trong thư mục
classes của ứng dụng web.
- Cấu hình file web.xml của ứng dụng web
<?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>
<constant name="struts.enable.DynamicMethodInvocation"
value="false" />
<constant name="struts.devMode" value="true" />
<package name="exam" namespace="/exam" extends="struts-
default">
<action name="HelloWorld"
class="java.exam.Struts2HelloWorld">
<result>/pages/HelloWorld.jsp</result>
</action>
<! Add actions here >
</package>
http://localhost:8080/struts2tutorial/exam/HelloWorld.action
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>Struts 2 Hello World Application!</title>
</head>
<body>
<h2><s:property value="message" /></h2>
<p>Current date and time is: <b><s:property
value="currentTime" /></b>
</body>
</html>
<s:property value="message"/>
và <s :property value="currentTime"/>
Hình 2.5: Chương trình sau khi chạy
- Khi chạy trên Tom Cat 6.0, trình chứa sẽ yêu cầu tài nguyên HelloWorld.action. File
web.xml trong ứng dụng này đã cấu hình việc định tuyến tất cả các yêu cầu *.action
đều thông qua org.apache.struts2.dispatcher.FilterDispatcher.
- Framework sẽ tìm mapping cho action HelloWorld, sau đó tạo một thể hiện của lớp
thích hợp và gọi phương thức execute() của lớp action đó. Trong trường hợp này là
lớp Struts2HelloWorld. Dưới đây là đoạn cấu hình mapping cho action này trong file
struts.xml
- ORACLE là một bộ phần mềm được cung cấp bởi công ty ORACLE , nó bao gồm
một bộ xây dựng các ứng dụng và các sản phẩm cuối cùng cho uer (end_uer product).
- Oracle cung cấp một hệ quản trị CSDL mềm dẻo nó bao gồm CSDL Oracle, môi
trường cho việc thiết kế các cơ sở dữ liệu (Designer) và các công cụ phát triển
(Developer)….
- Bởi tính an toàn , bảo mật cao,tính nhất quán và toàn vẹn dữ liệu, cho phép các
user truy nhập tới cơ sở dữ liệu phân tán như một khối thống nhất … Oracle đang là
lựa chọn hàng đầu cho các doanh nghiệp trong việc quản trị database. Hệ thống quản
lý chất lượng dịch vụ Home Phone đã lựa chọn Oracle làm hệ quản trị cơ sở dữ liệu
bởi những đặc tính ưu việt đó.
2.6. Hibernate và những ưu việt.
2.6.1. Hibernate framework [13]
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.
Hibernate là một cơ chế cho phép người lập trình thao tác với database một cách
hoàn toàn tự nhiên thông qua các đối tượng. Lập trình viên hoàn toàn không quan tâm đến
loại database sử dụng, SQL, … Nó là một trong những ORM (Object Relational
Mapping) Framework.
Chức năng chính của hibernate chính là ánh xạ từ các lớp Java đến các bảng cơ sở
dữ liệu ( và từ các kiểu dữ liệu Java sang kiểu dữ liệu SQL).
Khái niệm “Peristence layer”: một ứng dụng có thể được chia làm 3 phần như
sau: giao diện người dùng (presentation layer), phần xử lý nghiệp vụ (business layer) và
phần chứa dữ liệu (data layer). Cụ thể ra, business layer có thể được chia nhỏ thành 2 layer con là business logic layer (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ệ - Relational DBMS). Persistence sẽ đảm nhiệm các
Sáng tạo lại, quay vòng, đó là nguyên nhân của sự phát triển phần mềm. Đây là
thực tế cho mỗi và mọi thành phần của phần mềm. Một trong những thành phần cơ
bản và hầu như phức tạp (trong khái niệm thiết kế và bổ sung) là cơ sở dữ liệu. Tính
phức tạp tăng lên khi các thành phần tương tác nhau khác nhau.
Khi một thành phần dựa trên một kiểu giải pháp (ví dụ hướng đối tượng) cố
gắng tương tác trực tiếp với đối tượng khác có kiểu giải pháp khác (ví dụ quan hệ),
tính phức tạp tăng lên theo cấp số nhân của việc giao tiếp các giải pháp với nhau. Đây
là điều hiển nhiên trong tất cả các API cơ sở dữ liệu được cung cấp bởi các ngôn ngữ
khác nhau.
Ví dụ tốt nhất là API Java Database Connectivity (JDBC). Thông qua JDBC
cung cấp một phương thức dễ dàng để truy cập đến những cơ sở dữ liệu khác nhau mà
không phải thay đổi nhiều, nó cơ bản là một API ở mức thấp cung cấp chỉ một layer
trừu tượng.
Đây là sự tiện dụng đối với những dự án nhỏ và vừa, nhưng không thích hợp
cho các ứng dụng mức enterprise. Những gì mà một Framework yêu cầu đó là có thể
tương tác như một trung gian giữa nhiều bên với nhau (ví dụ các giải pháp khác nhau).
Các ORM framework mang đến cho các developer những tư duy trong khái
niệm về quan hệ trong khi vẫn làm việc với các lớp. Có nhiều framework mang mục
đích này. Những gì làm cho Hibernate khác với những framework khác chính là tính
đơn giản và khả chuyển của nó. Để tạo nên ứng dụng Hibernate, có ba điều cần phải
có, đó là:
Persistence Class: (Lớp bền vững)
Persistence class là một Plain Old Java Object hay POJO model. Một POJO là
tương tự như một JavaBean, có những getter và setter để truy câp các thuộc tính của
nó là những instance variable (biến thực thể). Persistence class có những đặc điểm
dưới đây:
a. Nó là thay thế hướng đối tượng cho bảng ở cơ sở dữ liệu
b. Các thuộc tính của bảng trở thành những instance variable của persistence