2.5.2.1.Cỏch trỡnh chủ biờn dịch trang JSP thành servlet
Thật sự cỏc trang JSP được trỡnh chủ dịch ra thành servlet trước khi cho thực thi. Khi trỡnh khỏch triệu gọi trỡnh chủ Web server sẽ thực hiện cỏc bước sau:
Bước 1: Kiểm tra trang JSP đó được dịch ra thàn mó nguồn tương
đương của servlet chưa.
Bước 2 : Nếu chưa biờn dịch trang JSP thành file nguồn thành file
nguồn .java theo cấu trỳc của servlet. Gọi trỡnh biờn dịch javac biờn dịch file nguồn .java thành file thực thi của servlet .class.
Bước 3 : Nạp servlet đó biờn dịch ở bước 2, thực thi kết quả trả về
cho trỡnh khỏch.
Bước 4 :Nếu file JSP đó được biờn dịch trước đú : thực hiện việc
kiểm tra xem nội dung file JSP cú thay đổi hay khụng. Nếu cú, quay lại bước 2 biờn dịch lại trang. Nếu khụng thực hiện lại bước 3.
2.5.2.2. So sỏnh giữa Servlet và JSP
Do mó trang JSP thi thực thi đều được biờn dịch ra servlet cho nờn tất cả những gỡ servlet làm được cũng đồng nghĩa với trang JSP làm được. Viết trang JSP đụi khi đơn giản hơn trang servlet vỡ khụng cần phải qua bước đăng ký và biờn dịch thủ cụng.
JSP cú thể trộn lẫn mó java với cỏc thẻ HTML nờn việc thiết kế trang JSP thường đơn giản và dễ bổ sung hơn so với servlet. Tuy nhiờn đõy cũng là yếu tố khụng nờn lạm dụng đối với JSP. Nếu tập trung tất cả mó Java vào cựng với mó HTML thỡ một khi dự ỏn mở rộng và trở nờn phức tạp tất nhiờn việc bảo trỡ và nõng cấp ứng dụng Web với hàng trăm trang JSP sẽ rất khú khăn. Trong quỏ trỡnh phỏt triển ứng dụng Web theo nhúm, việc trộn lẫn mó Java và HTML trong trang JSP cho thấy khụng hiệu quả. Khú cú thể tỏch rời giữa cụng việc viết mó cho ứng dụng (thường
là vai trũ của lập trỡnh viờn – programmer) và nhúm xõy dựng giao diện (nhúm thiết kế Web – Web designer). Mó trang JSP ở dạng thuần văn bản nờn thường khụng che được mó nguồn của logic chương trỡnh.
Với servlet tuy phải biờn dịch và đăng ký thủ cụng với trỡnh chủ nhưng bự lại tớnh bảo mật cao hơn. Ta chỉ cần cung cấp cho trỡnh chủ Web Server bản servlet nhị phõn ( file .class ) đó qua bước biờn dịch mà khụng cần đến mó nguồn của servlet ban đầu. Mặt khỏc, cỏc servlet cú thể tương tỏc liờn hoàn với nhau để tạo nờn những kết xuất tuỳ biến và đa dạng trước khi trả kết quả về cho trỡnh khỏch. Servlet cú thể phõn ró cỏc đơn thể của dự ỏn và phỏt triển độc lập nhau như cỏc thành phần riờng biệt để rỏp lại trong một tổng thể chung. Mặc dự vậy, việc kết xuất trong servlet thường dựa vào phương thức print() hoặc println() nờn việc kết xuất phụ thuộc vào lập trỡnh viờn với hàng loạt cỏc lệnh print() và println() rất khú quản lý.
Việc quyết định sử dụng trang JSP, Servlet hay kết hợp cả hai là tựy vào từng dự ỏn và mục đớch của chương trỡnh cần phỏt triển. Thụng thường đối với những dự ỏn nhỏ, yờu cầu thời gian nhanh, JSP là lựa chọn thớch hợp nhất. Đối với những dự ỏn cần sự độc lập và chỉ thiờn về xử lý ta nờn sử dụng servlet. Trường hợp dự ỏn lớn ta nờn kết hợp cả servlet và JSP. Mụ hỡnh kết hợp tốt nhất giữa servlet và JSP thường được gọi là MCV (Model – View – Controler) trong đú servlet đúng vai trũ trung tõm điều khiển (controler) đưa ra quyết định xử lý, JSP đúng vai trũ thể hiện giao diện hay hiển thị dữ liệu đó xử lý (View). Quy trỡnh tớnh toỏn logic của ứng dụng được giao lại cho cỏc thành phần JavaBean hay EJB.
2.6. GIỚI THIỆU VỀ JAVABEANS 2.6.1.Khỏi niệm về JAVABEANS 2.6.1.Khỏi niệm về JAVABEANS
JavaBeans là một thành phần đối tượng được xõy dựng từ ngụn ngữ Java. JavaBeans cú thể là việc và chạy trờn mọi mỏy ảo Java. Yờu cầu tối thiểu nhất để tạo nờn thành phần JavaBeans là : cụng cụ và trỡnh biờn dịch JDK 1.1 trở lờn. JavaBeans cú thể sử dụng cỏc phương thức get/set để lỏy về và đặt thuộc tớnh cho đối tượng Bean mà nú thể hiện.
2.6.2.Cỏc thẻ chuẩn của JAVABEANS trong trang JSP
2.6.2.1.<jsp:useBean>
Thẻ <jsp:useBean> dựng để khai bỏo phạm vi và định danh id(identify) nhận dạng Bean. Nú tương tự như khai bỏo biến đối tượng trong mó java.
Thẻ <jsp:useBean> cú cỳ phỏp như sau:
<jsp:useBean id=”name”
scope=”page | request | session | application” class=”packagename.classname”>
Thuộc tớnh Diễn giải
Id Thuộc tớnh này là định danh nhận dạng của đối tượng Bean trong một phạm vi cho trước. “name” là tờn của Bean cú phõn biệt chữ hoa, thường.
Scope Thuộc tớnh phạm vi cho biết mụi trường sống của đối tượng. Phạm vi của khai bỏo mà thành phần Bean cú hiệu lực bao gồm page (Bean chỉ cú hiệu lực và phạm vi truy xuất trong khai bỏo nú). Request (Bean cú hiệu lực trong một lần yờu cầu từ mỏy khỏch). Session (hiệu lực của bean tương tự hiệu lực của cỏc biến session). Application (hiệu lực của bean tương tự hiệu lực của cỏc biến application)
Class Tờn đầy đủ của lớp Bean. Đõy là tờn tập tin .class sua khi đó biờn dịch từ mó nguồn .java. tờn này cũng phõn biệt chữ hoa và chữ thường
BeanName Này để tham chiếu đến tờn của Bean
Type Thuộc tớnh chỉ ra loại biến kịch bản. Nếu biến này khụng chỉ rừ giỏ trị của nú sẽ là giỏ trị của thuộc tớnh lớp
2.6.2.2.<jsp:setProperty>
Thẻ <jsp:setProperty> dựng để gỏn giỏ trị vào thuộc tớnh Bean. Thuộc tớnh tờn của Bean chỉ định cho đối tượng phải được định nghĩa và nằm trong phạm vi cho phộp.
Cỳ phỏp của <jsp:setProperty>
<jsp:setProperty name = “beanName” prop_expr/>
Trong cỳ phỏp trờn, name cho biết tờn Bean mà thuộc tớnh của nú đó được cài đặt. prop_expr cú thể cú cỏc khai bỏo sau:
property =”*” |
property = “propertyName” |
property = “propertyName” param=”parameterName”| property = “propertyName” value=” propertyValue”
Thuộc tớnh Diễn giải
Name Thuộc tớnh trỡnh bày tờn của Bean, tờn này đó được định nghĩa bởi thẻ
<jsp:useProperty>
Property Thuộc tớnh của Bean cần lấy giỏ trị
Param Tham số cần dựng cho thuộc tớnh của
Bean
Value Giỏ trị được gỏn vào cho thuộc tớnh của
Bean
2.6.2.3. <jsp:getProperty>
Thẻ <jsp:getProperty> dựng để lấy giỏ trị thuộc tớnh Bean và chuyển giỏ trị thành kiểu chuỗi. Cỳ phỏp cho thẻ <jsp:getProperty> như sau:
<jsp:getProperty name=”name” property=”propertyName”/>
Thuộc tớnh Diễn giải
Name Thuộc tớnh trỡnh bày tờn của Bean, tờn này đó được khai bỏo và định nghĩa bởi thẻ <jsp:useProperty>
Property Thuộc tớnh của Bean cần lấy giỏ trị
Để sử dụng JavaBeans trong trang JSP, bạn cần khai bỏo Bean với thẻ:
< jsp:useBean >
< jsp : useBean id = “jb” scope = “page” class = “searchbean. searchbean”/> < jsp : setProperty name = “jb” property = “job” param = “name”/>
PHẦN 2 : XÂY DỰNG ỨNG DỤNG CHƯƠNG 1 PHÂN TÍCH BÀI TỐN CHƯƠNG 1 PHÂN TÍCH BÀI TỐN 1.1.TấN ĐỀ TÀI
Tỡm hiểu xõy dựng ứng dụng thư điện tử
1.2.DỀ CƯƠNG CHI TIẾT 1.2.1.Khảo sỏt 1.2.1.Khảo sỏt
Trong thời gian thực tập tốt nghiệp tụi đó khảo sỏt, tỡm hiểu hệ thống thư tớn điện tử. Quỏ trỡnh xõy dựng một ứng dụng thư điện tử (Email) rất đa dạng nhưng chủ yếu tập trung vào hai phần:
ư Xõy dựng mail server : là chương trỡnh hoạt động phớa mỏy chủ nhận, lưu trữ mail, phõn phối, gởi mail đến cỏc trỡnh chủ khỏc. Cỏc chương trỡnh như Mail Deamon, SendMail, Mail Exchange… là những mail server.
ư Xõy dựng mail client : là chương trỡnh hoạt động phớa mỏy khỏch thực hiện chức năng cho phộp người dựng nhập vào nội dung mail, gởi mail đến mỏy chủ mail server xỏc định. Nhận mail từ mỏy chủ về và hiển thị cho người dựng xem nội dung mail. Vớ dụ như Outlook Express của Windows hay Web mail trờn Internet là những trỡnh đúng vai trũ mail client.
1.2.2.Yờu cầu của bài toỏn
Yờu cầu chớnh của bài toỏn
ư Phần mail client: thực hiện được cơ bản nhất những chức năng của một mail client như việc gởi, nhận, hiển thị nội dung mail thụng qua trỡnh duyệt Web với giao thức HTTP của Internet.
ư Phần mail server : thực hiện được chức năng tiếp nhận mail do trỡnh khỏch (mail client) gửi lờn (SMTP Server), lưu trữ mail trong thư mục nhất định cho phộp người dựng sử dụng giao thức POP3 đọc mail (POP3 Server), chuyển mail đến mỏy chủ khỏc (Forward Server) hoặc phõn giải địa chỉ mail gửi thẳng đến đớch (Relay Server).
1.2.3.Dữ liệu vào, dữ liệu ra và cỏc chức năng xử lý của hệ thống
* Dữ liệu vào :
ư Phần mail client :
+ Thụng tin đăng ký của người dựng ư Phần mail server :
+ Mail do trỡnh khỏch gửi lờn
+ Thụng tin về vị trớ thư mục lưu trữ mail trờn server * Dữ liệu ra :
ư Phần mail client :
+ Thụng tin về tài khoản thư điện tử của người dựng. + Thư mục tương ứng với tờn tài khoản, thụng tin về user name và password để dựng cho việc POP3 Server chứng thực quyền truy cập của người dựng khi cần đọc mail
ư Phần mail server :
+ Lưu trữ mail do trỡnh khỏch gửi đến
+ Chuyển tiếp những mail khụng thuộc domain mail do mail server quản lý.
1.2.4. Chức năng của hệ thống thụng tin quản lý
* Quản lý toàn bộ thụng tin liờn quan đến user như: họ, tờn, ngày thỏng năm sinh, nghề nghiệp, giới tớnh, quốc gia, thành phố…
* Quản lý sổ địa chỉ
1.3. Lí DO CHỌN ĐỀ TÀI
Ngày nay đối với mỗi chỳng ta thư điện tử khụng cú gỡ xa lạ tuy nhiờn đú là đứng về phương diện người dựng. Xuất phỏt từ mong muốn tỡm hiểu một cỏch tường tận hơn hệ thống thư điện tử nhỡn từ khớa cạnh nhà thiết kế nờn tụi đó quyết định chọn đề tài xõy dựng ứng dụng thư điện tử theo mụ hỡnh Client Server.
CHƯƠNG 2 : THIẾT KẾ VÀ CÀI ĐẶT ỨNG DỤNG 2.1.PHÂN TÍCH VÀ THẾT KẾ CƠ SỞ DỮ LIỆU 2.1.PHÂN TÍCH VÀ THẾT KẾ CƠ SỞ DỮ LIỆU
2.1.1.Phõn tớch
Cơ sở dữ liệu được thiết kế đơn giản và dựng vào mục đớch quản lý danh sỏch thành viờn đăng ký sử dụng dịch vụ thư điện tử của vietmail.
Với mục đớch đú CSDL chỉ bao gồm hai thực thể chớnh là được thể hiện trong bảng sau :
1 members
(thành viờn)
userid (mó thành viờn ), user_name (tờn đăng nhập),
password (mật khẩu), question (cõu hỏi), answer (cõu trả lời), ho (họ), ten (tờn), ngay (ngày sinh), thang (thỏng sinh),
nam (năm sinh), gioi_tinh (giới tớnh)
nuoc (quốc gia), thanh_pho (thành phố), thanh_pho_khac (thành phố khụng thuộc Việt Nam), job (nghề nghiệp),
thong_tin_khac (thụng tin phụ khỏc), date(ngày đăng ký)
2 addressbook
(Sổ địa chhỉ)
addressid (mó sổ địa chỉ), userid (mó thành viờn), quickname (tờn gợi nhớ), ho (họ), ten (tờn), email (địa chỉ
email), phone (số điện thoại), diachi (địa chỉ)
CÁC LƯỢC ĐỒ QUAN HỆ
Từ những thực thể và thực thể trung gian trờn, bằng cỏc nguyờn tắc biến đổi, ta xõy dựng thành cỏc lược đồ quan hệ như sau:
Member (userid, user_name, password, question, answer, ho, ten, ngay, thang,
nam, gioi_tinh, nuoc, thanh_pho, thanh_pho_khac, job, thong_tin_khac, date)
Lược đồ quan hệ dữ liệu
Phõn tớch chức năng
Sơ đồ biểu diễn chức năng của hệ thống
2.1.2. Giải thớch cỏc chức năng của hệ thống
ư chức năng : Đăng ký thành viờn
Hệ thống quản lý thành viờn của vietmail
Đăng ký thành viờn Quản lý sổ địa chỉ
member userid user_name password question answer ho ten ngay thang nam gioi_tinh nuoc thanh_pho thanh_pho_khac job thong_tin_khac date addressbook addressid userid quickname ho ten email phone diachi
ý nghĩa : thu thập cỏc thụng tin của thành viờn nhằm mục đớch quản lý cũng như thiết lập cỏc thụng số phục vụ cho việc gởi và nhận thư điện tử của thành viờn
ư chức năng : Quản lý sổ địa chỉ
ý nghĩa : tạo một danh sỏch boa gồm cỏc địa chỉ do thành viờn tự tạo rong quỏ trỡnh sử dụng hệ thống.
2.1.3.biểu đồ luồng dữ liệu( DFD – Data flow Diagram)
.Biểu đồ luồng dữ liờu mức khung cảnh (BFD)
2.1.4. THIẾT KẾ HỆ THỐNG
2.1.4.1. Cỏc bảng dữ liệu chớnh
Ký hiệu:
PK: Khoỏ chớnh (Primary Key) FK: Khoỏ ngoại (Foreign Key)
Bảng dữ liệu: Member ( Thành viờn)
Yờu cầu Thành viờn Đăng ký Thụng bỏo Hệ thống vietmail
Tờn trường Kiểu DL Độ lớn Ràng buộc Khoỏ Ghi chỳ
userid int 4 Not Null PK
user_name varchar 20 Not Null Tờn đăng nhập
password char 10 Mật khẩu
question text 16
answer text 16
ho text 16 Not Null
ten text 16 Not Null
ngay smallint 2 Not Null
thang smallint 2 Not Null
nam int 4 Not Null
gioitinh char 5 Not Null
nuoc text Not Null
thanh_pho_k hac text 16 job int 4 thong_tin_k hac text 16
date datetime 8 Not Null
Bảngdữ liệu : Addresbook (sổ địa chỉ)
Tờn trường Kiểu DL Độ lớn Ràng buộc Khoỏ Ghi chỳ
addressid int 7 Not Null PK
userid int 8 Not Null Fk
quickname text 8
ho text 8
email text Not Null
phone text
diachi text
2.2. CÀI ĐẶT MAILSERVER
2.2.1.Phương ỏn tổ chức lưu trữ mail trờn Server
Để lưu trữ mail gửi đến trờn server, mỗi trỡnh mailserver sẽ cú một phương ỏn riờng để lưu trữ. Chẳng hạn cú thể lưu trữ thụng điệp mail như là cỏc record trong bảng dữ liệu của database hoặc lưu trong cựng một file text phõn cỏch mỗi thụng điệp bằng một dấu hiệu đặc trưng nào đú. Tuy nhiờn việc lưu thụng điệp mail dưới dạng cỏc file trong từng thư mục tương ứng của cỏc User tỏ ra đơn giản hơn và cũng khụng kộm phần hiệu quả. Vỡ vậy trong đồ ỏn này tụi quyết định chọn phương ỏn lưu thụng điệp mail dưới dạng tập tin trờn đĩa cục bộ. Trước khi cài đặt cỏc đơn thể Mail server ta cần tổ chức thư mục để SMTP server lưu trữ mail như sau:
Mỗi mailserver cú thể cú nhiều tờn domain cho địa chỉ mail, cỏc tờn domain này được tổ chức trong 1 thư mục, ở đõy ta chọn vietmail.com là tờn domain mail. Lỳc
này một địa chỉ e – mail hợp lệ gửi đến SMTP server của ta phải cú dạng như sau
username@vietmail.com. Hệ thống mail server cũn cho phộp mở rộng thờm vào cỏc
domain mail khỏc. Danh sỏch cỏc tờn domain main nằm trong file domain.txt.
Trong thư mục email\data\vietmail.com chứa danh sỏch cỏc thư mục con đại diện cho từng tài khoản (như thanhboeing, xuanthu…). Thụng tin đăng nhập của tài khoản được đặt trong file User.txt.
2.2.2.Cỏc đơn thể của mailserver
Trỡnh MailServer cú cỏc đơn thể được cài đặt bằng ngụn ngữ java và bao gồm cỏc phần chớnh sau:
ư Đơn thể xử lý tập lệnh SMTP ư Đơn thể xử lý tập lệnh POP3
2.2.2.1. Xõy dựng SMTP Server
Nhiệm vụchớnh của SMTP Server là sử lý tập lệnh SMTP, trả lại mó lỗi do trỡnh khỏch gởi lờn khụng hợp lệ. Tiếp nhận dữ liệu và lưu vào thư mục nhất định để trỡnh chủ POP3 Server cú thể truy xuất sau này. SMTP server sẽ mở socket lắng nghe trờn cổng 25 (cổng mặc định của SMTP). Ta cũng cú thể thay đổi số hiệu cổng trong file cấu hỡnh email.properties. khi nhận được kết nối từ trỡnh khỏch, SMTP server sẽ mở một tuyến (thread) là lớp SMTPConection chịu trỏch nhiệm phõn tớch cỏc lệnh SMTP và nhận mail do trỡnh khỏch gởi lờn. Lớp SMTP được cài đặt như sau:
SMTPServer.java
import java.io.*; import java.net.*;
import java.util.*;
public class SMTPServer extends Thread {
protected ServerSocket listenSocket = null; protected Vector connections;
public Boolean stopRequested;
public SMTPServer() throws Exception { int port = 0;
String portString = null;
// Lấy số hiệu cổng S MTP từ file cấu hỡnh try {
portString = Server.properties.getProperty("smtp.port"); port = Integer.parseInt(portString);
} catch (NumberFormatException e) {
throw new Exception("Invalid 'smtp.port' ư " + portString); }
// Mở socket lỏng nghe kết nối từ trỡnh khỏch listenSocket = new ServerSocket(port); // Mảng lưu cỏc kết nối từ trỡnh khỏch connections = new Vector(10, 10);
}
public void removeConnection(SMTPConnection connection) { connections.removeElement(connection);
}
public void run() {
// Lặp vụ tận chờ nhận kết nối cho đến khi cú tớn hiệu dừng stopRequested = new Boolean(false);
while (true) { synchronized (stopRequested) { if (stopRequested.booleanValue()) break; } // chấp nhận kết nối try { Socket s = listenSocket.accept(); System.out.println("Accept"); //Phõn tớch cỏc lệnh SMTP của trỡnh khỏch – thực hiện việc tiếp nhận mail
SMTPConnection connection = new SMTPConnection(s, this); connections.addElement(connection);
connection.start(); } catch (IOException e) { e.printStackTrace(); break; } } // Đúng kết nối try { listenSocket.close(); } catch (IOException e) { e.printStackTrace(); } } }
Lớp SMTPConnection đúng vai trũ chớnh trong SMTPServer. SMTPConnection phõn tớch cỏc lệnh SMTP, nhận mail và lưu và thư mục tương ứng với địa chỉ mail của User. Chương trỡnh mailserver cũng cho phộp khả năng relayvà chuyển tiếp mail. Cỏc mail cú địa chỉ khụng thuộc domain do mailserver quản lý sẽ được lưu và thư mục queue (hay hàng đợi). Chương trỡnh SMTPRelayServer và SMTPRForrwardServer sẽ xử lý cỏc mail này. Lớp SMTPConnection được cài đặt như sau:
SMTPConnection.java
import java.io.*; import java.net.*; import java.util.*; /**
* SMTPConnection : Xử lý cỏc lệnh SMTP, lưu mail vào thư mục thớch hợp */
public class SMTPConnection extends Thread { protected SMTPServer server;
protected Socket socket; protected Vector recipients; public BufferedReader in; public PrintStream out;