BaoCaoEJB
-
Upload
dao-nguyen-minh -
Category
Documents
-
view
32 -
download
0
Transcript of BaoCaoEJB
LỜI CẢM ƠN
Xin chân thành cảm ơn sự hướng dẫn, giúp đỡ của quý Thầy Cô trong trường Đại Học Sư Phạm Kỹ Thuật.
Xin đặc biệt chân thành cảm ơn Thầy Ths. Nguyễn Minh Đạo giảng viên khoa Công nghệ thông tin đã tận tình hướng dẫn truyền đạt những kiến thức và kinh nghiệm quý báu, những tình cảm yêu mến của Thầy đã giúp chúng em có đầy đủ kiến thức và nghị lực để hoàn thành luận văn.
Xin cảm ơn những bạn bè và người thân trong gia đình đã tin yêu và truyền cho chúng em thêm sức mạnh trong công việc học tập nghiên cứu của bản thân.
Mặc dù đã có rất nhiều cố gắng trong việc thực hiện luận văn, song với thời gian có hạn và mức độ nghiên cứu bản thân còn hạn chế, nên không thể không có những thiếu sót, mong được sự đóng góp ý kiến của quý Thầy cô và các bạn.
Tp.HCM, ngày 06 tháng 06 năm 2013
Sinh viên
Nguyễn Tuấn Anh
Nguyễn Đình Hà
TÓM TẮT ĐỀTÀI
Trong thời kỳ kinh tế thế giới đang trong thời kỳ toàn cầu hóa. Các kênh bán hàng của
các doanh nghiệp ngày càng phong phú và đóng một vai trò nhất định trong quá trình
quảng bá và tiêu thụ sản phẩm của doanh nghiệp. Với sự phát triển của nền công nghiệp
công nghệ thông tin và đặt biệt là sự bùng nổ nhanh chóng của Internet . Kênh bán hàng
trực tuyến đã và đang là xu thế chung của các doanh nghiệp nhằm tiếp cận một cách
nhanh chóng với khách hàng.
Java EE 5 là một phiên bản chính trong sự phát triển của Java EE với nhiều đặc
tính mới. Điểm mạnh của nó là giúp cho sự phát triển ứng dụng web Java được dễ dàng.
Sự dễ dàng phát triển này bao gồm sử dụng những khai báo annotation thay vì dùng
những tập tin deployment description, đơn giản hóa sự phát triển EJB, sử dụng
dependency injection để truy nhập những tài nguyên. Và còn nhiều cái đặc biệt bên
dưới....
Trong đề tài này, nhóm thực hiện sẽ từng bước tìm hiểu các cấu trúc, qui trình hoạt
động và điều hành một website bán hàng . Tiến hành xây dựng một website bán sách
hoàn chỉnh.
Bố cục của đồ án được trình bày như sau:
Chương 1: Giới thiệu
Chương 2: Các công trình liên quan đến đề tài
Chương 3: Phương pháp luận
Chương 4: Giải quyết vấn đề thực tế
Chương 5: Kết luận
Chương 6: Hướng phát triển
Chương 7: Tài liệu tham khảo
MỤC LỤC
CHƯƠNG 1. GIỚI THIỆU
1.1 Tầm quan trọng của vấn đề nghiên cứu trong luận văn
Những ứng dụng của doanh nghiệp ngày càng xử lý nhiều công việc hơn, dữ liệu
của doanh nghiệp phân tán nhiều nơi và vấn đề bảo mật cũng như đảm bảo toàn vẹn dữ
liệu trở nên quan trọng. Bên cạnh đó, việc ứng dụng cần được triển khai phân tán ở nhiều
nơi để đáp ứng những yêu cầu công việc hiện tại đã mang lại nhiều thách thức cho lập
trình viên. J2EE (Java 2 Platform Enterprise Edition) được giới thiệu lần đầu tiên vào
năm 1999 là một platform mang nhiều tính năng mạnh mẽ đặc biệt hổ trợ mạnh về xử lý
giao tác (transaction) và bảo mật (security). Những ứng dụng J2EE cho phép khả năng
mở rộng cao, khả năng cung cấp dịch vụ cho nhiều khách hàng (client) và phân tán trên
nhiều nơi. Kể từ khi ra đời J2EE đã cho ra đời những đặc tả mới và trở nên phong phú,
mạnh mẽ cho việc phát triển ứng dụng web sử dụng J2EE, việc kiểm lỗi và triển khai trở
nên dễ dàng hơn.
Trong đặc tả của J2EE cung cấp nhiều công nghệ cho phép lập trình viên xử lý
những yêu cầu khác nhau như: JSP/Servlet, JMS (Java Message Service), JavaMail, EJB
(Enterprise Java Bean), …Trong đó EJB là một thành phần tốt nhất trong J2EE, EJB hổ
trợ mạnh việc xử lý giao tác và bảo mật. Đi kèm với EJB là đặc tả Java Persistence API
(JPA) cho phép các lớp Java ánh xạ với các bảng trong cơ sở dữ liệu dựa trên mô hình
ORM (Object Relational Mapping). Qua lịch sử phát triển của J2EE, EJB cũng đã thay
đổi nhiều kể từ lúc mới được giới thiệu. Phiên bản EJB 3.0 kết hợp với đặc tả JPA 2.0
được giới thiệu cùng với J2EE 5.0 là một bước ngoặc trong lịch sử phát triển của EJB.
EJB 3.0 tập trung vào tính dễ sử dụng và triển khai ứng dụng mang lại một động lực mới
cho giới lập trình tiếp tục sử dụng EJB cũng như những công nghệ của J2EE để phát triển
ứng dụng phía máy chủ mà điển hình là những ứng dụng web.
Cùng với sự ra đời của EJB 3.0, một bước tiến lớn so với phiên bản EJB 2.0 trước
đó, mang đến sự mạnh mẽ, giao tác (transaction), bảo mật (security) tốt cho việc xử lý
nghiệp vụ trong các ứng dụng Enterprise chạy trên nền J2EE, Sun còn cho ra đời công
nghệ Java Server Faces (JSF), một framework cho việc phát triển tầng giao diện của ứng
dụng Server. Với mục tiêu là giúp cho việc phát triển ứng dụng web nhanh hơn và dễ
dàng hơn cho người lập trình thông qua sự hỗ trợ của các thành phần giao diện người
dùng (như các text box, list box, datagrid,…), JSF thực sự là một framework tốt và cần
thiết cho người lập trình Java. Bên cạnh đó, hiện nay cũng có nhiều nhà phát triển lớn sử
dụng framework này để phát triển các bộ thư viện cho người dùng với nhiều control đẹp,
đa dạng và đặc biệt hỗ trợ Ajax chạy tốt trên nhiều trình duyệt. Trong số đó có thể nói
đến hai nhà phát triển mã nguồn mở lớn hiện này là Jboss với bộ thư viện RichFaces và
Apache với bộ thư viện MyFaces. Đây là hai bộ thư viện được sử dụng phổ biến nhất
hiện nay để phát triển ứng dụng JSF.
1.2 Mục tiêu của các vấn đề nghiên cứu trong luận văn
Ứng dụng các công nghệ trên nền J2EE 5.0 như EJB 3.0, JPA 2.0, JSP/Servlet, …
để xây dựng hoàn chỉnh ứng dụng website bán sách online với đầy đủ các tính năng và
tiện ích cho việc mua hàng và quản lý bán hàng.
1.3 Kết quả đạt được
Webiste bán sách online sử dụng các công nghệ trong J2EE, đáp ứng được nhu cầu của một trang bán hàng trực tuyến và các gói quản lý cho hệ thống. Cho phép khách hàng tìm kiếm, đặt hàng…
CHƯƠNG 2. CÁC CÔNG TRÌNH LIÊN QUAN ĐẾN ĐỀ TÀI
Với sự phát triển của internet đã tạo động lực cho sự phát triển mạnh mẽ của hoạt
động thương mại điện tử và đang trở thành một xu hướng kinh doanh trên toàn cầu. Cùng
với sự phát triển của thương mại điện tử, không thể không đề cập đến website thương mại
điện tử, đóng vai trò như một người bán hàng đắc lực và mang lại một nguồn thu lớn cho
doanh nghiệp. Dựa vào quá trình phát triển của thương mại điện tử và qui mô kinh doanh,
người ta phân thành hai loại website thương mại điện tử chính: website thương mại điện
tử loại một và website thương mại điện tử loại hai.
2.1 Các website thương mại điện tử loại một
Những website thương mại điện tử loại này thường chỉ thực hiện các hoạt động
mua bán và thanh toán trực tuyến thông thường mà không có sự phân loại khách hàng.
Ưu điểm của nó là tốn ít chi phí xây dựng, dễ dàng phát triển và thích hợp cho những hệ
thống kinh doanh qui mô nhỏ, số lượng sản phẩm không nhiều.
2.2 Các website thương mại điện tử loại hai
Đối với những hệ thống kinh doanh lớn và các hoạt động thương mại điện tử phức tạp, các website thương mại điện tử loại một không đáp ứng các được các yêu cầu kinh doanh cũng như gặp một số hạn chế. Việc ra đời các website thương mại điện tử loại hai là sự cải tiến từ những hạn chế của website thương mại điện tử loại một với việc hỗ trợ phân loại của khách hàng. Trong các hệ thống kinh doanh qui mô lớn, số lượng sản phẩm kinh doanh lớn, khách hàng sẽ cảm thấy bất tiện trong việc tìm những sản phẩm kinh doanh lớn, khách hàng sẽ cảm thấy bất tiện trong việc tìm những sản phẩm theo sở thích của mình. Vì vậy, việc phân loại khách hàng sẽ giúp khách hàng nhanh chóng tìm được những sản phẩm ưng ý. Hệ thống sẽ đưa ra những gợi ý sản phẩm cho khách hàng dựa theo việc phân loại khách hàng theo hai tiêu chí : thông tin sở thích về sản phẩm và lịch sử mua hàng của khách hàng.
CHƯƠNG 3. PHƯƠNG PHÁP LUẬN
3.1 Tổng quan về J2EE3.1.1 J2EE là gì ?
Java 2 Platform Enterprise Edition viết tắt là J2EE, là một nền tảng công nghệ cho
phép phát triển những ứng dụng thương mại đa tầng (multitier enterprise applications).
J2EE mở rộng hổ trợ cho nhiều công nghệ như : JSP/Servlet, Enterprise JavaBeans, JSF,
JMS, JTA, …
3.1.2 Kiến trúc của J2EE
J2EE sử dụng một mô hình ứng dụng phân tán đa tầng.
Hình 3-1 Mô hình đa tầng của J2EE
Trong mô hình ứng dụng J2EE có nhiều tầng: Tầng khách hàng (client tier), tầng web
(web tier),tầng thương mại(business tier)và tầng hệ thống thông tin thương mại
(enterprise information system tier). Tầng thương mại và tầng web nằm trên một máy chủ
ứng dụng gọi là máy chủ ứng dụng (application server) hay máy chủ J2EE (J2EE server).
Máy chủ J2EE cung cấp những dịch vụ cần thiết cho những thành phần (component) của
tầng thương mại và tầng web.
Hình 3-2 Giao tiếp giữa các tầng
Có hai loại khách hàng (client) là: Những khách hàng ứng dụng (application clients) và
những khách hàng web (web clients). Khách hàng web truy cập tới những thành phần
trong tầng web là các lớp Java Servlet hay Java ServerPages. Những khách hàng ứng
dụng là những ứng dụng độc lập, chúng truy cập trực tiếp tới các thành phần trong tầng
thương mại.
Hình 3-3 Containers và Components
J2EE có các loại container như :
Web Container : Quản lý sự thực thi của các thành phần web, và container của
chúng chạy trong máy chủ J2EE (J2EE server).
EJB Container : Quản lý sự thực thi của các thành phần EJB, các thành phần EJB
và container của chúng chạy trong J2EE server.
Application client Container : Quản lý sự thực thi các thành phần của ứng dụng
client.
Applet Container : Quản lý sự thực thi của applets (ứng dụng ký sinh).
Các công nghệ trong J2EE :
Java Database Connectivity (JDBC) API: JDBC là một tập hợp các giao diện cho
phép các ứng dụng Java truy cập vào cơ sở dữ liệu bất kỳ. API này có cùng một
mục đích như ODBC (Open Database Connectivity) Microsoft.
Remote Method Invocation (RMI): RMI là một API cho phép các đối tượng Java
để giao tiếp từ xa với các đối tượng khác.
Java IDL: IDL (Interface Definition Language) là một ngôn ngữ nền tảng tiêu
chuẩn khai báo độc lập được sử dụng để xác định các giao diện đối tượng triển
khai cung cấp và đối tượng khách hàng gọi. Java IDL cho phép bất kỳ đối tượng
Java để giao tiếp với các đối tượng khác trong ngôn ngữ bất kỳ bằng phương tiện
của IDL.
Enterprise Java Beans: Đóng gói các logic thương mại (business logic) và hổ trợ
thực hiện giao tác và bảo mật.
Servlets và Java Server Pages (JSP): Công nghệ dùng trong xây dựng những ứng
dụng web.
Java Message Service (JMS): Tập APIs cho phép ứng dụng tạo, gởi, nhận, và đọc
thông điệp bất đồng bộ.
Java Transaction API (JTA): JTA cho phép những ứng dụng J2EE thực hiện
những giao tác phân tán (distributed transaction).
JavaMail: Cho phép thành phần java gởi và nhận mail.
Java API cho xử lý XML (Java API for XML Processing -JAXP): XML là một
định dạng dữ liệu cho các tài liệu thay thế cấu trúc trên Web. JAXP cho phép các
ứng dụng Java phân tích và chuyển đổi tài liệu XML. XML được sử dụng nhiều
trong J2EE như là một định dạng dữ liệu.
Java Naming và Directory Interface (JNDI): JNDI là một giao thức cung cấp một
tập API chuẩn cho phép truy cập tới những dịch vụ naming và directory.
Java Persistence API (JPA) : Cho phép ánh xạ giữa một thực thể (entity) với một
bảng trong cơ sở dữ liệu quan hệ.
3.2 Enterprise Java Bean
3.2.1 Application Server
Một Application server là một chương trình ứng dụng nhận các yêu cầu và trả về các phản hồi (Client) . Một Application server có thể chạy từ xa hoặc chạy trên các máy tính có cài đặt ứng dụng. Bao gồm các ứng dụng như : file server, database server, backup server, print server, mail server, web server, FTP server, application server, VPN server, DHCP server, DNS server, WINS server, logon server, security server, domain controller, backup domain controller, proxy server, firewall, etc.
Application server được phát triển để hổ trợ phát triển các ứng dụng lớn, chúng bảo đảm an ninh và duy trì sự ổn định cho database.
Application server có thể nằm trong tầng thứ 3 của architecture model (Client tier,Middle tier và Enterprise Information System).
Hình 3.4 Mô hình application server
3.2.2 Enterprise Beans
Enterprise beans là một phần của Java EE server,chạy trên EJB container và nằm
trong tầng business logic của một Enterprise Application.
Enterprise Application là phần mềm được phát triển để sử dụng trong nhiều chức
năng. Những ứng dụng này bao gồm nhiều lượt truy cập đồng thời tới dữ liệu bởi nhiều
người dùng.
Enterprise beans được sử dụng trong nhiều chức năng như : tương tác với
client,duy trì sự ổn định của sesion, chứa dữ liệu từ database và tương tác với server.
Lợi ích của Enterprise beans : Enterprise beans được sử dụng rộng rãi trong nhiều
trong việc phát triển các ứng dụng lớn. EJB container cung cấp các dịch vụ ( như : quản
lý các chuyển đổi và phân quyền bảo mật) cho Enterprise beans. Những ứng dụng đó làm
đơn giản hóa việc xử lý trong quá trình phát triển ứng dụng và các lập trình viên chỉ phải
tập tring giải quyết những vấn đề phát sinh .
Các loại Enterprise beans : EJB 3.0 xác định 2 loại Enterprise beans :
Sesion bean : tương tác trực tiếp với client
Message driven bean : lắng nghe các tin nhắn dịch vụ đặc biệt như : Java Message
API hoặc JPA trong một khoảng thời gian ngắn.
3.2.3 Annotations
Annotation được thêm trong EJB3.0 để thay thế deployment descriptor trong các
phiên bản trước đó. Điều này mang lại tính đơn giản và hiểu quả hơn đối với các ứng
dụng sử dụng EJB(jdk 5 trở lên).
Annotation cũng giống như metadata,ta có thể code,variables,parameters,fields, methods
và constructors.
Annotation là cách để tương tác giữa các thành phần của chương trình với các meta-tag,
compiler có thể hổ trợ để sinh ra code tương ứng khi cần thiết.
1. Định nghĩa một annotation
public @interface Example {
String showSomething();
}
Ví dụ :
(showSomething="Hi! How r you")
public void anymethod() {
....
}
2. Annotation Types : Có 3 dạng annotation trong java Marker : marker annotation không chứa bất kỳ một thành phần nào khác ngoài
trừ tên cửa chính nó .
marker annotation không chứa bất kỳ một thành phần nào khác ngoài trừ tên
cửa chính nó
Ví dụ :
public @interface Example{}
..
@Example
Public void anymethod(){
..
} Single-value: dạng annotation này chỉ cung cấp một giá trị duy nhất.
public @interfaceExample{
String showSomething();
}
@Example(“Xin chào”)
Public void anymethod(){
..
}
Multi-value or Full-value: dạng annotation này có thể có nhiều dữ liệu thành
phần, vì vậy, cần sử dụng nhiều giá trị của annotation để chứa các dữ liệu thành
phần.
public @interface Example(){
int num;
String name;
}
@Example(showSomething=”Xin chào!”, num=5, name=”XXX” )
public void anymethod{
….
}
3. Các quy đinh khi định nghĩa Annotation Định nghĩa một annotation với dạng: @interface annotationName.
Các phương thức trong annotation không nên đưa ra các exception.
Các phương thức không nên có chứa các đối số (parameter).
Các phương thức thường được trã về các đối số.
4. Các dạng annotation: Có 2 dạng annatation Simple annotations : chỉ được sử dụng để chứa các đoạn code, không thể sử dụng
để tạo các custom-annotation. Meta annotations : thường được gọi là annotation,được sử dụng để tạo các
annotation type.
5. Override annotation
Override annotation đảm bảo các annotated-method được sử dụng để override các
phương thức trong lớp cha. Nếu các phương thức này không định nghĩa lại các
phương thức trong lớp cha thì trình biên dịch sẽ sinh ra lỗi lúc biên dịch.
6. Deprecated annotation
Khi sử dụng Deprecated annotation,trình biên dịch sẽ đưa ra các cảnh
báo(warning) khi sử dụng các thành phần được khai báo. Đồng thời, các phương thức
được khai báo với deprecated sẽ không thể sử dụng thêm được nữa.
Ví dụ :
public class Deprecated_method{
@Deprecated
public void showSomething() {
System.out.println("Method has been depricated'");
}
}
gọi deprecated-method từ class khác:
public class Test_Deprication {
public static void main(String arg[]) throws Exception {
new Test_Deprication();
}
public Test_Deprication() {
Deprecated_method d = new Deprecated_method();
d.showSomething();
}
Sau khi biên dịch,trinh biên dịch sẽ thông báo :
Compiling 1 source file to D:tempNew Folder
(2)TestJavaApplication1buildclasses
D:tempNew Folder
(2)TestJavaApplication1srctestmyannotation
Test_Deprication.java:27:
warning: [deprecation] showSomething() in
test.myannotation.Deprecated_method has been deprecated
d.showSomething();
1 warning
7. Suppresswarning annotation
Suppresswarning annotation bảo đảm trình biên dịch sẽ che đi các warning đối với
các annotated-elements và sub-elements.
Ví dụ :
public class Test_Depricated {
public static void main(String arg[]) throws Exception {
new TestDepricated().showSomething();
}
@SuppressWarnings({"deprecation"})
public void showSomething() {
Deprecation_method d = new Deprecation_method();
d.showSomething();
}
}
Lúc biên dịch,trình biên dịch sẽ không đưa ra bất kỳ một warning nào.
8. Meta-Annotations :Có 4 dạng meta-annotation được định nghĩa trong JDK5 Target annotation : đặc tả các thành phần của class,bao gồm các dạng :
@Target(ElementType.TYPE) : có thể dùng được với bất kỳ thành phần nào
của class. @Target(ElementType.FIELD) : dùng được cho field hoặc property.
@Target(ElementType.PARAMETER) : dung được cho các parameter của
các phương thức. @Target(ElementType.LOCAL_VARIABLE) : dụng được cho các biến local.
@Target(ElementType.METHOD) : dùng cho các method trong annotation.
@Target(ElementType.CONSTRUCTOR) : dùng cho các constructors.
@Target(ElementType.ANNOTATION_TYPE): xác định khai báo là một
annotation type.
Ví dụ:
@Target(ElementType.METHOD)
public @interface Test_Element {
public String doTestElement();
}
Tạo một class sử dụng annotation trên
public class Test_Annotations {
public static void main(String arg[]) {
new Test_Annotations().doTestElement();
}
@Test_Target(doTestElement="Hi ! How r you")
public void doTestElement() {
System.out.printf("Testing Target Element annotation");
}
}
Retention annotation
Retention annotation dùng để xác định địa điểm và phương thức annotation sẽ
được lưu lại. Có 3 dạng retention annotation :
RetentionPolicy.SOURCE : được lưu ở source-level và trình biên dịch sẽ
bỏ qua chúng RetentionPolicy.CLASS : được lưu vào lúc biên dịch, virtual
machine(VM) sẽ bỏ qua chúng. RetentionPolicy.RUNTIME : virtual machine sẽ lưu dạng annotation này
và có thể được đọc vào lúc run-time.
Ví dụ :
@Retention(RetentionPolicy.RUNTIME)
public @interface Retention_Demo {
String doRetentionDemo();
}
Documented annotation
Documented annotation không được khai báo mặc định,được xử lý bằng
javadoc tool để sinh ra các document.
Ví dụ :
@Documented
public @interface Documented_Demo {
String doTestDocumentedDemo();
}
public class Test_Annotations {
public static void main(String arg[]) {
new Test_Annotations().doTestRetentionDemo();
new Test_Annotations().doTestDocumentedDemo();
}
@Retention_Demo (doTestRetentionDemo="Hello retention annotation")
public void doTestRetentionDemo() {
System.out.printf("Testing 'Retention' annotation");
}
@Documented_Demo (doTestDocumentedDemo="Hello Test
documentation")
public void doTestDocumentedDemo() {
System.out.printf("Testing 'Documented' annotation");
}
}
Inherited annotation
Nếu annotate 1 class với @Inherited, các class con khi extend từ class đó sẽ tự
động kế thừa các properties.
Ta phải implement tất cả các method của parent-interface, bao gồm :
equals(),toString(),hashCode(). Ngoài ra, trong class phải có các phương thức
của lớp cha,dù có thực thi hay không.
Ví dụ :
@ParentObjectDemo
public Class ChildObjectDemo {
}
public class ChildObjectDemo implements ParentObjectDemo {
public boolean isInherited() {
return false;
}
public String showSomething() {
return "";
}
public boolean equals(Object obj) {
return false;
}
public int hashCode() {
return 0;
}
public String toString() {
return "";
}
public Class annotationType() {
return null;
}
}
3.2.4 Sesion Beans
Session bean là một enterprise bean tương tác trực tiếp với người dùng và chứa
các bussiness logic của ứng dụng. Một session bean thể hiện cho một client kết nối tới
enterprise application trên server thông qua việc gọi cái phương thức. Một ứng dụng có
thể có nhiều sesion tùy thuộc vào số lượng người dùng kết nối tới ứng dụng. Một session
bean tương tác với session và chặn các client khác bằng việc xử lý các business-task trên
server. EJB container sẽ hủy session bean sau khi xử lý xong.
Hình 3.5 : Session bean tương tác với client
1. Các loại Session Beans
a. Stateless Session Beans
Trạng thái giao dịch liên kết với một client, gọi là trạng thái đặc trưng cho client
(client-specific state). Trạng thái này gọi là conversation state, thực tế còn bao gồm cả
các kết nối socket, kết nối database, tham chiếu đến bean khác...
Stateless Session Bean được thiết kế để phục vụ cho nhiều client, với những session chỉ
có một request
Stateless Session Bean chỉ có 2 trạng thái:
Does Not Exist: không có thực thể bean tồn tại trong bộ nhớ.
Method-Ready Pool: thực thể bean có mặt trong pool, sẵn sàng phục vụ các triệu
gọi business method từ client
Stateless Session Bean yêu cầu ít resource nên còn gọi là lightweight bean.
b. Stateful Session Bean
Một phiên giao dịch giữa client và bean còn gọi là một conversation. Một Stateful
Session Bean có khả năng lưu lại trạng thái của conversation trong các biến thực thể của
lớp bean xuyên qua các request của conversation. Một ví dụ quen thuộc là shopping cart
dùng để lưu trữ các món hàng đã chọn xuyên qua hàng loạt request chọn hàng (hoặc loại
bỏ hàng đã chọn) của một session mua hàng. Như vậy, Stateful Session Bean chứa trong
nó business logic và trạng thái conversation của client.
Stateful Session Bean được thiết kế để phục vụ cho một client trong đời sống của nó
thông qua một EJB Object.
Stateful Session Bean không có khả năng tự lưu giữ (persistent) giống như entity
bean. Để lưu giữ được trạng thái của conversation như trên, Stateful Session Bean có 3
trạng thái :
Does Not Exits: không tồn tại trong bộ nhớ.
Method-Ready: sẵn sàng phục vụ các yêu cầu từ client được ủy nhiệm (delegate)
bởi EJB Object.
Passivated: thụ động, lưu trữ trạng thái của conversation, sẽ được kích hoạt
(activate) khi cần.
2. Khi nào sử dụng Session Beans
Thông thường, một session bean được sử dụng trong các hoàn cảnh sau:
Khi chỉ có một client kết nối tới bean tại một thời điểm
Khi dữ liệu không còn mang tính ổn định thì bean cũng không còn tồn tại nữa
Khi bean thực thi các dịch vụ trong web.
Stateful session beans được sử dụng khi :
Cần khởi gán khi tạo bean.
Client triệu gọi phương thức nhiều lần.
Cần lưu trữ thông tin client xuyên qua nhiều lần gọi.
Stateless session beans được sử dụng khi :
Khi bean không chứa dữ liệu của client.
Khi chỉ có một phương thức chung giữa nhiều client để thực hiện một công việc
chung.
3. Vòng đời của Session Bean
a. Vòng đời của Stateless Session Bean
EJB Container quản lý các thực thể bean. Khi cần thực thể, thực thể bean được khởi
tạo bằng cách dùng phương thức Class.newInstance() trên lớp bean. Sau đó phương thức
setSessionContext( sc ) của thực thể bean được triệu gọi để thực thể bean nhận tham
chiếu đến đối tượng SessionContext. Thực thể bean cần SessionContext để truy xuất
thông tin môi trường: identity và role của client, transaction context,… Cuối cùng
phương thức ejbCreate() không đối số của bean được EJB Container triệu gọi (chỉ một
lần trong vòng đời của bean). Lúc này bean đã ở trạng thái sẵn sàng thực hiện các yêu cầu
của client do EJB(Local) Object ủy nhiệm (delegate) đến, gọi là trạng thái Method-Ready
Pool.
Do không cần lưu trữ trạng thái giao dịch, Stateless Session Bean không quan tâm đến
việc kích hoạt (activation) bean, container không bao giờ gọi đến các phương thức
callback ejbActivate() và ejbPassivate() của nó. Ra khỏi trạng thái Method-Ready Pool,
bean sẽ rơi vào trạng thái Does Not Exits nghĩa là container không cần nó nữa. Khả năng
lưu trữ của pool là cơ sở để container thu giảm số bean ở trạng thái Method-Ready Pool
bằng phương thức ejbRemove(), giải phóng tài nguyên và hủy bean. Xem phần Instance
swapping phía dưới để hiểu rõ cơ chế.
Hình 3.6: Vòng đời của Stateless Session Beans
b. Vòng đời của Stateful Session Bean
Stateful Session Bean không dùng instance pooling. Ở trạng thái không hoạt động,
thực thể bean bị đẩy khỏi bộ nhớ một cách đơn giản trong lúc EJB Object vẫn còn giữ
liên hệ với client.
Khi phương thức create() của EJB Home được gọi, container triệu gọi phương
thức newInstance() của lớp bean để tạo một thực thể bean mới. Sau đó container triệu
gọi phương thức setSessionContext() để liên kết bean với một SessionContext dùng suốt
vòng đời của nó, lúc này bean sẽ được gán cho một EJB Object. Cuối cùng, container
triệu gọi phương thức ejbCreate()tương ứng với create() của EJB Home. Thực thể bean
bây giờ ở trạng thái Method-Ready.
Để tiết kiệm tài nguyên, khi không phục vụ client, bean có thể chuyển sang trạng thái
Passivated bằng phương thứcejbPassivate(). Bean sẽ trả lại tất cả các tài nguyên đang
mở và đặt các field thành null. Trạng thái của conversation sẽ được lưu, cách lưu trữ tùy
đối tượng.
Hình 3.7: Vòng đời của Stateful Session Bean
Khi có yêu cầu của client đối với một bean đang ở trạng thái Passivated, container sẽ
kích hoạt thực thể bean, khôi phục bean và tham chiếu SessionContext, trạng thái
conversation lưu trữ, … rồi gọi ejbActivate().
Khi phương thức của bean nhận một exception hệ thống, container không dùng EJB
Object và loại bỏ thực thể bean. Bean sẽ chuyển trực tiếp sang trạng thái Does Not Exits,
không gọi phương thức ejbRemove()
4. Các phương thức CallBack
a. Đối với Stateless Session Bean Phương thức void ejbCreate() chỉ có duy nhất một và không tham số vì không
cần khởi tạo trạng thái conversation. Session bean phải có ít nhất một phương thức
ejbCreate(). Thường rỗng do client không triệu gọi đến.
Phương thức void ejbRemove() thường rỗng do client không triệu gọi đến.
Phương thức void ejbPassivate() rỗng vì container không bao giờ thụ động hóa
thực thể bean. Phương thức void ejbActivate() rỗng vì container không bao giờ kích hoạt thực
thể bean. Phương thức void setSessionContext( SessionContext ctx ) thường rỗng vì bean
không có biến thực thể (biến lớp riêng) nên không cần lưu các tham chiếu đến các
biến đó.
b. Đối với Stateful Session Bean Phương thức ejbCreate() khởi gán dữ liệu thành viên, cũng là nơi lưu trữ trạng
thái conversation, cho thực thể bean. Sau khi được tạo, bean có thể ở: Trạng thái Method-Ready, thực hiện các business method phục vụ cho
client. Không cần thiết, sẽ được container chuyển thành trạng thái Passivated.
Chuyển sang trạng thái Does Not Exist do lỗi server hoặc do người dùng
chấm dứt session. Phương thức ejbPassivate() sẽ được container gọi trước khi chuyển bean vào
trạng thái Passivated, lưu trữ trạng thái của conversation. Phương thức này gọi
thực thể bean để giải phóng các tài nguyên liên kết với nó. Container chuyển trạng
thái của bean thành Passivated theo nguyên tắc LRU (Least Recently Used – bean
tồn tại lâu nhất sẽ được chọn để thụ động hóa). Bean ở trạng thái Passivated có
thời gian timeout, quá thời gian này hoặc do lỗi server, bean sẽ bị loại. Phương thức ejbActivate() chuyển bean từ trạng thái Passivated ngược trở lại
trạng thái Method-Ready. Trạng thái của conversation đang lưu trữ sẽ được đọc lại
và bean được khôi phục trước khi container gọi ejbActivate(). Khi kích hoạt bean,
container dùng nguyên tắc JIT (Just-In-Time – tức thời). Phương thức setSessionContext() được container gọi để liên kết một session
context với một bean chỉ định ngay từ đầu vòng đời của bean đó.3.2.5 Message Driven Beans
Message Driven Beans là một bean trong EJB cho phép thực hiện gởi và nhận
những thông điệp bất đồng bộ. Message Driven Bean hoạt động như một Listener cho
JMS API. Vòng đời của Message Driven Bean tương tự như stateless session bean.
Message Driven Bean là một thành phần EJB nên nó thừa hưởng được những thuộc tính
tốt của EJB như: giao tác và bảo mật. Ngoài ra, Message Driven Bean được quản lý bởi
EJB container nên việc tạo ra nhiều thể hiện bean để hỗ trợ nhiều khách hàng cùng lúc
được thực hiện bởi EJB container, đối với các hệ thống JMS bình thường thì điều này đòi
hỏi lập trình viên phải code và xử lý những thao tác phức tạp.
1. Motivations for messaging
Các thành phần của EJB được sử dụng để phát triển các ứng dụng trong mạng máy
tính phân tán. Các máy tính trong mạng máy tính phân tán sử dụng giao thức RMI-IIOP
để giao tiếp với nhau. Giao thức này sử dụng để gọi các thành phần của EJB. RMI-IIOP
chấp nhận các dạng :
Asynchrony : Một dạng RMI-IIOP điển hình, client phải chờ cho đến khi server
xử lý xong và trả về kết quả, sau đó, client sẽ tiếp tục xử lý. Decoupling : RMI-IIOP server phải có thông tin về server đang sử dụng, client có
thể gửi chúng trực tiếp cho các đối tượng tham chiếu. Muốn bỏ đi server thì phải
tác động trực tiếp lên client. Reliability : Dữ liệu có thể mất đi hoặc client không thể thực thi bất kỳ chức năng
nào nếu server hoặc mạng(network) xảy ra lỗi. Support for multiple senders and receivers : Ta có thể sử dụng messaging
server : thay thế cho RMI (remote method invocation) nhưng messaging service sử
dụng bộ trung chuyển (middleman) giữa client và server. Middleman nhận thông
báo từ một hoặc nhiều sender và gửi những thông báo đó tới một hoặc nhiều
receiver. Messaging service không yêu cầu sự phản hồi ngay lập tức từ receiver.
Receiver có thể phản hồi tới sender sau khi xử lý xong.
2. Java Message Services (JMS)
JMS API là một công cụ được phat triển bởi Sun MicroSystems, được sử dụng để
phát triển các ứng dụng lớn. JMS API hổ trợ một framework cho phép phat triển các ứng
dụng một cách thuận tiện.
JMS sử dụng 2 phương thức giao tiếp : đồng bộ và bất đồng bộ, tương ứng với 2 kiểu
model : point-to-point và publish-subcribe.
JMS được cung cấp bới các nhà cung cấp lớn như : IBM,Oracle,Hewlett-Packard,BEA
Systems và Macromedia.
3. JMS API
JMS APIs đóng vai trò quan trọng trong giao thức RMI-IIOP.
Hình 3.8 Hoạt động của JMS
Các bước tạo JMS :
Xác định thể hiện của JMS provider’s ConnectionFactory : thiết lập kết nối bằng
cách sử dụng thể hiện ConnectionFactory để truy cập vào JMS provider. Một bộ
quản lý sẽ được tạo ra và thiết lập ConnectionFactory cho JMS client đang sử
dụng. Tạo kết nối JMS : JMS connection cũng có cách giao tiếp giống như JDBC
connection, sử dụng ConnectionFactory để lấy kết nối.
Tạo JMS sesion : một đối tượng JMS session được sử dụng để gửi/nhận thông báo
và hoạt động giống như một ConnectionFactory. Nó cũng cho phép đóng gói các
thông báo trong quá trình chuyển/nhận thông báo.
Xác định JMS Destination : JMS destination là một đối tượng được gửi/nhận các
thông báo. Tạo JMS producer/consumer : các thông báo được gửi thông các đối tượng(object)
được gọi là JMS producer. Các thông báo nhận được bằng cách gọi các JMS
object, được gọi là JMS Comsumer. Gửi và nhận các thông báo : để nhận một thông báo, đầu tiên khởi tạo chúng, gửi
các thông báo thông qua producer object. Ta có thể nhận các thông báo thông qua
Comsumer object.
4. Messaging Domains
Một tin nhắn hệ thống báo gồm nhiều loại chức năng. JMS API cung cấp nhiều
domain để phản hồi lại. Point-to-Point và Publish/Subscribe là 2 dạng domain được sử
dụng nhiều nhất. 2 dạng trên tuân theo các nguyên tắc sau :
Producer : client chịu trách nhiệm gửi các thông báo tới các Producer
Consumer : client chịu trách nhiệm nhận các thông báo được xem như là
comsumer. Destination : destination là đối tượng được sử dụng bởi client để xác định đối
tượng để gửi/nhận thông báo
5. Point-to-Point (PTP)
Một ứng dụng sử dụng phương thức point-to-point có các tính chất sau:
PTP producer là sender.
PTP comsumer là receiver.
PTP sử dụng hàng đợi giống như một destination.
Một receiver có thể nhận một thông báo đơn lẻ (single message).
6. Publish/Subscribe (pub/sub)
Một ứng dụng sử dụng công nghệ pub/sub có các tính chất sau :
Pub/sub producer là publisher.
Pub/sub comsumer là subcriber.
Pub/sub sử dụng topic như một destination.
Một thông báo có thể có nhiều consumer.
3.3 Java Persistence API 3.3.1 Giới thiệu JPA
JPA là một khái niệm trừu tượng hóa trên JDBC làm cho nó có thể độc lập với SQL. Tất cả các lớp và annotation JPA nằm trong gói javax.persistence. Thành phần chính của JPA gồm có:
Object Relational Mapping (ORM), là một kỹ thuật ánh xạ các đối tượng thành dữ
liệu lưu trữ trong cơ sở dữ liệu quan hệ.
Một Entity Manager thực hiện các hoạt động trên cơ sở dữ liệu như tạo, thêm, xóa,
cập nhật. API này giúp chúng ta tránh phải sử dụng trực tiếp API JDBC.
Java Persistence Query Language (JPQL), cho phép lấy dữ liệu với một ngôn ngữ
truy vấn hướng đối tượng.
Các giao tác và các kỹ thuật locking khi truy xuất dữ liệu đồng thời được cung cấp
bởi Java Transaction API (JTA). Các giao tác cấp tài nguyên (non- JTA) cũng
được hỗ trợ JPA.
Callback và Listener để móc nối bussiness logic vào vòng đời của một đối tượng
persistence.
3.3.2 Kiến trúc JPA
Khái niệm JPA bao gồm ba thành phần
Entity.
Entity Manager.
Entiy Manager Factory.
Lược đồ dưới đây thể hiện các thành phần chính của kiến trúc JPA:
Hình 3.9 Kiến trúc JPA.
a. Entity
Entity là các đối tượng persistence biểu diễn cho một record trong bảng cơ sở dữ liệu. Entity là mộ lớp POJO đơn giản, dễ phát triển. Dưới đây là một số đặc điểm của Entity:
Entity có thể được ánh xạ vào trong cơ sở dữ liệu quan hệ.
Entity được xác định bởi một định danh (tương đương khóa chính của bảng –
primary key).
Entity hỗ trợ xử lý giao tác (transaction).
Entity hỗ trợ kế thừa.
b. Entity Manager
Giao diện EntityManager cung cấp các API cho việc tương tác với Entity. Một số hàm
được cung cấp bởi API EntityManager :
Hình 3.9 Các hàm được cung cấp bởi API Entity Manager
c. Entity Manager Factory
Entity Manager Factory được sử dụng để tạo một thể hiện Entity Manager. Entity
Manager Factory được dùng trong môi trường được quản lý bởi ứng dụng (Application
managed).
3.4 Java Server Faces (JSF)
3.4.1 JavaServer Faces là gì?Hiện nay, có hai công nghệ phổ biến để lập trình một ứng dụng web:
Dạng “rapid development”, phát triển ứng dụng nhanh chóng, cho phép nhà phát triển sử dụng môi trường lập trình trực quan, như Asp.net của Microsoft.
Dạng “hard-core coding”, nhà phát triển cần lập trình với nhiều dòng lệnh hơn để thực hiện những tác vụ bên dưới, như Java EE. (Java Enterprise Edition).
Nhà phát triển gặp nhiều khó khăn trong việc lựa chọn. Java EE là một hệ thống khá hấp dẫn, được hỗ trợ rộng rãi, có thể chạy trên nhiều nền khác nhau, có một cộng đồng hỗ trợ phát triển đông đảo. Mặt khác, Asp.net thì cho phép ta có thể phát triển giao diện người dùng thân thiện mà không cần phải viết nhiều code. Tất nhiên, nhà phát triển muốn cả hai. JSF (JavaServer Faces) mang đến cho ta sự dễ dàng hơn trong việc tạo ra giao diện người dùng ở phía server.
Cũng như lập trình ứng dụng phía client, có thể xem JSF chính là “Swing dành cho ứng dụng server”. So với lập trình JSP (Java Server Pages), thì JSF giúp người lập trình dễ dàng hơn trong nhiều tác vụ mà nếu phát triển bằng JSP cần phải tự viết, ví dụ như xử
lý điều hướng và kiểm tra tính hợp lệ của dữ liệu nhập. Một sự ví von, ta có thể xem servlet và JSP như là “ngôn ngữ assembly” nếu so với framework JSF.
JSF gồm những phần sau:
Một tập những giao diện người dùng (user interface component) đã được xây dựng sẵn.
Mô hình lập trình hướng sự kiện. Mô hình component cho phép các bên phát triển thứ 3 xây dựng bổ sung các
component.
Có những component JSF rất đơn giản, ví dụ như input field hay button. Nhưng cũng có những component thì phức tạp hơn nhiều, ví dụ như: data tables hay trees.
JSF chứa đựng tất cả những đoạn code phục vụ cho việc xử lý sự kiện và tổ chức các component. Lập trình viên không cần phải quan tâm đến những chi tiết đó và có thể tập trung để xử lý các thao tác logic của ứng dụng.
Và quan trọng nhất, JSF chính là một phần của Java EE. Do đó JSF đã được bao gồm trong các Java EE application server (vd: Tomcat), và do đó dễ dàng để có thể chạy được ứng dụng phát triển bằng JSF.
Và hầu hết các môi trường phát triển tích hợp (IDE) ngày nay đều hỗ trợ cho JSF, từ đơn giản cho đến phức tạp, gấp thả các component. Một số IDE hỗ trợ JSF bao gồm: NetBean, JBuilder, Eclipse, JDeveloper…
3.4.2 Các dịch vụ của framework JSF
Hình 3.10 Tổng quan kiến trúc JSF
Hình 3.10 cho ta cái nhìn tổng quan về kiến trúc của JSF. Như có thể thấy, framework JSF có nhiệm vụ tương tác với các thiết bị phía client, và nó cung cấp những công cụ để kết các tầng presentation, application logic và business logic của một ứng dụng web lại với nhau. Tuy nhiên, phạm vi của JSF được giới hạn lại ở tầng presentation. Các dịch vụ khác như web service, databasse persistence nằm ngoài phạm vi của JSF.
Sau đây là các dịch vụ quan trọng mà JSF framework mang lại:
Kiến trúc Model-View-Controller: Tất cả các ứng dụng đều cho phép người sử dụng tạo ra những dữ liệu cụ thể, ví dụ như giỏ hàng (shopping carts), đăng ký vé máy bay... Những dữ liệu như thế được gọi là model. Và nhà lập trình phải tạo ra view cho dữ liệu model đó. Trong lập trình web, HTML (hay những kỹ thuật tương tự) được dùng để tạo ra view. JSF kết nối view và model với nhau, Faces Servlet đóng vai trò như một controller, để cập nhật view cũng như model.
Hình 3.11 Kiến trúc JSF và MVC Chuyển đổi dữ liệu - người dùng nhập dữ liệu vào web form dưới dạng text.
Nhưng đối tượng xử lý muốn dữ liệu ở dạng số, ngày tháng hay một kiểu dữ liệu nào đó. Với JSF thì sự chuyển đổi dữ liệu rất đơn giản.
Xử lý lỗi và kiểm tra tính hợp lệ - với JSF, ta có thể dễ dàng để thêm những luật kiểm tra tính hợp lệ cho các field ví dụ như “field này không được để trống”, “field này phải là số”, … Và tất nhiên, khi người dùng nhập sai, JSF cung cấp cho ta cơ chế hiển thị thông báo lỗi rất đơn giản.
Quốc tế hóa – JSF hỗ trợ chúng ta phát triển ứng dụng đa ngôn ngữ với resource
bundles (tuỳ thuộc vào người dùng ở quốc gia nào thì ứng dụng web của ta sẽ hiện
thị đúng ngôn ngữ của vùng đó).
Custom components – nhà phát triển thứ 3 có thể phát triển những component riêng cho ứng dụng JSF. Ví dụ như Calendar component, sau đó muốn sử dụng ta chỉ việc khai báo một lệnh đơn giản:
<rich:calendar ... inputClass="myFontClass"/>
Hình 3.11 Custom component: Calendar của Jboss.
Chuyển dạng sang các chuẩn khác nhau - mặc định, website được viết bằng JSF sẽ
giải mã sang định dạng HTML để hiện thị lên các trình duyệt web. Nhưng không
khó để có thể mở rộng framework JSF và giải mã nó sang các định dạng khác như
WML hay XUL.
Hình 3.12 Website JSF hỗ trợ nhiều giao thức
Công cụ hỗ trợ - các công cụ hỗ trợ cho JSF không ngừng phát triển và lớn mạnh
trong vài năm gần đây. Có thể tin rằng trong một tương lai không xa, JSF sẽ là một
framework không thể thiếu dùng cho phát triển giao diện người dùng với ứng
dụng web Java.
3.1 JSF Life Cycle
JSF đặc tả 6 pha riêng biệt trong vòng đời của nó, như được mô tả như hình 2.10.
Dòng đi thông thường được vẽ bằng nét liền, dòng đi mở rộng được vẽ bằng nét đứt.
Hình 3.13 Vòng đời JSF
Pha Restore View: tạo mới cây component trong trường hợp trang được yêu cầu lần
đầu, hoặc khôi phục lại cây component nếu nó được gọi trước đó. Nếu trang đã được gọi
trước đó, tất cả các component được khôi phục lại trạng thái trước đó của nó.Có nghĩa là
JSF sẽ tự động lưu lại thông tin trong form. Ví dụ: khi khi người dùng gửi form với thông
tin không chính xác và bị từ trối khi decoding, thì trang web sẽ hiện lại các thông tin
trước đó để người dùng có thể điều chỉnh. Nếu quá trình request về server không chứa bất
cứ dữ liệu nào thì JSF sẽ chuyển thẳng đến pha Render Response. Điều này xảy ra khi
trang web được hiện lên trong lần đầu tiên. Nếu không, pha kế tiếp sẽ được thực thi.
Pha Apply Request Values: trong pha này, JSF sẽ lần lượt đi qua các component trong
cây component. Mỗi đối tượng sẽ kiểm tra dữ liệu nào thuộc về mình và lưu lại dữ liệu
đó. Lưu ý: pha Apply Request Values sẽ lưu các sự kiện xuống hàng đợi (event queue)
khi một nút hay link được bấm, và xử lý ở pha khác.
Pha Process Validation: giá trị string từ người dùng gửi về server sẽ được chuyển
sang kiểu dữ liệu khác, có thể là kiểu object hay bất cứ kiểu nào, giá trị đó được gọi là
“local values”. Khi thiết kế một trang JSF, ta có thể thêm bộ kiểm tra (validator) để kiểm
tra giá trị hợp lệ cho local values. Nếu pha này được thông qua, thì vòng đời sẽ tiếp tục
sang pha kế tiếp. Tuy nhiên, nếu quá trình chuyển đổi và kiểm tra tính hợp lệ xảy ra lỗi,
thì JSF sẽ gọi thẳng đến pha Render Response để hiện lại trang web cho người dùng
chỉnh sửa dữ liệu.
Pha Update Model Values: lúc này, mọi dữ liệu đã được chuyển đổi và kiểm tra tính
hợp lệ, chúng sẵn sàng để cập nhật xuống data model. Và local value được dùng để cập
nhật giữ liệu xuống bean.
Pha Invoke Application: lúc này, các sự kiện action của button hay link component sẽ
được thực thi. Giá trị trả về của các phương thức này sẽ được gửi đến bộ xử lý điều
hướng (navigation handler), và bộ xử lý có nhiệm vụ tìm kiếm trang web kế tiếp sẽ hiển
thi.
Pha Render Response: pha này sẽ mã hóa response và gửi nó vể cho trình duyệt.
Khi người dùng bấm vào một nút hay link thì một request mới được tạo, một vòng đời
mới lại được tiếp tục
CHƯƠNG 4 : GIẢI QUYẾT CÁC VẤN ĐỀ THỰC TẾ
4.1 Xây dựng website bán điện thoại MobileShop Online
Website bán sách online được xây dựng và phát triển trên nền J2EE 5.0 với các công
nghệ con như: EJB3.0,JSP/Servlet… Website được triển khai trên Jboss AS 7.1.1 .
Website bao gồm hai gói chính : gói bán hàng và gói quản lý bán hàng. Gói bán hàng
sẽ cung cấp cho khách hàng nhiều tiện ích cho việc mua hàng trên mạng. Khách hàng có
thể sử dụng website để thông giới thiệu về sách,tìm kiếm sách theo tên,tác giả… Ngoài
ra, khách hàng có thể đăng ký thành viên,đặt hàng online và nhiều tiện ích thú vị khác
như : tham gia đánh giá sản phẩm,so sánh sản phẩm. Hệ thống sẽ đưa ra các nhận
định,đánh giá để tạo sự thuận tiện cho khách hàng trong quá trình mua sách. Với gói quản
lý bán hàng,website sẽ cung cấp các dịch vụ quản lý cho nhà quản lý bao gồm: quản lý
việc mua hàng, quản lý đơn đặt hàng, việc giao hàng, cơ sở dữ liệu….
4.1.1 Khảo sát hệ thống bán hàng hiện có trên mạng
a. Website https://sachweb.com/
Tổng quan về trang web:
Trang web thuộc hệ thống bán sách của nhà xuất bản tổng hợp TP.HCM. Hệ thống bao
gồm các chức năng chính :
Tìm kiếm sách theo từ khóa : theo tựa sách, theo tên sách.
Tìm kiếm nâng cao : tìm kiếm sách theo danh mục sách.
Giới thiệu sách mới,sách hay,sách theo bộ.
Phân loại sách.
Các ebook được download nhiều
Trang chủ :
Hình 4.1 Trang chủ website websach.com
Phần trên cùng hiển thị tìm kiếm,tìm kiếm nâng cao, giỏ hàng.
Phần bên trái phân loại danh mục sách,giúp người dùng lựa chọn loại sách
Phần giữa hiển thị sách mới,sách hay
Phần dưới bên trái hiển thị danh mục các sách miễn phí.
Trang chi tiết sách :
Hình 4.2 Trang chi tiết sách
Hiển thị trang bìa sách
Hiển thị thông tin sách : tác giả,số trang,giá bán
Giới thiệu nội dung sách
Giới thiệu các sách cùng nội dung
Chức năng mua sách
Ý kiến đọc giả
Trang giỏ hàng:
Hình 4.3 Trang giỏ hàng của website websach.com
Liệt kê các sách đã chọn,đã đưa vào giỏ hàng
Chức năng tiếp tục mua sách,xóa sách khỏi giỏ hàng
Hiển thị số tiền của từng cuốn sách,tổng số tiền
Chức năng thanh toán.
b. Website http://www.nxbtre.com.vn/
Tổng quan về website :
Trang web thuộc hệ thống bán hàng trực tuyến của nhà xuất bản trẻ, bao gồm các chức
năng chính :
Tìm kiếm sách theo danh mục
Tìm kiếm nâng cao
Các sách mới nhất
Sách bán chạy
Phân loại sách theo danh mục
Giới thiệu sách.
Tổng quan trang chủ :
Hình 4.4 : Tổng quan trang chủ website nxbtre.com.vn
Phần trên hiển thị các chức năng tìm kiếm
Phần trên cùng giới thiệu các sách tiêu biểu
Phần thân bên trái phân sách theo danh mục
Phần thân giữa hiển thị các sách mới,sách bán chạy
Phần thân dưới hiển thị các tin tức nổi bật về sách
Trang chi tiết sách:
Hình 4.5 : Trang thông tin chi tiết sách trang web nxbtre.com.vn
Trích dẫn nội dung sách
Giới thiệu thông tin sách : tác giả, số trang, giá bán
Viết cảm nhận về sách
Các sách có nội dung liên quan
4.1.2 Yêu cầu của website
4.1.2.1 Mục tiêu
Ứng dụng các công nghệ trên nền J2EE (JSP/Servlet, JSF, EJB, JPA…) để viết một
website bán hàng trực tuyến được gọi là MobileShop Online.Bên cạnh việc ứng dụng
mạng nơ-ron trong việc phân loại khách hàng.Website sẽ có một số yêu cầu sau :
Cho phép khách hàng có thể xem thông tin của sản phẩm cũng như tìm kiếm các
sản phẩm yêu thích của họ.
Cho phép những khách hàng đã đăng ký tài khoản thực hiện các hoạt động mua
hàng trên website (thêm hàng vào giỏ, đặt hàng, thanh toán sản phẩm…)
Cho phép khách hàng thực hiện các hoạt động thông thường khác như so sánh các
sản phẩm, đánh giá sản phẩm, xem bài viết liên quan tới sản phẩm, các thông tin
tin tức, khuyến mãi…
Thực hiện phân loại khách hàng dựa vào thông tin cung cấp và lịch sử mua hàng
của khách hàng.
Chứa năng quản lý website: quản lý cập nhật sản phẩm, cập nhật thông tin, cập
nhật chương trình khuyến mãi.
Chức năng quản lý người dùng, quản lý thông tin.
4.1.2.2 Môi trường phát triển
JDK 1.7
NetBean DEV
EJB3.0
JSP./Servlet
Jboss AS 7.1.1
MySQL database
4.1.2.3 Yêu cầu chức năng
Tìm kiếm sản phẩm : người dùng sẽ nhập vào từ cần tìm kiếm, sau khi nhấn tìm
kiếm, hệ thống sẽ liệt kê sản phẩm có tên như người dùng đã nhập trong trường
hợp sản phẩm đó tồn tại.
Tìm theo tác giả
Tìm theo loại sách
Tìm theo tên sách
Tìm kiếm chuyên sâu: Tìm kiếm nâng cao, bao gồm tìm kiếm nhiều thông tin 1
lúc
Xem thông tin sách
Người dùng sau khi nhấn vào sản phẩm sẽ hiển thị ra thông tin sản phẩm, bao gồm :
Trang bìa
Tác giả
Số trang
Giá sách
Giá khuyến mãi
Trích đoạn nội dung
Các sách có nội dung liên quan.
Quản lý giỏ hàng
Chức năng này được dùng cho khách hàng đã login vào hệ thống (khách hàng
quen thuộc).Trong chức năng này khách hàng có thể thêm sách vào giỏ hàng của
mình hoặc xóa một sách đã tồn tại trong giỏ hàng, xem thông tin giỏ hàng, cập nhật số
lượng sản phẩm trong giỏ hàng.
Đặt hàng : Cho phép khách hàng đặt hàng từ thông tin trong giỏ hàng. Hệ thống
cung cấp các hình thức thanh toán :
Qua bưu điện
Chuyển khoản
Thanh toán trực tiếp khi nhận hàng
So sánh sản phẩm
Cho phép người dùng có thể xem so sánh tính năng giữa các sản phẩm.Ở đây, qui
định số sản phẩm so sánh tối đa là 3 sản phẩm.
Đánh giá sản phẩm
Chức năng này dùng cho khách hàng đã đăng nhập vào hệ thống. Thông tin đánh
giá bao gồm : tiêu đề của đánh giá, nội dung, ưu điểm, khuyết điểm, mức điểm đánh
giá (tối đa 10 điểm).
Đăng ký thành viên
Cho phép khách hàng đăng ký làm thành viên của hệ thống.
Đăng nhập và đăng xuất.
Cho phép thành viên có thể đăng nhập, đăng xuất với tài khoản đã đă ký
Quản lý thông tin người dùng
Người dùng có thể thay đổi thông tin tài khoản thông qua trang web quản lý thông tin
người dùng.
Quản lý người dùng
Cho phép quản trị viên có thể quản lý thành viên, sủa đổi thông tin người dùng, cấp
quyền, cấp lại mật khẩu trong trường hợp cần thiết.
Quản lý tin tức
Chức năng này được sử dụng cho người quản lý tin tức (news manager).Người
quản lý tin tức có thể thêm mới tin tức, cập nhật nội dung tin tức, xóa tin đã tồn tại.
Tuy nhiên việc thêm, cập nhật hay xóa sau đó phải được chuyển đến người quản lý
cao hơn và phải được xác nhận của người này thi tin đó mới hoạt động chính thức.
Hình thức này cũng giống như trong tòa soạn báo, bài viết của phóng viên phải qua
kiểm duyệt của tổng biên tập mới chính thức được đăng tin.
Quản lý chương trình khuyến mãi
Chức năng này được sử dụng cho người quản lý khuyến mãi.Chức năng hoàn toàn
tương tự như chức năng quản lý tin tức, tức là mọi hoạt động bên quản lý khuyến mãi
cũng đều phải qua kiểm duyệt.
Quản lý sản phẩm
Chức năng này được dùng cho người quản lý sản phẩm.Người quản lý sản phẩm có
thể thêm mới một sản phẩm, cập nhật thông tin sản phẩm, xóa sản phẩm đã tồn
tại.Cũng tương tự như quản lý tin, sản phẩm phải được duyệt trước khi cho lên trang
web.
Quản lý bài viết sản phẩm
Chức năng được dùng cho người quản lý bài viết sản phẩm.Chức năng này tương tự
như chức năng quản lý tin tức
Quản lý khác
Chức năng này được dùng cho người quản lý cấp cao (senior manager). Chức
năng này bào gồm: quản lý việc thêm, xóa, cập nhật các tính năng sản phẩm; quản
lý việc thêm, xóa, cập nhật hãng sản xuất, phong cách, kiểu dáng, phân lớp sản
phẩm.
Quản lý tài nguyên
Tài nguyên ở đây bao gồm sản phẩm, tin tức, khuyến mãi.Chức năng này
được dùng cho người quản lý cấp cao (senior manager).Người này đóng vai trò như
tổng biên tập, quyết định một trong các tài nguyên trên được phép hoạt động hay
không khi có sự thay đổi từ các bộ phận quản lý chuyên dụng hơn.
Quản lý đánh giá sản phẩm
Cho phép đánh giá có hiệu lực và hiển thị cho khách hàng khi xem thông tin
sản phẩm. Hoặc xóa những đánh giá không hợp lệ
Quản lý hóa đơn:
Chức năng này cho phép nhân viên quản lý việc bán hàng của hệ thống. Việc
quản lý hóa đơn bao gồm những chức năng như: cập nhật hóa đơn, xóa những hóa
đơn không hợp lệ, đóng những hóa đơn đã thanh toán, gởi email cho khách hàng.
4.1.3 Mô hình hóa yêu cầu
4.1.3.1 Mô hình Usecase
4.1.3.1.1 Các Actor trong hệ thống
uc Actor
Admin
Guest
News Manager
Order Manager
Senior Manager
Product Manager
member
Hình 4.6 : Các actor trong hệ thống
Mô tả:
Admin: là người quản trị hệ thống.
Senior Manager:
Là người chuyên chịu trách nhiệm về việc xuất bản tin tức, sản phẩm và các
thông tin về sách.
Quản lý việc cập nhật các nội dung chung như: nhà xuất bản , phân loại sách,
trích đoạn sách, chương trình khuyến mãi…
Order Manager:
Quản lý hóa đơn mua hàng của khách hàng như: Cập nhật thông tin giao hàng,
thông tin khách hàng, thanh toán hóa đơn, đóng hóa đơn, xóa hóa đơn không hợp
lệ.
News Manager:
Quản lý việc cập nhật các tin tức của website, các chương trình khuyến mãi. Các
thông tin sẽ được Senior Manager kiểm duyệt trước khi có hiệu lực hiển thị cho
phía khách hàng.
Product Manager:
Quản lý việc cập nhật sản phẩm, phụ kiện và các chương trình khuyến mãi của
sản phẩm. Các thông tin này sẽ được Senior Manager kiểm duyệt trước khi có
hiệu lực hiển thị cho phía khách hàng.
Guest
Là người sử dụng hệ thống nhưng không đăng nhập hệ thống. Sử dụng các chức
năng cơ bản của hệ thống : Xem thông tin sản phẩm, quản lý giỏ hàng, tìm kiếm
sách , nhận xét.
Member:
Là sử dụng người hệ thống đã đăng nhập vào hệ thống, có thể sử dụng các chức
năng của thành viên như: Đánh giá sách, đặt hàng….
4.1.3.2 Biểu đồ Usecase Diagram
a. Gói bán hàng
uc function
Member
Guest
manage profile
rate product
forgot password
change password change profile
Login
v iew news
compare product
registor
v iew product info
search
find by name
find by author
find by category
manage cart
check out
delete product
add product
«extend» «extend»
«include»
«include»
«extend»«extend»
«extend»
«include»
«extend»
«extend»
«extend»
hình 4.7 : Lược đồ các chức năng trong gói bán hàng
b. Gói quản lý
uc quanly
NEWS maganer
product manager
Senior manager
Order manager
Admin
manage news
manage product content
manage general content
manage orders
manage user
Login
«include»
«include»
«include»
«include»
«include»
Hình 4.8 : Lược đồ gói quản lý
Usecase quản lý tin tức
uc manage NEWS
NEWS manager
manage general NEWS
add NEWS delete NEWS
modify NEWS
login
«extend» «extend»
«extend»
«include»
Hình 4.9 : Usecase quản lý tin tức
Usecase quản lý đặt hàng uc manage order
Order manager
add book into order delete book from order
order
login
manage order
«extend» «extend»
«extend»
«include»
Hình 4.10 : Usecase quản lý đơn đặt hàng Usecase quản lý sách
uc manage product
product manager
manage product
add product delete product
modify product
login
«extend» «extend»
«extend»
«include»
Hình 4.11: Usecase quản lý sách
Usecase quản lý user uc manager user
Admin
manage user
change info delete user
create user
login
«extend» «extend»
«extend»
«include»
Hình 4.12: Usecase quản lý user
Usecase quản lý chương trình khuyến mãi uc manage promotion
senior manager
manage promotion
add promotion delete promotion
change promotion
modify promotion
re-open promotionlogin
«include»
«extend» «extend»
«extend»
«extend»
«extend»
Hình 4.13 Usecase quản lý chương trình khuyến mãi
4.1.3.3 Mô tả Usecase
Quản lý đơn đặt hàng:
Cập nhật đơn đặt hàng (Update Order)
UseCase Update OrderMô tả vắn tắt Use case này cho phép actor yêu cầu chỉnh sữa thông tin
của một hóa đơn mở (chưa thanh toán).Các Actor liên quan
Admin, Order Manager
Điều kiện tiên quyết
Actor đã đăng nhập vào hệ thống.
Luồng sự kiện chính
1. Use case bắt đầu khi actor yêu cầu hệ thống cập nhật một hóa đơn mở.
2. Actor sửa đổi thông tin của hóa đơn.3. Actor nhấn nút Cập nhật.4. Hệ thống kiểm tra dữ liệu hợp lệ.
A1: dữ liệu hợp lệ.5. Hệ thống cập nhật dữ liệu đã sửa vào cơ sở dữ liệu.6. Hệ thống thông báo cập nhật thành công.
Luồng phụ A1: dữ liệu không hợp lệ1. Hệ thống thông báo dữ liệu không hợp lệ.2. Trở lại luồng chính ở bước 2.
Kết quả sau khi usecase thực hiện
Nếu use case thành công thì thông tin của hóa đơn này sẽ được cập nhật trong cơ sở dữ liệu .
Bảng 4-1 Usecase Update Order
Xóa đơn đặt hàng (Delete Order)
UseCase Delete OrderMô tả vắn tắt Use case này cho phép actorxóa mộthóa đơn mở trong cơ
sở dữ liệu.Các Actor liên quan
Admin
Điều kiện tiên quyết
Actor đã đăng nhập vào hệ thống.
Luồng sự kiện chính
1. Use case bắt đầu khi actor yêu cầu hệ thống xóa một hóa đơn.
2. Actor chọn hóa đơn cần xóa.3. Actor nhấn nút xóa để hệ thống xóa hóa đơn.4. Hệ đưa ra xác nhận xóa hóa đơn
A1: Không xóa hóa đơn5. Actor xác nhận xóa6. Hệ thống tiến hành xóa hóa đơn khỏi cơ sở dữ liệu7. Thông báo kết quả
Luồng phụ A1: Không xóa hóa đơn1. Hệ thống hủy thao tác xóa hóa đơn
Kết quả sau khi usecase thực hiện
Nếu use case thành công thì hóa đơn này sẽ được xóa khỏi cơ sở dữ liệu.
Bảng 4-2 Usecase Delete Order
Thanh toán hóa đơn (Close Order)
UseCase Close OrderMô tả vắn tắt Use case này cho phép actor yêu cầu đóng hóa đơn đã
thanh toán.Các Actor liên quan
Admin, Order Manager
Điều kiện tiên quyết
Actor đã đăng nhập vào hệ thống.
Luồng sự kiện chính
1. Use case bắt đầu khi actor yêu cầu hệ thống đóng một hóa đơn.
2. Hệ thống cập nhật trạng thái cho hóa đơn là đã thanh toán và vô hiệu hóa mọi thao tác trên hóa đơn này
3. Hệ thống thông báo kết quả bước 2.Luồng phụ Không cóKết quả sau khi usecase thực hiện
Nếu use case thành công thì thông tin của hóa đơn này sẽ được cập nhật trong cơ sở dữ liệu trạng thái là ‘đã thanh toán’
Bảng 4-3 Usecase Close Order
Quản lý sách :
Thêm một sản phẩm (Add new product)
UseCase Add new productMô tả vắn tắt Use case này cho phép actor thêm mới sảm phẩm vào cơ
sở dữ liệuCác Actor liên quan
Product manager, senior manager
Điều kiện tiên quyết
Actor đã đăng nhập vào hệ thống
Luồng sự kiện chính
1. Use case bắt đầu khi actor yêu cầu hệ thống thêm mới sản phẩm.
2. Actor nhập thông tin sản phẩm.3. Actor nhấn nút “thêm sản phẩm”.4. Hệ thống kiểm tra dữ liệu hợp lệ.
A1: dữ liệu không hợp lệ5. Hệ thống tiến hành thêm dữ liệu sản phẩm vào cơ sở
dữ liệu.6. Hệ thống thông báo thêm thành công nếu giao dịch
thành công.Luồng phụ A1: dữ liệu không hợp lệ.
1. Hệ thống thông báo dữ liệu không hợp lệ.2. Trở lại luồng chính ở bước 2.
Kết quả sau khi usecase thực hiện
Nếu use case thành công thì hệ thống sẽ thêm một sản phẩm mới vào bảng “product” trong cơ sở dữ liệu và cập nhật trạng thái của sản phẩm là “mới tạo”.
Bảng 4-4 Usecase Add new product
Cập nhật sản phẩm (Modify an available product)
UseCase Modify an available productMô tả vắn tắt Use case này cho phép actor chỉnh sửa các sản phẩm đã có
trong cơ sở dữ liệu.Các Actor liên quan
Product manager, senior manager.
Điều kiện tiên quyết
Actor đã đăng nhập vào hệ thống.
Luồng sự kiện chính
1. Use case bắt đầu khi actor yêu cầu hệ thống cập nhật.2. Actor sửa đổi thông tin sản phẩm.3. Actor nhấn nút Cập nhật.4. Hệ thống kiểm tra dữ liệu hợp lệ.
A1: dữ liệu hợp lệ.5. Hệ thống cập nhật dữ liệu đã sửa vào cơ sở dữ liệu.6. Hệ thống thông báo cập nhật thành công.
Luồng phụ A1: dữ liệu không hợp lệ1. Hệ thống thông báo dữ liệu không hợp lệ.2. Trở lại luồng chính ở bước 2.
Kết quả sau khi usecase thực hiện
Nếu use case thành công thì sản phẩm này sẽ cập nhật trạng thái của sản phẩm thành “đang cập nhật” và cập nhật vào bảng “product_management” trong cơ sở dữ liệu.
Bảng 4-5 Usecase Modify an available product
Xóa sản phẩm (Delete an available product)
UseCase Delete an available productMô tả vắn tắt Use case này cho phép actor xóa tạm thời sản phẩm trong
cơ sở dữ liệu( thực chất là việc thay đổi trạng thái của sản phẩm thành “đã xóa”).
Các Actor liên quan
Product manager, senior manager.
Điều kiện tiên quyết
Actor đã đăng nhập vào hệ thống.
Luồng sự kiện chính
1. Use case bắt đầu khi actor yêu cầu hệ thống xóa sản phẩm.
2. Actor chọn sản phẩm cần xóa.3. Actor nhấn nút xóa để hệ thống xóa sản phẩm.4. Hệ thống gởi yêu cầu xác nhận5. User xác nhận xóa sản phẩm
A1: User xác nhận không xóa sản phẩm.6. Hệ thống thực hiện xóa tạm thời sản phẩm(cập nhật
trạng thái sản phẩm thành “đã xóa”).7. Hệ thống thông báo xóa thành công.8. Hoàn tất.
Luồng phụ A1: User xác nhận không xóa sản phẩm.1. Hệ thống hủy yêu cầu xóa2. Trở lại luồng chính ở bước 8.
Kết quả sau khi usecase thực hiện
Nếu use case thành công thì sản phẩm sẽ được cập nhật trạng thái “đã xóa” và cập nhật vào bảng “product_management” trong cơ sở dữ liệu.
Bảng 4-6 Usecase Delete an available product
Quản lý tin tức
Thêm tin tức (Add News)
UseCase Add NewsMô tả vắn tắt Use case này cho phép actor thêm mới tin tức vào cơ sở dữ
liệuCác Actor liên quan
News Manager, Senior Manager, Admin
Điều kiện tiên quyết
Actor đã đăng nhập vào hệ thống
Luồng sự kiện chính
1. Use case bắt đầu khi actor yêu cầu hệ thống thêm mới tin tức.
2. Actor nhập thông tin của tin tức.3. Actor nhấn nút “lưu tin tức”.4. Hệ thống kiểm tra dữ liệu hợp lệ.
A1: dữ liệu không hợp lệ5. Hệ thống tiến hành thêm dữ liệu tin tức vào cơ sở dữ
liệu.6. Hệ thống thông báo thêm thành công nếu giao dịch
thành công.Luồng phụ A1: dữ liệu không hợp lệ.
1. Hệ thống thông báo dữ liệu không hợp lệ.2. Trở lại luồng chính ở bước 2.
Kết quả sau khi usecase thực hiện
Nếu use case thành công thì hệ thống sẽ thêm một tin tức mới vào cơ sở dữ liệu và cập nhật trạng thái của tin tức là “mới tạo”.
Bảng 4-7 Usecase Add news
Cập nhật tin tức (Modify an available News)
UseCase Modify available NewsMô tả vắn tắt Use case này cho phép actor chỉnh sửa các tin tức đã có
trong cơ sở dữ liệu.Các Actor liên quan
News Manager, Senior Manager, Admin
Điều kiện tiên quyết
Actor đã đăng nhập vào hệ thống.
Luồng sự kiện chính
9. Use case bắt đầu khi actor yêu cầu hệ thống cập nhật một tin tức.
10. Actor sửa đổi thông tin của tin tức.11. Actor nhấn nút Cập nhật.12. Hệ thống kiểm tra dữ liệu hợp lệ.
A1: dữ liệu hợp lệ.13. Hệ thống cập nhật dữ liệu đã sửa vào cơ sở dữ liệu.14. Hệ thống thông báo cập nhật thành công.
Luồng phụ A1: dữ liệu không hợp lệ1. Hệ thống thông báo dữ liệu không hợp lệ.2. Trở lại luồng chính ở bước 2.
Kết quả sau khi usecase thực hiện
Nếu use case thành công thì tin tức này sẽ được cập nhậtvào một bảng NewsManagement trong cơ sở dữ liệu và cập nhật trạng thái của sản phẩm thành “đang cập nhật” trong bảng TheNews.
Bảng 4-8 Usecase Modify an available news
Xóa tin tức (Delete an available News)
UseCase Delete available NewsMô tả vắn tắt Use case này cho phép actor xóa tạm thời tin tức trong
cơ sở dữ liệu( thực chất là việc thay đổi trạng thái của tin tức thành “đã xóa”).
Các Actor liên quan News Manager, Senior Manager, AdminĐiều kiện tiên quyết Actor đã đăng nhập vào hệ thống.Luồng sự kiện chính 15. Use case bắt đầu khi actor yêu cầu hệ thống xóa tin
tức.2. Actor chọn tin tức cần xóa.3. Actor nhấn nút xóa để hệ thống xóa tin tức.4. Hệ đưa ra xác nhận xóa tin tức
A1: Không xóa tin tức.1. Actor xác nhận xóa2. Hệ thống tiến hành cập nhật trạng thái tin tức là
“đang được xóa”.Luồng phụ A1: Không xóa tin tức
1. Hệ thống hủy thao tác xóa tin tứcKết quả sau khi usecase thực hiện
Nếu use case thành công thì tin tức này sẽ được cập nhật trạng thái là “đang được xóa”
Bảng 4-9 Usecase Delete an available news
Quản lý người dùng Thêm người dùng (Add User)
UseCase Add UserMô tả vắn tắt Use case này cho phép actor thêm mới một User vào cơ sở
dữ liệuCác Actor liên quan
Admin
Điều kiện tiên quyết
Actor đã đăng nhập vào hệ thống
Luồng sự kiện chính
1. Use case bắt đầu khi actor yêu cầu hệ thống thêm mới User.
2. Actor nhập thông tin của và vai trò cảuUser.3. Actor nhấn nút “lưu”.4. Hệ thống kiểm tra dữ liệu hợp lệ.
A1: dữ liệu không hợp lệ5. Hệ thống tiến hành thêm dữ liệu User vào cơ sở dữ liệu.6. Hệ thống thông báo thêm thành công nếu giao dịch
thành công.Luồng phụ A1: dữ liệu không hợp lệ.
1. Hệ thống thông báo dữ liệu không hợp lệ.2. Trở lại luồng chính ở bước 2.
Kết quả sau khi usecase thực hiện
Nếu use case thành công thì hệ thống sẽ thêm thông tin một User vào cơ sở dữ liệu
Bảng 4-10 Use case Add user
Cập nhật người dùng (Modify User)
UseCase Modify UserMô tả vắn tắt Use case này cho phép actor chỉnh sửa thông tin và vai trò
User.Các Actor liên quan AdminĐiều kiện tiên quyết Actor đã đăng nhập vào hệ thống.Luồng sự kiện chính
1. Use case bắt đầu khi actor yêu cầu hệ thống cập nhật một User.
2. Actor sửa đổi thông tin của User.3. Actor nhấn nút Cập nhật.4. Hệ thống kiểm tra dữ liệu hợp lệ.
A1: dữ liệu hợp lệ.5. Hệ thống cập nhật dữ liệu đã sửa vào cơ sở dữ liệu.6. Hệ thống thông báo cập nhật thành công.
Luồng phụ A1: dữ liệu không hợp lệ1. Hệ thống thông báo dữ liệu không hợp lệ.2. Trở lại luồng chính ở bước 2.
Kết quả sau khi usecase thực hiện
Nếu use case thành công thì thông tin User này sẽ được cập nhật trong cơ sở dữ liệu .
Bảng 4-11Usecase Modify user
Xóa người dùng (Delete User)
UseCase Delete UserMô tả vắn tắt Use case này cho phép actor xóamột Usertrong cơ sở dữ
liệu.Các Actor liên quan AdminĐiều kiện tiên quyết Actor đã đăng nhập vào hệ thống.
Luồng sự kiện chính
1. Use case bắt đầu khi actor yêu cầu hệ thống xóa một User.
2. Actor chọn User cần xóa.3. Actor nhấn nút xóa để hệ thống xóa User.4. Hệ đưa ra xác nhận xóa User
A1: Không xóa User5. Actor xác nhận xóa6. Hệ thống tiến hành xóa User khỏi cơ sở dữ liệu7. Thông báo kết quả
Luồng phụ A1: Không xóa User1. Hệ thống hủy thao tác xóa User
Kết quả sau khi usecase thực hiện
Nếu use case thành công thì User này sẽ được xóa khỏi cơ sở dữ liệu.
Bảng 4-12 Usecase Delete user
Gói bán hàng Thêm hàng vào giỏ hàng (Add product to cart)
UseCase Add product to cartMô tả vắn tắt Use case này cho phép actor thêm một sản phẩm vào
trong giỏ hàng.Các Actor liên quan Guest, Member.Điều kiện tiên quyết Không có.
Luồng sự kiện chính 1. Use case bắt đầu khi actor yêu cầu hệ thống thêm sản phẩm vào giỏ hàng.
2. Actor yêu cầu hệ thống thêm sản phẩm vào giỏ hàng bằng cách nhấn nút đặt hàng trên sản phẩm.A1: Sản phẩm đã tồn tại trong giỏ hàng.A2: Sản phẩm chưa tồn tại trong giỏ hàng.
3. Hệ thống cập nhật sản phẩm và hiển thị thông tin đặt hàng của sản phẩm trong trang giỏ hàng.
4. Kết thúc.Luồng phụ A1: Sản phẩm đã tồn tại trong giỏ hàng
1. Hệ thống cập nhật số lượng của sản phẩm tăng thêm 1 đơn vị
A2: Sản phẩm chưa tồn tại trong giỏ hàng1. Hê thống thêm sản phẩm vào danh sách sản
phẩm của giỏ hàngKết quả sau khi usecase thực hiện
Nếu use case thành công hệ thống cập nhật thông tin sản phẩm trong giỏ hàng
Bảng 4-13 Usecase Add product to cart
Xóa hàng khỏi giỏ hàng (Delete product from cart)
UseCase Delete product from cartMô tả vắn tắt Use case này cho phép actor xóa một sản phẩm khỏi
giỏ hàng.Các Actor liên quan Guest, Member.Điều kiện tiên quyết Không có.
Luồng sự kiện chính 1. Use case bắt đầu khi actor yêu cầu hệ thống xóa sản phẩm khỏi giỏ hàng.
2. Actor chọn sản phẩm cần xóa khỏi giỏ hàng và nhấn nút xóa.
3. Hệ thống gởi yêu cầu xác nhận xóa sản phẩm.4. Actor xác nhận xóa sản phẩm5. Sản phẩm được xóa khỏi giỏ hàng6. Kết thúc.
Luồng phụ Không cóKết quả sau khi usecase thực hiện
Nếu use case thành công hệ thống sẽ xóa thông tin sản phẩm khỏi giỏ hàng.
Bảng 4-14 Usecase Delete product from cart
Đặt hàng (Place an order)
UseCase Place an orderMô tả vắn tắt Use case này cho phép thanh toán đơn đặt hàng của
khách hàngCác Actor liên quan Member.Điều kiện tiên quyết Member đã đăng nhập.
Luồng sự kiện chính 1. Use case bắt đầu khi actor yêu cầu hệ thống thanh toán đơn đặt hàng.
2. Actor nhấn nút thanh toán đơn hàng trong giỏ hàng.
3. Hệ thống kiểm tra giỏ hàng.A1: Giỏ hàng có sản phẩm.A2: Giỏ hàng rỗng.
4. Actor nhập các thông tin cần thiết trong đơn đặt hàng.
5. Hệ thống kiểm tra thông tin hợp lệ.A3: Thông tin hợp lệ.
A4: Thông tin không hợp lệ.6. Actor xác nhận đặt hàng.7. Hệ thống lưu thông tin đơn đặt hàng vào cơ sở
dữ liệu và thông báo đặt hàng thành công.8. Kết thúc
Luồng phụ A1: Giỏ hàng có sản phẩm.1. Hệ thống chuyển đến trang đặt hàng sản phẩm.2. Trở lại luồng chính ở bước 4.
A2: Giỏ hàng rỗng.1. Hệ thống xuất thông báo lỗi đặt hàng.2. Trở lại luồng chính ở bước 8.
A3: Thông tin hợp lệ.1. Hệ thống yêu cầu xác nhận đặt hàng.2. Trở lại luồng chính ở bước 6.
A4: Thông tin không hợp lệ.1. Hệ thống thông báo lỗi.2. Trở lại luồng chính ở bước 4.
Kết quả sau khi usecase thực hiện
Nếu use case thành công hệ thống sẽ lưu thông tin đơn đặt hàng vào cơ sở dữ liệu.
Bảng 4-15 Usecase Place an order
4.1.3.4 Mô hình Sequence Diagram
Gói quản lý :
Quản lý đơn đặt hàng : Update order
sd update order
Order manager
OrderManagement
pageOrderController
:OrderBean
:Order
Update Orderpage
loop
[invalid]
alt
[invalid]
click update the order()call update navigation()
navigate()
modify order info()
submit()
validate()
error()
call update method()
updateOrder(order) :boolean
updateOrder(order) :boolean
success()
Hình 4-4 Lược đồ Sequence cho Usecase Update order
Delete ordersd delete order
Order manager
OrderManagement
pageOrderController
:OrderBean
:Order
select orders()
click delete()
deleteOrder(List<Order> orders)
deleteOrder(List<Order> orders)
deleteOrder(List<Order> orders)
success()
Hình 4-5 Lược đồ Sequence cho Usecase Delete order
Quản lý người dùng : Add user
sd Create an user
Admin
UserManagement
AddUser
User Role
alt
[user is avilable]
[user is not available]
alt
[pass is not equa with re-pass]
loop
add an user()CreatePage()
Enter User + Pass + Re-Pass()
validate pass()
password fail()
correct pass()
submit()
Read user()
a list of user()
check user()
Save(user,pass)
Select Roles()Save(user,List<Roles>)
fail()
Hình 4-6 Lược đồ Sequence cho Usecase Add user
Modify user sd Modify an user
Admin
frmUserManagement
frmUpdateUser
User Role
opt
[Modify Roles]
alt
[newpass equa re-newpass]
[ELSE]
opt
[Change Pass]
alt
[user is available]
[ELSE]
opt
[change UserName]
Modify an user()CreatePage()
select an user()
Select role()
submit()Update(user,l ist<Role>)
Enter pass + newpass + re-newpass()
validate pass()
Update(user, newPass)
pass not valid()
Enter new User Name()
read users()
a list of user()
check user()
Update(user, newUser)
successful()
fail()
Hình 4-7 Lược đồ Sequence cho Usecase Modify user
Delete user
sd Delete an User
Admin User Role
frmAdminManagement
frmUserManagement
alt
[Press OK]
[Press Cancel]
Delete an User()CreatePage()
Select an User()
Delete()
Dialog confirm()
OK() Delele Roles(user)
Delele an user(user)
Cancel()
Hình 4-8 Lược đồ sequence cho usecase Delete user
Quản lý sản phẩm Add new product
sd add new product
Product Manager
(from MobileShop)
ProductManagementpage
AddNewProductpage
:ProductController :ProductBean
Product
alt checkValid
[valid]
loop
[invalid]
alt
[unavailable]
[available]
click add new product()
redirect()
input_product_info()
checkValid()
fail()
input again()
send_product_info()
getProducts() :List<Product>
getProducts() :List<Product>
return list()
checkAvailability(product)
addProduct(product) :boolean
addProduct(product) :boolean
success()
return false()
fail()
Hình 4-9 Lược đồ Sequence cho Usecase Add new product
Modify an available productsd modify av ailable product
Product Manager
(from MobileShop)
ProductManagementpage
modifyProductform
:ProductController :ProductBean
Product
alt check v alid
[valid]
[invalid]
properties include product's name, company's name, image, price, model, style, product classification, waranty time, features, special features
post properties information to controller
modifyProduct()
redirect()
input properties that need to change()
clickUpdate()
checkValid()
send_product_info()
updateProduct(Product)
updateProduct()
successful()
error_message()
Hình 4-10 Lược đồ Sequence cho Usecase Modify an available product
Delete an available productsd delete av ailable product
Product Manager
(from MobileShop)
ProductManagementpage
:ProductController :ProductBean
Product
alt confirm
[ok]
[cancel]
delete_product()
confirmDelete() :boolean
ok()
sendProductID()
getProductByID(productID) :Product
getProductByID(productID) :Product
return product()
deleteProduct(product) :boolean
setDeleteProduct(product) :boolean
success()
cancel()
stop()
Hình 4-11 Lược đồ Sequence cho Usecase Delete an available product
Quản lý tin tức Add news
sd add news
News Manager
NewsManagement
pageNewsController
News page
:NewsBean
:News
loop
[invalid]
alt
[invalid]
click add news()
call navigation to add news()
input news info()
submit()
validate info()
error()
send news info()
addNews(news) :boolean
addNews(news) :boolean
success()
Hình 4-12 Lược đồ Sequence cho Usecase Add news
Modify an availale newssd modify av ailable news
News Manager
NewsManagement
pageNewsController
Update newspage
:NewsBean
:News
alt
[invalid]
loop
[invalid]
click modify news()
call update news()
loadNews(newsID) :News
loadNews(newsID) :News
modify news info()
submit()
validate()
error()
send news info()
updateNews(news) :boolean
updateNews(news) :boolean
return()
success()
Hình 4-13 Lược đồ Sequence cho Usecase Modify an available news
Delete an availale newssd delete av ailable news
News Manager
:NewsBean
:News
NewsManagement
pageNewsController
select news()
click delete()
call deleteNews method()
deleteNews(List<News> news) :boolean
deleteNews(List<News> news) :boolean
success()
Hình 4-14 Lược đồ Sequence cho Usecase Delete an available news
Quản lý giỏ hàng Add product to cart
sd add product to cart
:patron
Cart page
:CartControllerProductDetailpage
CartItem
alt av ailable
[true]
[false]
add product to cart()
sendProductID()
checkAvailabil ity(productID) :boolean
updateQuantity(cart) :boolean
addProduct(cart) :boolean
display()
Hình 4-15 Lược đồ Sequence cho Usecase Add product to cart
Delete product from cart
sd delete product from cart
Member
Cart page
CartItemCartController
CartBean
alt
[cancel]
select product to delete()
click delete()
confirm()end()
call delete method()
deleteProduct(product)
deleteProduct(product)
success()
Hình 4-16 Lược đồ Sequence cho Usecase Delete product from cart
Place an ordersd Place an order
patron
frmCartManager
frmOrder
OrderValidator
info = (name, address, company name, tax code, gender, phone, cellphone, email, Identified Code, check type, transport type, requirements)
loop
required : name, address, email, Identified code.valid: email, identified code.
opt
opt
Place an order()
CreateForm()
Enter infos ()
validate info()
send Email()
verify email()email verifying result()
invalid inputs()
correct infos()
erase()
Send oder()
Show infos()
confirm()
Save order()
return result()return result()
Hình 4-17 Lược đồ Sequence cho Usecase Place an order
4.1.3.5Class Diagram
Lược đồ lớp cho chức năng Manage product :
class product
Serializable
Product
- accessories: String- accessoriesSet: List<Accessory>- article: String- articleImages: List<ArticleImage>- cellRight: boolean- check: boolean- company: Company- createdate: Date- currentCount: int- detailOrderProducts: List<DetailOrderProduct>- fromdate: Date- gender: Boolean- hot: Boolean- id: int- importdate: String- isnew: Boolean- largeImage: String- model: Model- newProduct: boolean- orderCount: int- price: double- productAlbums: List<ProductAlbum>- productClassification: ProductClassification- productEvaluations: List<ProductEvaluation>- productFeatures: List<ProductFeature>- productid: String- productname: String- promotions: List<Promotion>- publish: Boolean- serialVersionUID: long = 1L {readOnly}- slock: Boolean- smallImage: String- specialFeatures: String- status: int- style: Style- todate: Date- updatedate: Date- userCreator: String- userUpdate: String- warranty: String
ProductBean
- em: EntityManager+ LOG: Logger = Logger.getLogge...
+ addArticleImage(ArticleImage) : boolean+ addProduct(Product) : boolean+ addProductAccessory(ProductAccessory) : boolean+ addProductAlbum(ProductAlbum) : boolean+ deleteArticleImage(ArticleImage) : boolean+ deleteProduct(Product) : boolean+ deleteProductAlbum(ProductAlbum) : boolean+ getAllProducts() : List<Product>+ getArticleImages(int) : List<ArticleImage>+ getHotProducts() : List<Product>+ getProductAlbumByImageID(int) : ProductAlbum+ getProductAlbumByProductID(int) : List<ProductAlbum>+ getProductByClassificationID(int) : List<Product>+ getProductByCompanyID(String) : List<Product>+ getProductByID(int) : Product+ getProductByModelID(int) : List<Product>+ getProductByName(String) : List<Product>+ getProductByProductID(String) : Product+ getProductByQuery(String) : List<Product>+ getProductByStyleID(int) : List<Product>+ ProductBean()+ updateProduct(Product) : boolean
«interface»ProductBeanRemote
+ addArticleImage(ArticleImage) : boolean+ addProduct(Product) : boolean+ addProductAccessory(ProductAccessory) : boolean+ addProductAlbum(ProductAlbum) : boolean+ deleteArticleImage(ArticleImage) : boolean+ deleteProduct(Product) : boolean+ deleteProductAlbum(ProductAlbum) : boolean+ getAllProducts() : List<Product>+ getArticleImages(int) : List<ArticleImage>+ getHotProducts() : List<Product>+ getProductAlbumByImageID(int) : ProductAlbum+ getProductAlbumByProductID(int) : List<ProductAlbum>+ getProductByClassificationID(int) : List<Product>+ getProductByCompanyID(String) : List<Product>+ getProductByID(int) : Product+ getProductByModelID(int) : List<Product>+ getProductByName(String) : List<Product>+ getProductByProductID(String) : Product+ getProductByQuery(String) : List<Product>+ getProductByStyleID(int) : List<Product>+ updateProduct(Product) : boolean
ProductController
- classificationBean: ProductClassificationBeanRemote- companyBean: CompanyBeanRemote- featureBean: FeatureBeanRemote- hotProducts: List<Product>- modelBean: ModelBeanRemote- pAccessories: List<Accessory> = new ArrayList<A...- pagingSupport: PagingSupport<Product>- pEvaluationBean: ProductEvaluationBeanRemote- pEvaluationList: List<ProductEvaluation>- pFeatureBean: ProductFeatureBeanRemote- pList: List<Product>- productBean: ProductBeanRemote- productList: List<Product> = new ArrayList<P...- pSearchingBean: ProductSearchingBeanRemote- styleBean: StyleBeanRemote
+ archiveActionEvent(ActionEvent) : void+ deleteActionEvent(ActionEvent) : void+ executeEvaluationAction(ActionEvent) : void+ fi lterProductAction(ActionEvent) : void+ fi lterValueChange(ValueChangeEvent) : void+ findTypeValueChange(ValueChangeEvent) : void+ getCompaniesName() : List<String>+ getModelsName() : List<String>+ getNewProducts() : List<Product>+ getProductClassificationName() : List<String>- getPublishedProducts(List<Product>) : List<Product>+ getStylesName() : List<String>- initFeatureHasSearch() : void- initHotProducts() : void- initProducts() : void+ loadCorrespondenceProduct(ValueChangeEvent) : void+ pageInRowChange(ActionEvent) : void+ paging(ActionEvent) : void+ productActionEvent(ActionEvent) : void+ ProductController()+ publishActionEvent(ActionEvent) : void+ refreshEvaluation() : String+ unArchiveActionEvent(ActionEvent) : void+ unPublishActionEvent(ActionEvent) : void
-productBean
+product
Hình 4-18 Lược đồ lớp cho chức năng Manage product
Lược đồ lớp cho chức năng Manage cart
class News
CartController
- accessoryBean: AccessoryBeanRemote- carts: List<CartItem>- customerId: int = -1- hide: boolean = true+ LOG: Logger = Logger.getLogge...- order: Order- orderBean: OrderBeanRemote- orderHide: boolean- orderShow: boolean- paymentType: PaymentType- paymentTypeId: String- paymentTypes: List<PaymentType>- productBean: ProductBeanRemote- quantity: int = 0- shippingType: ShippingType- shippingTypeId: String- shippingTypes: List<ShippingType>- totalAmount: double = 0
+ addItemToCart() : String+ CartController()+ deleteAllItems() : String+ deleteItems() : String+ goToCart() : String+ goToMainPage() : String+ goToOrder() : String+ previewOrder() : String+ submitOrder() : String+ updateItems() : String
Serializable
DetailOrderAccessory
- accessory: Accessory- count: int- order: Order- price: double- productname: String- total: double
Serializable
DetailOrderProduct
- count: int- order: Order- price: double- product: Product- productname: String- total: double
Serializable
Order
- address: String- customerid: int- customername: String- deliverydate: Date- detailOrderAccessories: List<DetailOrderAccessory>- detailOrderProducts: List<DetailOrderProduct>- email: String- expense: double- id: int- identify: String- orderdate: Date- orderid: String- orther: String- paymentType: PaymentType- phonenumber: String- requirements: String- shippingCost: double- shippingType: ShippingType- staffname: String- status: int- total: double- vat: double
OrderBean
- em: EntityManager
+ addAccessoryDetailOrder(DetailOrderAccessory) : boolean+ addOrder(Order) : boolean+ addProductDetailOrder(DetailOrderProduct) : boolean+ deleteOrder(Order) : boolean+ deleteOrder(int) : boolean+ getAllNewOrders() : List<Order>+ getAllOrderFil lter(String, int, Date, Date, int, int, int, int, int, int, int) : List<Order>+ getAllPaymentType() : List<PaymentType>+ getAllShippingType() : List<ShippingType>+ getDetailOrderAccesssoryByOrderId(int) : List<DetailOrderAccessory>+ getDetailOrderProductByOrderId(int) : List<DetailOrderProduct>+ getOrderByID(int) : Order+ getOrderByOrderId(String) : Order+ getOrdersByStatus(int) : List<Order>+ getPaymentTypeById(int) : PaymentType+ getShippingTypeById(int) : ShippingType+ OrderBean()+ updateOrder(Order) : boolean
«interface»OrderBeanRemote
+ addAccessoryDetailOrder(DetailOrderAccessory) : boolean+ addOrder(Order) : boolean+ addProductDetailOrder(DetailOrderProduct) : boolean+ deleteOrder(Order) : boolean+ deleteOrder(int) : boolean+ getAllNewOrders() : List<Order>+ getAllOrderFil lter(String, int, Date, Date, int, int, int, int, int, int, int) : List<Order>+ getAllPaymentType() : List<PaymentType>+ getAllShippingType() : List<ShippingType>+ getDetailOrderAccesssoryByOrderId(int) : List<DetailOrderAccessory>+ getDetailOrderProductByOrderId(int) : List<DetailOrderProduct>+ getOrderByID(int) : Order+ getOrderByOrderId(String) : Order+ getOrdersByStatus(int) : List<Order>+ getPaymentTypeById(int) : PaymentType+ getShippingTypeById(int) : ShippingType+ updateOrder(Order) : boolean
+detailOrderProducts
0..*
+detailOrderAccessories
0..*
-orderBean
+order
Hình 4-19 Lược đồ lớp cho chức năng Manage cart
Lược đồ lớp cho chức năng Manage News class Cart
NewsBean
- em: EntityManager
+ addNews(TheNews) : int+ deleteNews(int) : boolean+ getAllByFillter(int, int, int, int, int, int, int, int, int, int, int, int) : List<TheNews>+ getAllByPublish(int, int) : List<TheNews>+ getAllByStatus(int, int) : List<TheNews>+ getAllByTitle(int, int) : List<TheNews>+ getAllByUpdateDate(int, int) : List<TheNews>+ getAllByUserUpdate(int, int) : List<TheNews>+ getAllNews() : List<TheNews>+ getAllNewsByType(int) : List<TheNews>+ getAllPublishedNews() : List<TheNews>+ getAllUnpublishNews() : List<TheNews>+ getNewsByID(int) : TheNews+ getNewsPromotionById(int) : NewsPromotion+ NewsBean()+ updateNews(TheNews) : boolean
«interface»NewsBeanRemote
+ addNews(TheNews) : int+ deleteNews(int) : boolean+ getAllByFillter(int, int, int, int, int, int, int, int, int, int, int, int) : List<TheNews>+ getAllByPublish(int, int) : List<TheNews>+ getAllByStatus(int, int) : List<TheNews>+ getAllByTitle(int, int) : List<TheNews>+ getAllByUpdateDate(int, int) : List<TheNews>+ getAllByUserUpdate(int, int) : List<TheNews>+ getAllNews() : List<TheNews>+ getAllNewsByType(int) : List<TheNews>+ getAllPublishedNews() : List<TheNews>+ getAllUnpublishNews() : List<TheNews>+ getNewsByID(int) : TheNews+ getNewsPromotionById(int) : NewsPromotion+ updateNews(TheNews) : boolean
NewsController
- l istAnotherNews: List<TheNews>- listNews: List<TheNews>- newsBeanRemote: NewsBeanRemote- newsList: List<TheNews>- newsManagementBeanRemote: NewsManagementBeanRemote- pagingSupport: PagingSupport<TheNews>- rList: List<TheNews>
+ addNews() : String+ addNewsAction() : String+ applyUpdate() : String+ changeNewsAvatar(ActionEvent) : void+ copyImageUrl() : void+ deleteImage(ActionEvent) : void- deleteImageAfterUpdate(TheNews) : void+ deleteNews() : String- initNews() : void+ NewsController()+ pageInRowChange(ActionEvent) : void+ publichNews() : String+ unpublishNews() : String+ updateAction() : String+ updateNews() : String+ uploadAvatar(ActionEvent) : void+ uploadImage(ActionEvent) : void+ viewNewsDetail() : String
Serializable
NewsImage
- imageid: int- serialVersionUID: long = 1L {readOnly}- status: int- url: String
Serializable
TheNews
- avatar: String- content: String- id: int- isnew: boolean- newsImages: List<NewsImage>- postdate: Date- publish: boolean- quickview: String- serialVersionUID: long = 1L {readOnly}- slock: boolean- status: int- title: String- type: int- updatedate: Date- userCreator: User- userUpdate: User
Serializable
User
- id: int- password: String- roles: List<Role>- serialVersionUID: long = 1L {readOnly}- user: String
-userUpdate-userCreator
-newsBeanRemote
+newsImages
0..*
+theNews
Hình 4-20 Lược đồ lớp cho chức năng Manage News
Lược đồ lớp cho chức năng Manage Order
class Order
Serializable
DetailOrderAccessory
- accessory: Accessory- count: int- order: Order- price: double- productname: String- total: double
Serializable
DetailOrderProduct
- count: int- order: Order- price: double- product: Product- productname: String- total: double
Serializable
Order
- address: String- customerid: int- customername: String- deliverydate: Date- detailOrderAccessories: List<DetailOrderAccessory>- detailOrderProducts: List<DetailOrderProduct>- email: String- expense: double- id: int- identify: String- orderdate: Date- orderid: String- orther: String- paymentType: PaymentType- phonenumber: String- requirements: String- shippingCost: double- shippingType: ShippingType- staffname: String- status: int- total: double- vat: double
OrderBean
- em: EntityManager
+ addAccessoryDetailOrder(DetailOrderAccessory) : boolean+ addOrder(Order) : boolean+ addProductDetailOrder(DetailOrderProduct) : boolean+ deleteOrder(Order) : boolean+ deleteOrder(int) : boolean+ getAllNewOrders() : List<Order>+ getAllOrderFil lter(String, int, Date, Date, int, int, int, int, int, int, int) : List<Order>+ getAllPaymentType() : List<PaymentType>+ getAllShippingType() : List<ShippingType>+ getDetailOrderAccesssoryByOrderId(int) : List<DetailOrderAccessory>+ getDetailOrderProductByOrderId(int) : List<DetailOrderProduct>+ getOrderByID(int) : Order+ getOrderByOrderId(String) : Order+ getOrdersByStatus(int) : List<Order>+ getPaymentTypeById(int) : PaymentType+ getShippingTypeById(int) : ShippingType+ OrderBean()+ updateOrder(Order) : boolean
«interface»OrderBeanRemote
+ addAccessoryDetailOrder(DetailOrderAccessory) : boolean+ addOrder(Order) : boolean+ addProductDetailOrder(DetailOrderProduct) : boolean+ deleteOrder(Order) : boolean+ deleteOrder(int) : boolean+ getAllNewOrders() : List<Order>+ getAllOrderFil lter(String, int, Date, Date, int, int, int, int, int, int, int) : List<Order>+ getAllPaymentType() : List<PaymentType>+ getAllShippingType() : List<ShippingType>+ getDetailOrderAccesssoryByOrderId(int) : List<DetailOrderAccessory>+ getDetailOrderProductByOrderId(int) : List<DetailOrderProduct>+ getOrderByID(int) : Order+ getOrderByOrderId(String) : Order+ getOrdersByStatus(int) : List<Order>+ getPaymentTypeById(int) : PaymentType+ getShippingTypeById(int) : ShippingType+ updateOrder(Order) : boolean
OrderController
- customer: Customer- customerBeanRemote: CustomerBeanRemote- detailOrderAccessory: List<DetailOrderAccessory>- detailOrderProduct: List<DetailOrderProduct>- lOrder: List<Order>- order: Order- orderBeanRemote: OrderBeanRemote- paymentType: int- rOrder: List<Order>- shippingType: int
+ active(ActionEvent) : void+ CustomerNameOrdering(ActionEvent) : void+ DateOrdering(ActionEvent) : void+ deleteOrder(ActionEvent) : void+ EmailOrdering(ActionEvent) : void+ fi l lter(ActionEvent) : void+ goOrderManagent() : String+ OrderController()+ orderIdOrdering(ActionEvent) : void+ orderView() : String+ pageInRowChange(ActionEvent) : void+ PhoneNumberOrdering(ActionEvent) : void+ preview() : String+ resetFil lter(ActionEvent) : void+ StatusOrdering(ActionEvent) : void+ TotalOrdering(ActionEvent) : void+ updateAction() : String+ updateOrder(ActionEvent) : void
-orderBeanRemote
-order
+detailOrderProducts
0..*
+detailOrderAccessories
0..*
+order
Hình 4-21 Lược đồ lớp cho chức năng Manage order
4.1.4 Thiết kế và cài đặt4.1.4.1 Thiết kế và cài đặta. Xác định yêu cầu lưu trữ
Thông tin khách hàng bao gồm địa chỉ email, mật khẩu, các thông tin liên lạc như
tên đầy đủ, tỉnh, thành phố, địa chỉ nhà, số điện thoại, giới tính và ngày tháng năm
sinh. Các khách hàng khác nhau được phân biệt thông qua địa chỉ email, username.
Hệ thống giới thiệu các sản phẩm mới, được mua nhiều cho khách hàng, để làm
việc này, thông tin về số lượng mua, số lượt xem, ngày đăng sẽ được quan tâm.
Thông tin về sách bao gồm mã sách để phân biệt các cuốn sách với nhau, tên sách,
tác giả, số trang, giá thành, giá khuyến mãi, số lượng còn lại..
Thông tin về nhà xuất bản bao gồm tên nhà xuất bản, mã nhà xuất bản
Thông tin về đơn hàng gồm một mã đơn hàng duy nhất dùng phân biệt các đơn
hàng, ngày lập đơn hàng, tổng tiền hóa đơn chưa gồm các khoản phí và thuế, tổng
tiền hóa đơn gồm các khoản phí và thuế, phí vận chuyển và các thông tin trạng thái
hóa đơn như việc hóa đơn đã thanh toán hoàn tất, đang xử lý hay bị hủy.
Thông tin về chương trình khuyến mãi, thời gian khuyến mãi có hiệu lực, thông tin
đánh giá chương trình khuyến mãi.
Thông tin về tin tức của hệ thống, tin tức 24h, tin tức khuyến mãi, bao gồm: tiêu đề, tóm tắt, nội dung, người cập nhật, người đăng tin, ngày đăng tin, ngày cập nhật, trạng thái.
b. Cơ sở dữ liệu
Hình 4.50 : CSDL bán sách online
c. Mô tả chi tiết các bảngBảng tintuc: Quản lý thông tin sản phẩm
STT Tên trường Kiểu dữ liệu Bảng tham chiếu
Mô tả
1 MaSoTinTuc Varchar(20) Khóa chính phân biệt tin tức2 NoiDung Varchar(45) Nội dung tin tức
Bảng 4-16 Bảng tin tức
Bảng tacgia : quản lý thông tin tác giả
STT Tên trường Kiểu dữ liệu Bảng tham chiếu
Mô tả
1 MaSoTacGia Varchar(50) Khóa chính tác giả2 TenTacGia Varchar(45) Tên tác giả3 NgheNghiep Varchar(45) Nghề nghiệp của tác giả4 Bằng cấp Varchar(45) Các bằng cấp của tác giả
Bảng 4-17 Bảng tác giả
Bảng sachtacgia : quản lý thông tin về sách của các tác giả
STT
Tên trường Kiểu dữ liệu Bảng tham chiếu
Mô tả
1 MaSoSach Varchar(20) Khóa chính2 MaSoTacGia Varchar(20) Mã số tác giả3 Tacgia_MaSoTacGia Varchar(50) tacgia Tham chiếu tới bảng
tác giả4 Sach_MaSoSach Varchar(50) sach Tham chiếu tới bảng
sách5 Sach_chungloai_MaSoChungLoai Varchar(45) sach Tham chiếu tới bảng
sách
Bảng 4-17 Bảng liên kết
Bảng lienket: quản lý các liên kết liên quan
STT Tên trường Kiểu dữ liệu Bảng tham chiếu
Mô tả
1 MaSoLienKet Varchar(20) Khóa chính
2 TenLienKet Varchar(45) Tên liên kết3 URL liên kết Varchar(45) URL của liên kết4 ThuTu DECIMAL(18,0) Thứ tự của các liên kết
Bảng 4-19 Bảng liên kết
Bảng chungloai: quản lý thể loại sách
STT Tên trường Kiểu dữ liệu Bảng tham chiếu
Mô tả
1 MaSoChungLoai Varchar(45) Khóa chính2 TenChungLoai Varchar(45) Tên chủng loại
Bảng 4-20 Bảng liên kết
Bảng nhacungchap: quản lý nhà cung cấp
STT Tên trường Kiểu dữ liệu Bảng tham chiếu
Mô tả
1 MaSoNCC Varchar(20) Khóa chính2 TenNCC Varchar(50) Tên nhà cung cấp3 DiaChiNCC Varchar(45) Địa chỉ4 SoDienThoai DECIMAL(10,0) Số điện thoai5 TenNguoiDaiDien Varchar(45) Tên người đại diện
Bảng 4-21 Bảng nhà cung cấp
Bảng chitietphieunhap: quản lý các liên kết liên quan
STT Tên trường Kiểu dữ liệu Bảng tham chiếu
Mô tả
1 MaSoPhieuNhap Varchar(20) Khóa chính2 MaSoSach Varchar(20) Mã số sách3 SoLuong DECIMAL(10,0) Số lượng nhập4 DonGia Float Đơn giá5 Sach_MaSoSach Varchar(50) sach Khóa ngoại6 Sach_chungloai Varchar(45) chungloai Khóa ngoại
7 Sach_loaisach Varchar(50) sach Khóa ngoại8 Phieunhap_maso Varchar(20) phieunhap Khóa ngoại
Bảng 4-22 chi tiết phiếu nhập
Bảng sach: quản lý sách
STT Tên trường Kiểu dữ liệu Bảng tham chiếu
Mô tả
1 MaSoSach Varchar(50) Khóa chính2 MaSoChungLoai Varchar(45) Mã chủng loại sách3 MaSoLoaiSach Varchar(45) Mã số loại sách4 MaSoNXB Varchar(45) Nhà xuất bản5 TenSach Varchar(45) Tên sách6 MoTa Varchar(1000) Trích đoạn7 GiaNhap DECIMAL(10,0) Giá nhập về
Bảng 4-23 Bảng sách
Bảng phieunhap: quản lý phiếu nhập
STT Tên trường Kiểu dữ liệu Bảng tham chiếu
Mô tả
1 MaSoPhieuNhap Varchar(20) Khóa chính2 MaSoNguoiDung Varchar(20) Mã số người nhập3 MaSoNCC Varchar(20) Mã số nhà cung cấp sách4 NgayNhap DateTime Ngày nhập5 DienDai Varchar(45) Trích đoạn6 Nguoidung_MaSo Varchar(20) nguoidung Tham chiếu tới nguoidung7 Nhacungcap_MaSo Varchar(20) nhacungcap Tham chiếu tới nhà cung cấp
Bảng 4-24 Bảng sách
Bảng nguoidung: quản lý người dùng
STT Tên trường Kiểu dữ liệu Bảng tham chiếu
Mô tả
1 MaSoNguoiDung
Varchar(20) Khóa chính
2 HoTen Varchar(45) Họ tên người dùng3 GioiTinh Varchar(5) Giớ tính4 NgaySinh DateTime Ngày sinh5 TinhTP Varchar(45) Tỉnh/TP6 DiaChi Varchar(45) Địa chỉ7 DienThoai DECIMAL(18,0) Số điện thoại8 Email Varchar(45) Email9 TenDangNhap Varchar(45) Tên đăng nhập10 MatKhau Varchar(45) Mật khẩu11 Nhom DECIMAL(18,0) Nhóm người dùng
Bảng 4-25 Bảng người dùng
Bảng ngonngu: quản lý ngôn ngữ của sách
STT
Tên trường Kiểu dữ liệu Bảng tham chiếu
Mô tả
1 MaSoNgonNgu Varchar(20) Khóa chính2 TenNgonNgu Varchar(45) Tên ngôn ngữ3 Chitietsach_MSCTS Varchar(20) chitietsach Tham chiếu tới bảng chi tiết
sách
Bảng 4-26 Bảng ngôn ngữ
Bảng chitietsach: quản lý chi tiết sách
STT
Tên trường Kiểu dữ liệu Bảng tham chiếu
Mô tả
1 MaSoChiTietSach Varchar(20) Khóa chính2 MaSoSach Varchar(45) Tên ngôn ngữ3 MaSoNgonNgu Varchar(20) Tham chiếu tới bảng chi tiết
sách4 SoTrang DECIMAL(18,0) Số trang sách5 SoChuong DECIMAL(18,0) Số chương trong sách6 DonViTinh Varchar(10) Đơn vị tính7 NamXuatBan DateTime Năm xuất bản8 KichThuoc Varchar(50) Kích thước
9 TrongLuong DECIMAL(18,0) Trọng lượng10 Sach_MaSoSach Varchar(50) sach Tham chiếu tới bảng sách11 Sach_chungloai Varchar(50) sach Tham chiếu tới bảng sách
Bảng 4-27 Bảng chi tiết sách
Bảng donhang: quản lý đơn hàng
STT
Tên trường Kiểu dữ liệu Bảng tham chiếu
Mô tả
1 MaSoDonHang Varchar(20) Khóa chính2 MaSoNguoiDung Varchar(45) Tên người đăt3 NgayDat DateTime Ngày đặt hàng4 NgayGiao DateTime Ngày giao hàng5 TenNguoiNhan Varchar(45) Tên người nhận6 TinhTP Varchar(45) Tỉnh/TP7 DiaChi Varchar(45) Địa chỉ8 GhiChu Varchar(45) Ghi chú khi giao hàng9 Nguoidung_MaSo Varchar(20) nguoidung Tham chiếu tới bảng
nguoidung
Bảng 4-28 Bảng đơn hàng
Bảng hoadonbanhang: quản lý hóa đơn bán hàng
STT
Tên trường Kiểu dữ liệu Bảng tham chiếu
Mô tả
1 MaSoHoaDon Varchar(20) Khóa chính2 MaSoDonHang Varchar(20) Mã số đơn hàng3 MaSoNguoiDung Varchar(20) Mã số người dùng4 NgayLapHD DateTime Ngày lập hóa đơn5 DienDai Varchar(1000) Chú thích6 TongTien FLOAT Tổng số tiền7 Donhang_maso Varchar(20) donhang Mã số đơn hàng8 Donhang_nguoidu
ng_masoVarchar(20) donhang Tham chiếu tới mã số người
dùng trong bảng nguoidung9 Nguoidung_maso Varchar(20) nguoidung Tham chiếu tới bảng
nguoidung
Bảng 4-29 Bảng hóa đơn báng hàng
Bảng nhaxuatban: quản lý nhà xuất bản
STT
Tên trường Kiểu dữ liệu Bảng tham chiếu
Mô tả
1 MaSoNXB Varchar(20) Khóa chính2 TenNXB Varchar(45) Tên nhà xuất bản3 DiaChi Varchar(45) Địa chỉ4 SoDienThoai DECIMAL(10,0) Số điện thoại5 Fax DECIMAL(10,0) Số fax6 Email Varchar(45) Email7 Sach_MaSoSach Varchar(45) sach Tham chiếu tới bảng sach8 Sach_chungloai_
MaSoChungLoaiVarchar(45) sach Tham chiếu tới bảng sach
Bảng 4-30 Bảng nhà xuất bản
4.1Thiết kế giao diện chương trình
CHƯƠNG 5 : KẾT LUẬN
5.1 Kết luận5.2 Hạn chế
Vì thời gian giới hạn, khối lượng kiến thức nghiên cứu lớn, nhóm nghiên cứu vẫn còn thiếu sót một số tính năng trong website.
Vì khả năng nghiệp vụ mua bán hàng còn hạn chế, đa phần tìm hiểu qua các website bán hàng phổ biến trên mạng, nhóm nghiên cứu gặp không ít khó khăn về nghiệp vụ trong quá trình phân tích, thiết kế cho hệ thống, nên hệ thống vẫn chưa tối ưu trong tổ chức, một số chức năng mang tính chủ quan của người thiết kế. Kinh nghiệm phân tích thị trường, thị hiếu tiêu dùng của khách hàng còn quá hạn chế nên việc xây dựng tập mẫu cho mạng nơ-ron mang tính chủ quan cao, chưa chính xác lắm.
CHƯƠNG 6 : HƯỚNG PHÁT TRIỂN
Nhóm nghiên cứu đề tài xin nêu lên một vài điểm phát triển đề tài sau này:
Phân tích các nghiệp vụ mua hàng và bán hàng chi tiết và sâu hơn để tạo ra sự
chuyên nghiệp hơn cho website và hỗ trợ tối đa nhu cầu người dùng. Đặc biệt là phần
quản lý của website, sẽ bổ sung thêm một số chức năng còn thiếu như thông kê đơn đặt
hàng, thống kê các mặt hàng bán chạy trong tháng, thống kê bán hàng, quản lý quảng cáo
trên website.
……….
CHƯƠNG 7 : TÀI LIỆU THAM KHẢO
[1]. Antonio Goncalves, Beginning Java™ EE 6 Platform with GlassFish™ 3, Apress,
2009.
[2]. Rima Patel Sriganish, Gerald Brose, Micah silverman, Mastering Enterprise
JavaBeans 3.0, Wiley, 2006.
[3]. Kent Ka Iok Tong, Beginning JSF™ 2 APIs and JBoss® Seam, Apress, 2009.
[4]. Thạc sĩ Nguyễn Minh Đạo, Luận văn cao học: Mạng neural network với thuật giải
lan truyền ngược kết hợp luật Heurisic, tháng 05 năm 2002.
[5]. http://www.emforge.org/wiki/ImplementingCaptchaWithJS
[6]. http://code.google.com/p/mudim/
[7]. http://www.javaranch.com/
[8]. http://courses.coreservlets.com/Course-Materials/java-ee.html
[9]. http://www.roseindia.net/ejb/