Ví trí được ghi
trong thong báo tuyển dụng
XA MAXA Nvarchar 6 2kí tự đầu là mã
tỉnh, 2 kí tự tiếp
theo là mã huyện,
2 kí tự cuối là thứ
tự của xã trong
huyện
TenXa Nvarchar 25
126 trang |
Chia sẻ: lylyngoc | Lượt xem: 2471 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Đồ án Ngôn ngữ cài đặt website, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
biên dịch trang
JSP. Quá trình biên dịch JSP thực tế là chuyển trang JSP thành servlet. File
biên dịch . class của trang sẽ được đặt trong thư mục đệm. Như chúng ta thấy,
quá trình biên dịch trang chỉ diễn ra một lần. Nếu trang đã biên dịch và sau đó
chúng ta không có thay đổi gì trong trang nguồn thì quá trình biên dịch sẽ
không xảy ra, do đó tốc độ thực thi trang sẽ nhanh hơn. Sau khi trang đã được
biên dịch, mã trang sẽ được nạp vào bộ nhớ để thực thi.
Nạp trang
Kể từ giai đoạn này, quá trình nạp trang tương tư như servlet. Chỉ có một
khác biệt đó là servlet chỉ được nạp một lần trong khi mã trang JSP mặc dù đã
biên dịch nhưng phải nạp lại nhiều lần mỗi khi Web server nhận được yêu cầu
trang từ trình duyệt.
Khởi tạo
Khi nạp mã trang thành công, Web server sẽ gọi đến phương thức khởi
tạo trang. Và mặc dù, JSP được biên dịch ra servlet như phương thức khởi tạo
cho trang JSP lại mang tên jspInit () chứ không phải là init () như servlet.
Thực thi
Sau quá trình khởi tạo, Web server sẽ gọi đến phương thức _jspService
(). Phương thức _jspService sẽ chuyển cho chúng ta hai lớp đối tượng
HttpServletRequest và HttpServletResponse để đọc và ghi kết xuất trả về trình
khách.
Dọn dẹp
Khi trang JSP đã thực thi xong, trình chủ Web server sẽ gọi phương thức
jspDestroy () để giải phóng mã trang khỏi bộ nhớ. Tương tự như trong servlet,
chúng ta có thể cài đặt phương thức jspDestroy () thực hiện chức năng giảp
phóng vùng nhớ hoặc đóng kết nối trả tài nguyên về cho hệ thống.
IV.4. Ưu và khuyết điểm của Servlet so với JSP
Do mã trang JSP khi 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 lúc đơn giản hơn viết servlet vì không cần phải qua bước đăng ký và
biên dịch thủ công. Tuy nhiên chúng ta cũng nên biết một số trường hợp phân
biệt giữa JSP và servlet và cách sử dụng chúng.
JSP có thể trộn lẫn mã Java với các thẻ HTML cho nên 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 chúng ta tập trung tất cả mã Java vào
cũng với mã HTML, một khi dự án mỡ rộng và trở nên phức tạp, 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ã JSp sẽ rất khó
khăn. Trong qua 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 và nhóm xây dựng giao diện. 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. Chúng 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ặc 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 tùy 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. Tuy nhiên, việc kết xuất trong servlet thường dựa vào phương thức
print () hoặc println (). Công việc quyết định giao diện cho kết xuất hoàn toàn
phụ thuộc vào lập trình viên với hàng loạt các lệnh print () hay println () rất
khó quản lý.
Quyết định sử dụng JSP, Servlet hay kết hợp cả hai là tuỳ vào từng dự án
và mục đích của chương trình mà chúng ta muố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.
Trường hợp với 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 với dự án lớn chúng 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 các quyết định xử lý. JSP đóng vai trò thể hiện giao diện hay
hiển thị dữ liệu đã xử lý. 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.
Chương II
Tag Libraries
I. Tag library là gì ?
Trong kỹ thuật JavaServer Pages, các action là các element có thể tạo ra
và truy cập vào các đối tượng của ngôn ngữ lập trình và xuất vào những luồng
xuất chuẩn như màn hình, máy in,… JSP định nghĩa ra chín action chuẩn mà
phải được cung cấp bởi bất kỳ engine nào.
Ngoài các action chuẩn này, từ JSP v1.1 trở lên cho phép xây dựng và
phát triển các module có thể dùng lại được gọi là custom action. Trong trang
JSP, một custom action được triệu gọi bằng cách dùng custom tag. Một tag
library là một tập các custom tag.
Các ứng dụng có thể được thực hiện bằng custom action bao gồm xử lý
form, truy cập cơ sở dữ liệu và các dịch vụ ở mức xí nghiệp khác như email,
quản lý thư mục và điều khiển luồng. Trước khi custom action xuất hiện thì
JSP có một cơ chế dùng lại mã là các thành phần JavaBean kết hợp với
scriplet. Tuy nhiên với JavaBean có một bất lợi là xây dựng phức tạp và khó
quản lý.
Các custom action làm dịu được vấn đề này bằng cách mang lại các lợi
ích dưới góc độ khác của việc module hoá tính sử dụng lại cho các trang JSP.
Các custom action gói gọn lại các tác vụ để chúng có thể được dùng lại trong
hơn một ứng dụng và tăng hiệu xuất bằng cách khuyến khích phân chia công
việc giữa các nhà phát triển thư viện và người sử dụng thư viện. Các tag
library của JSP được tạo bởi các nhà phát triển, là người thành thạo ngôn ngữ
lập trình Java và là chuyên gia trong giao tiếp với cơ sở dữ liệu và các dịch vụ
khác. Các tag library được dùng bởi các nhà thiết kế ứng dụng web, là người
có thể chỉ tập trung vào cách thức hiển thị hơn là quan tâm đến cách truy cập
cơ sở dữ liệu và các dịch vụ khác.
Một số đặt tính của các custom tag là:
- Chúng có thể được tuỳ biến thông qua các thuộc tính từ một trang
đang gọi.
- Chúng được phép truy cập vào tất cả đối tượng có sẵn trong trang JSP.
- Chúng có thể thay đổi lời đáp mà được phát sinh bởi một trang đang
gọi.
- Chúng có thể được lồng với nhau và cho phép các tương tác phức tạp
trong một trang.
- Chúng có thể truyền thông với nhau. Chúng ta có thể tạo và khởi tạo
một thành phần JavaBean, tạo một biến tham chiếu đến Bean đó trong một tag
và sau đó sử dụng Bean này trong tag khác.
II. Cách dùng các tags trong JSP
Phần này trình bày cách thức mà tác giả của trang web sử dụng tag
library trong JSP và giới thiệu các loại tag khác nhau. Các ví dụ trong phần
này sẽ được định nghĩa trong phần III.
II.1. Khai báo các tag library
Trang JSP sẽ sử dụng các tag được định nghĩa trong một tag library bằng
cách đưa vào taglib directive trong trang trước bất kỳ custom tag được sử
dụng:
Thuộc tính uri tham chiếu tới URI đó là định danh duy nhất cho tag
library. URI có thể là URI tương đối hay tuyệt đối. Nếu URI tương đối thì nó
phải được ánh xạ đến một URI tuyệt đối trong taglib element của bộ mô tả
triển khai ứng dụng Web, tập tin cấu hình này cùng với ứng dụng Web được
phát triển theo bản đặt tả Java Servlet và JavaServer Pages.
Thuộc tính prefix định nghĩa một tiếp đầu ngữ để phân biệt với các tag
library khác, do đó thuộc tính này giải quyết được vấn đề xung đột về các tên
tag.
II.2. Các loại tag
Những custom action được diễn đạt bằng cú pháp XML. Chúng có start
tag, nội dung và end tag:
body
Một tag mà không có nội dung được biểu diễn như sau:
II.2.1. Các tag đơn giản
Một tag đơn giản sau triệu gọi một action và xuất ra lời chào “Hello
World.”.
II.2.2. Các tag có thuộc tính
Một start tag của custom action có thể chứa các thuộc tính dưới dạng attr
= ‘value’. Các thuộc tính này tuỳ biến các tham số dùng trong các phương
thức của một lớp java.
Các thuộc tính có thể được gán một hay nhiều tham số trong một đối
tượng request hoặc từ một hằng chuổi. Chỉ có các kiểu thuộc tính trong bảng
sau mới có thể được gán từ các giá trị tham số của request và của các hằng
chuổi
Kiểu thuộc tính Phương thức valueOf chuyển chuổi
boolean or Boolean java.lang.Boolean.valueOf(String)
byte or Byte java.lang.Byte.valueOf(String)
char or Character java.lang.Character.valueOf(String)
double or Double java.lang.Double.valueOf(String)
int or Integer java.lang.Integer.valueOf(String)
float or Float java.lang.Float.valueOf(String)
long or Long java.lang.Long.valueOf(String)
Giá trị thuộc tính có dạng được tính vào thời gian
yêu cầu. Giá trị của biểu thức tuỳ thuộc vào kiểu thuộc tính được xác định
trong đối tượng cài đặt tag còn gọi là tag handler (tag handler trong phần định
nghĩa các tag).
II.2.3. Các tag có nội dung
Tag có thể bao hàm các custom tag, scripting element, HTML, và nội
dung nằm giữa start tag và end tag. Trong ví dụ sau sẽ đưa ra thông tin “lời
chào” được cung cấp trong thân tag thay vì trong thuộc tính của nó.
Phan Van Dau
i. Các tag định nghĩa các biến kịch bản
Một tag có thể định nghĩa ra một biến mà biến này được dùng trong cùng
một trang. Ví dụ sau đây minh hoạ cách thức định nghĩa và sử dụng một biến
chứa một đối tượng được trả về.
ii. Kết hợp các tag
Các tag kết hợp với nhau bằng các phương pháp của các đối tượng dùng
chung. Trong ví dụ sau, tag1 tạo một đối tượng có tên là obj1, sau đó được sử
dụng lại bởi tag2. Qui tắc này được khuyến khích bởi bảng đặt tả JSP, một tag
tạo ra một tên với thuộc tính id và tag thứ hai có thuộc tính name để dùng lại
tên này.
Trong ví dụ kết tiếp, dùng các tag lồng nhau tương tự như trong XML và
HTML.
iii. Định nghĩa các tag
Để sử dụng các custom tag trong trang JSP, chúng ta cần phải định nghĩa
ba thành phần riêng biệt:
Phát triển tag handler và các lớp trợ giúp cho tag.
Khai báo tag trong bộ mô tả thư viện tag (tag library descriptor) dưới
dạng tập tin XML.
Tạo tập tin JSP có sử dụng custom tag.
Phần này mô tả các thuộc tính của tag handler và các bộ mô tả thư viện
tag, cũng trình bày cách phát triển tag handler và các element của bộ mô tả
thư viện đối với mỗi loại tag được giới thiệu trong phần trước.
II.3. Tag handler
Tag handler là một đối tượng được gọi lên bởi JSP container để định trị
cho custom tag trong xuốt quá trình thực thi của trang JSP có tham chiếu tới
một tag nào đó. Các phương thức của tag handler được gọi bởi lớp cài đặt
trang JSP vào các thời điểm khác nhau trong xuốt quá trình định trị cho tag.
Khi gặp start tag của custom tag thì lớp cài đặt trang JSP gọi các phương
thức để khởi tạo các giá trị thích hợp và sau đó triệu gọi phương thức
doStartTag. Khi gặp end tag của custom tag thì phương thức doEndtag được
gọi.
Tuỳ theo mục đích của từng custom tag mà chúng ta xử lý các phương
thức thích hợp trong từng giao tiếp cài đặt. Bảng sau mô tả các loại tag có các
phương thức tương ứng để xử lý.
Loại tag handler Các phương thức cần xử lý
Simple doStartTag, doEndTag, release
Attributes doStartTag, doEndTag, set/getAttribute1...N
Body, No
Interaction
doStartTag, doEndTag, release
Body, Interaction
doStartTag, doEndTag, release, doInitBody,
doAfterBody
Tag handler có sự truy cập vào API mà cho phép nó truyền thông với
trang JSP. Con đường vào API này là đối tượng pageContext, qua đó tag
handler có thể truy cập vào mọi đối tượng ngầm định khác như request,
session, application từ trang JSP. Các đối tượng ngầm định có thể có các
thuộc tính kết hợp với chúng. Các thuộc tính như thế được truy cập qua các
phương thức [get/set]Attribute thích hợp.
Nếu tag được lồng nhau thì tag handler cũng có thể truy cập handler
này (được gọi là parent) cùng với toàn bộ tag.
Các tag handler phải được cài đặt hai giao tiếp hoặc Tag hoặc BodyTag.
Các giao tiếp có thể được dùng để lấy đối tượng Java đã tồn tại và tạo ra một
tag handler. Để định nghĩa các tag handler mới chúng ta có thể dùng các lớp
TagSupport và BodyTagSupport như là các lớp cơ sở (xem 4. Tag handler
được triệu gọi như thế nào?).
II.4. Tag library descriptor
Tag library descriptor (TLD) là một tài liệu XML dùng để mô tả thư viện
tag. Một TLD chứa toàn bộ thông tin về thư viện và mỗi tag chứa trong thư
viện. JSP container và các công cụ phát triển JSP sử dụng TLD để xác định
các tag.
Các element của TLD sau dùng để định nghĩa thư viện tag:
HelloWorldTag.java
<!DOCTYPE taglib
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag
Library1.1//EN"
"">
<!--Tên mặt định đơn giản có thể dùng bởi công cụ tạo trang
JSP để tạo tên với giá trị gợi nhớ; chẳng hạn shortname có
thể được dùng như giá trị tiếp đầu ngữ thích hợp trong taglib
directive và/hoặc tạo ra các tiếp đầu ngữ cho các id -->
... ...
Tag element yêu cầu đối với mọi tag để xác định một lớp có
trong thư viện tag.
classname
...
II.5. Các ví dụ
Để tạo các custom tag chúng ta cần hai import gói cơ bản:
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*; // tag extension
1. Các tag đơn giản.
- Tag handler
Đối với các tag đơn giản chỉ cần cài đặt hai phương thức của giao tiếp
Tag là doStartTag và doEndTag. doStartTag được triệu gọi khi JSP container
gặp start tag, nó trả về SKIP_BODY vì thân tag chẳng có nội dung nào cả.
Ngược lại khi gặp end tag thì JSP container gọi doEndTag, trả về
EVAL_PAGE nếu phần còn lại của trang cần phải định trị, nếu không trả về
SKIP_PAGE.
Lớp tag handler sẽ được cài đặt như sau:
HelloWorldTag.java
public HelloWorldTag extends TagSupport {
public int doStartTag() throws JspException {
try { pageContext.getOut().print("Hello World.");
} catch (Exception ex) {
throw new JspTagException("HelloWorldTag: " +
e.getMessage());
}
return SKIP_BODY;
}
public int doEndTag() {
return EVAL_PAGE;
}
}
- TLD element
Các tag mà không có thân phải khai báo nội dung của thân là rỗng.
helloworld.tld
<!DOCTYPE taglib
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"
"">
<!--Nếu có JSP v1.2 thì đổi lại
""-->
1.0
1.1
vandau
A tag library from authors at
helloWorld
HelloWorldTag
Ví dụ với tag đơn giản nhất
EMPTY
- JSP page
hello.jsp
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"DTD/xhtml1-strict.dtd">
hello.jsp (tiếp theo)
<link rel = "stylesheet" href ="JSP-Styles.css" type =
"text/css"/>
II.5.1. Các tag có thuộc tính
- Định nghĩa các thuộc tính trong tag handler.
Đối với mỗi thuộc tínch của tag, chúng ta phải định nghĩa theo phong
cách của JavaBean, tức là phải có phương thức get/set[Attribute] trong tag
handler.
Hãy nhớ rằng, nếu thuộc tính được đặt tên là id và tag handler kết thừa
từ lớp TagSupport thì chúng ta không cần định nghĩa các phương thức
get/set[Attribute] bởi vì những thứ này đã được TagSupport làm sẵn.
Lớp tag handler sẽ được cài đặt như sau:
HelloWorldTag.java
public HelloWorldTag extends TagSupport {
private String name = “World.”;
public void setName(String name) {
this.name = name;
}
public int doStartTag() throws JspException {
try {
pageContext.getOut().print("Hello " + name);
} catch (Exception ex) {
throw new JspTagException("HelloWorldTag: " +
e.getMessage());
HelloWorldTag.java
}
return SKIP_BODY;
}
public int doEndTag() {
return EVAL_PAGE;
}
}
- TLD element
Đối với mỗi thuộc tính chúng ta phải xác định thuộc tính nào được yêu
cầu (bắt buộc) và giá trị nào có thể được xác định bởi biểu thức. Nếu thuộc
tính của tag không bắt buộc thì tag handler nên cung ấp giá trị mật định.
TLD cho tag handler ở trên như sau:
TLD file (overwrite helloworld.tld)
...
helloWorld
HelloWorldTag
Ví dụ với tag đơn giản nhất
name
false
false
EMPTY
- JSP page
paramtag.jsp
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"DTD/xhtml1-strict.dtd">
Tag With Attributes
<link rel = "stylesheet" href ="JSP-Styles.css" type =
"text/css"/>
II.5.2. Các tag có nội dung
- Tag handler
Tag handler cho loại này được cài đặt khác nhau phụ thuộc vào tag
handler có tương tác với thân hay không. Tương tác có nghĩa là tag handler
đọc hoặc sữa đổi nội dung của thân hoặc tạo ra giá trị lặp lại cho thân tag.
Các tag có tương tác với phần thân: nếu tag handler không cần tương tác
với phần thần thì tag handler này nên cài đặt giao tiếp Tag hoặc dẫn xuất từ
lớp TagSupport. Nếu thân của tag cần định trị thì doStartTag cần phải trả về
EVAL_BODY_INCLUDE, ngược lại trả về SKIP_BODY.
Các tag có tương tác với phần thân: tag handler phải cài đặt giao tiếp
BodyTag hoặc BodyTagSupport, thường cài đặt phương thức doInitBody và
doAfterBody. Hai phương thức này tương tác với nội dung của thân được
chuyển vào tag handler bởi lớp cài đặt trang JSP. Đối tượng BodyContent
cung cấp vài phương thức để đọc và ghi nội dung của nó. Tag handler sử dụng
các phương thức getString, getReader của BodyContent để trích thông tin từ
phần thân và phương thức writeOut(out) để ghi các nội dung của thân vào
luồng xuất. Phương thức getPreviousOut thường được sử dụng để bảo đảm
rằng kết quả trả về của tag handler thì có sẳn đối với toàn bộ tag handler. Các
phương thức chính được dùng trong loại tag này:
doInitBody: được gọi sau khi nội dung của thân được gán nhưng trước
khi được định giá trị, thường được dùng để thực hiện khởi tạo giá trị mà tuỳ
thuộc vào nội dung của thân.
doAfterBody: được gọi sau khi nội dung của thân được định trị. Nếu thân
được trị nhiều lần lặp đi lặp lại nên trả về EVAL_BODY_TAG, ngược lại trả
về SKIP_BODY.
release: tag handler nên xác lập lại trạng thái của nó và giải phóng các
tài nguyên dành riêng bằng phương thức release.
Ví dụ sau đọc nội dung của thân, chuyển nội dung đó, và sau đó ghi lại
những thay đổi vào luồng xuất.
TransformTag.java
public class TransformTag extends BodyTagSupport {
public int doAfterBody() throws JspTagException {
BodyContent bc = getBodyContent();
String body = bc.getString();
bc.clearBody();
try {
getPreviousOut().print(body.transform());
} catch (IOException e) {
throw new JspTagException("TransformTag: " +
e.getMessage());
}
return SKIP_BODY;
}
}
- TLD element
TLD ở đây chỉ sữa đổi lại các ví dụ trên trong bodycontent tag và đặt tên
file là transform.tld
...
JSP
Với các tag có phần thân thì bodycontent tag có hai giá trị. Một là JSP,
phần thân bao gồm custom tag, scripting element và văn bản HTML. Tất cả
các thứ còn lại có giá trị là tagdependent. Chú ý rằng giá trị của element này
không ảnh hưởng tới tiến trình thông dịch của thân.
- JSP page
transformtag.jsp
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"DTD/xhtml1-strict.dtd">
Tag With Body
<link rel = "stylesheet" href ="JSP-Styles.css" type =
"text/css"/>
Tag With Body
Hi! TH 40 University
II.5.3. Các tag định nghĩa các biến kịch bản
- Tag handler
Tag handler đảm nhận việc tạo và gán đối tượng được tham chiếu bởi
biến kịch bản vào ngữ cảnh có thể truy cập từ một trang. Để Làm được điều
này bằng cách dùng hoặc phương thức pageContext.setAttribute(name, value,
scope) hoặc pageContext.setAttribute(name, value). Thông thường một thuộc
tính chuyển vào custom tag phải xác định “tên” của biến đối tượng; Tên này
có thể truy xuất bằng cách gọi phương thức get[Attribute] của thuộc tính (xem
2) Các tag có thuộc tính).
Nếu giá trị của biến kịch bản phụ thuộc vào đối tượng hiện tại trong tag
handler thì nó có thể truy xuất đối tượng này bằng cách dùng
pageContext.setAttribute(name, scope). Các giá trị của tham số scope được
tóm tắc trong bảng sau:
Phạm vi Có thể truy cập từ Thời gian sống
page Trang hiện hành
Cho tới khi lời đáp gởi
trở lại user hoặc yêu
cầu được chuyển tới
trang mới
request
Trang hiện hành và bất
kỳ trang được include
hay forward nào
Cho tới khi lời đáp gởi
trở lại user
session
Yêu cầu hiện hành và bất
kỳ yêu cầu tiếp theo
trong cùng browser
Đời sống của một
phiên làm việc
(session)
application
Bất kỳ yêu cầu hiện tại
và tương lai nào từ cùng
một ứng dụng
Đời sống của một ứng
dụng
Ngoài việc cài đặt giá trị của biến trong tag handler, chúng ta còn phải
định nghĩa một lớp dẫn xuất từ lớp TagExtrInfo. Lớp này cung cấp thông tin
cho JSP container về đặt tính của của biến kịch bản, phải cài đặt phương thức
getVariableInfo để trả về một mảng các đối tượng VariableInfo chứa
các thông tin sau: tên biến, lớp của biến, liệu biến này có tham khảo tới một
giá trị đối tượng mới hay đã có, tính sẳn dùng của biến này.
Bảng sau mô tả tính sẳn dùng của biến kịch bản và các phương thức để
xác lập và xác lập lại giá trị của biến.
Value Availability Methods
NESTED
Giữa start tag và
end tag.
Trong doInitBody và
doAfterBody đối với tag
handler cài đặt BodyTag; ngược
lại trong doStartTag.
AT_BEG
IN
Từ start tag cho
đến cuối trang.
Trong doInitBody,
doAfterBody, và doEndTag đối
với tag handler cài đặt
BodyTag; ngược lại trong
doStartTag và doEndTag.
AT_END
Sau end tag cho
tới cuối trang.
Trong doEndTag.
Lớp tag handler sau lấy dữ liệu từ JNDI lookup được lưu trữ như là thuộc
tính của đối tượng pageContext cùng với tên của biến kịch bản.
LookupTag.java
public LookupTag extends TagSupport {
private String type;
private String name;
public void setName(String name) {
this.name = name;
}
public void setType(String type) {
this. type = type;
}
public int doStartTag() {
return SKIP_BODY;
}
public int doEndTag() throws JspException {
try {
InitialContext context = new InitialContext();
Object obj = (Object)context.lookup(name);
pageContext.setAttribute(getId(), obj);
} catch(javax.naming.NamingException e) {
throw new JspException("Unable to look up " + name
+ " due to " + e.getMessage());
}
return EVAL_PAGE;
}
}
Biến kịch bản sẽ được định nghĩa trong lớp dẫn xuất từ lớp
TagExtraInfo. Do biến được truyền vào như các thuộc tính của tag nên sẽ
được truy xuất bởi phương thức getAttributeString của lớp TagData và dùng
để lấp đầy hàm tạo của VariableInfo. Để cho phép biến kịch bản được dùng
trong phần còn lại của trang thì phạm vi của biến nên gán bằng AT_END.
LookupTagTei.java
public class LookupTagTEI extends TagExtraInfo {
public VariableInfo[] getVariableInfo(TagData data) {
VariableInfo info1
= new VariableInfo(
data.getAttributeString("id"),
data.getAttributeString("type"),
true,
VariableInfo.AT_END);
VariableInfo[] info = { info1 } ;
return info;
}
}
- TLD element
Chúng ta cần phải báo cho JSP container biết nó nên dùng lớp
TagExtraInfo để tạo ra biến kịch bản với phạm vi thích hợp. Đoạn TLD có tên
lookup.tld như sau:
TLD file
...
com.vandau.LookupTag
com.vandau.LookupTagTEI
name
true
false
type
true
false
...
- JSP page
JSP file
...
<vandau:lookup id = "sv" type = "UserTransaction"
name = "java:comp/ UserTransaction ">
III. Tag handler được triệu gọi như thế nào?
Giao tiếp Tag định nghĩa một qui ước truyền thông cơ bản giữa tag
handler và lớp cài đặt trang JSP. Giao tiếp này định nghĩa chu kỳ sống và các
phương thức được triệu gọi khi gặp phải start tag và end tag của một action.
Lớp cài đặt trang JSP triệu gọi các phương thức setPageContext,
setParent, và các phương thức cài đặt thuộc tính trước khi gọi phương thức
doStartTag. Lớp này cũng bảo đảm rằng phương thức release sẽ được gọi
trong tag handler trước khi kết thúc trang. Ví dụ sau thực hiện từng bước cách
gọi tag handler.
Cách thực hiện tag handler không có BodyContent
ATag t = new ATag();
t.setPageContext(...);
t.setParent(...);
t.setAttribute1(value1);
t.setAttribute2(value2);
t.doStartTag();
t.doEndTag();
t.release();
Giao tiếp BodyTag mở rộng từ giao tiếp Tag bằng cách định nghĩa thêm
các phương thức cho phép tag handler truy cập vào thân của nó. Giao tiếp này
cung cấp ba phương thức mới:
setBodyContent: tạo nội dung của thân tag và thêm vào tag handler.
doInitBody: được gọi trước khi định trị thân của tag.
DoAfterBody: được gọi trước khi định trị thân của tag.
Ví dụ:
Cách thực hiện tag handler có BodyContent
t.doStartTag();
out = pageContext.pushBody();
t.setBodyContent(out);
/* thực hiện các khởi tạo cần thiết sau khi nội dung của thân được gán */
t.doInitBody();
t.doAfterBody(); /**/
/* Khi doAfterBody trả về EVAL_BODY_TAG chúng ta lặp lại phần định
trị cho thân tag */
...
t.doAfterBody(); /**/
t.doEndTag();
t.pageContext.popBody();
t.release();
Chương III
JAVABEAN
I. Khái niệm về JavaBean
Định nghĩa chính thức của JavaSoft về Bean: “JavaBean là một
component phần mềm có thể dùng lại được, có thể được thực hiện trực quan
bằng môi trường phát triển tích hợp IDE (Integrated Development
Environment).”
JavaBean là một đối tượng Java bất kỳ cài đặt interface Serializable.
Chúng ta thường truy xuất các đối tượng Java thông qua thuộc tính của nó, với
JavaBean điều này cũng hoàn toàn tương tự nhưng thường JavaBean không sử
dụng trực tiếp cú pháp Java để truy xuất thuộc tính. JavaBean sử dụng các thẻ
tương tự như HTML để định nghĩa Bean, thiết lập hoặc lấy về các giá trị của
Bean.
Khi định nghĩa Bean chúng ta phải tuân theo các quy tắc sau:
Tên lớp của Bean phải có tiếp vĩ ngữ là Bean chẳng hạn UserBean,
DataAccessBean, ...Thật sự thì quy tắc này không là yêu cầu bắt buộc nhưng
nó là một định hướng thông dụng và cho phép những nhà phát triển khác hiểu
ngay lập tức vai trò của lớp này. Một Bean phải có một hàm tạo không có
tham số. Bean không nên có bất kỳ biến thể hiện (field) nào là ‘public’. Các
giá trị bền vững nên được truy cập thông qua các phương thức gọi là getXxx
và setXxx. Đối với các server-side Bean không nên dùng thư viện đồ hoạ.
Mẫu chuẩn để định nghĩa JavaBean như sau:
Public class YourBean implements java.io.Serializable
{
protected int theValue;
// Phương thức khởi tạo Bean
public MyBean ()
{
}
// Khai báo phương thức đặt giá trị cho thuộc tính
MyValue
public void setBeanValue (int newValue)
{
theValue = newValue;
}
// Khai báo phương thức trả về giá trị của thuộc tính
MyValue
public int getBeanValue ()
{
return theValue;
}
}
Chúng ta biên dịch thành phần Bean tương tư như biên dịch các lớp đối
tượng Java thông thường khác (sử dụng trình biên dịch javac của JDK). Nếu
muốn triệu gọi đối tượng Bean trong trang JSP thì ta sử dụng mã Java của JSP
Bean có thể được khai báo và sử dụng như sau:
<%
YourBean bean = new YourBean ();
bean.setBeanValue (11 + 2);
out.println (bean.getBeanValue ());
%>
Tuy nhiên, mục đích của JavaBean là cho phép sử dụng các thẻ thay thế
cho mã Java. Hãy xem Bean được định nghĩa và sử dụng thông qua thẻ
sau đây:
<jsp:setProperty name = “bean” property = “BeanValue” value =
“12 + 3”>
Trong cách viết thứ hai, hoàn toàn không có mã Java. Trang JSP sử
dụng cú pháp tương tự HTML dựa vào các thẻ để gán giá trị và truy xuất thuộc
tính của JavaBean. Khi sử dụng các thẻ để truy xuất thuộc tính của Bean
chúng ta không sử dụng các tiếp đầu ngữ get/set.
II. Các thẻ chuẩn của JavaBean trong trang JSP
Khi chúng ta nhúng JavaBean vào trang JSP, có 3 thẻ chuẩn được định
nghĩa để kết hợp JavaBean
. Thẻ này dùng định nghĩa Bean.
. Thẻ này dùng đặt thuộc tính cho Bean.
. Thẻ này dùng lấy giá trị thuộc tính của Bean.
II.1.
Thẻ được dùng để khai báo phạm vi và định danh id
(identify) nhan dạng Bean. Nó tương tư như khai báo biến đối tượng của ban
trong mã Java.
Thẻ này khá linh động, ngữ nghĩa chính xác phụ thuộc
vào giá trị được đưa ra. Cú pháp của 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 dang 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. Nó tương tự như khai báo tên biến
trong cú pháp Java.
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, request,
session, application
BeanName Thuộc tính này để tham chiếu đến tên của
Bean.
TypeSpec TypeSpec có thể hoặc (|) trong các thuộc tính
sau:
TypeSpec ::= class = “className” | class =
“className” type = “typeName” | type =
“typeName” class = “className” | beanName
= “beanName” type = “typeName” | type =
“typeName” beanName = “beanName” | type =
“typeName”
class: tên đầy đủ của lớp Bean. Đây là tên tập
tin .class sau khi đã biên dịch từ mã nguồn
.java. Tên này cũng hân biệt chữ hoa, thường.
page
Đây là giá trị mặc định của scope. Bean với giá trị này sẽ có sẵn từ
javax.servlet.jsp.PageContext trong trang hiện hành. Bean sẽ được loại bỏ khi
một response gởi trở về client hoặc request được chuyển tới một trang mới.
request
Bean có giá trị này thì có sẵn từ đối tượng ServletRequest của trang
hiện hành và bất kỳ trang được include hay forward nào bằng cách sử dụng
phương thức getAttribute(name). Bean sẽ bị huỷ bỏ khi một response gởi trở
về client.
session
Bean được sử dụng trong bất kỳ trang nào có tham gia vào một session
của client. Có phạm vi trong cả một session của client. Bean này được lưu trữ
trong đối tượng HttpSession.
application
Bean được sử dụng trong bất kỳ trang nào trong ứng dụng hiện hành
(cả request hiện tại và tương lai).
II.2.
Thẻ 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 co phép. Cú pháp của :
options có thể hoặc (|) trong các thuộc tính sau:
options::=property =“*” | property =“propertyName” | property
=“propertyName” param =“paraName” | property =“propertyName” value
=“{ | string}”
Thuộc tính Diễn giải
Name Thuộc tính này trình bày tên của Bean
được định nghĩa bởi thẻ
Property Thuộc tính Bean cần gán giá trị
Param Tham số cần dùng cho thuộc tính Bean
Value Giá trị được gán vào cho thuộc tính của
Bean
Ví dụ gán giá trị cho thuộc tính BeanValue nhu sau:
<jsp:setProperty name = “bean” property = “BeanValue” value = “12 +
3”>
II.3.
Thẻ dùng lấy giá trị của thuộc tính Bean và chuyển
giá trị thành kiểu chuỗi. Cú pháp cho thẻ như sau:
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ẻ
Property Thuộc tính của Bean mà bạn cần lấy
giá trị
Ví dụ:
Chương IV
GIỚI THIỆU JDBC
I. JDBC và trình điều khiển truy xuất cơ sở dữ liệu
Công việc lập trình ứng dụng mà JSP và servlet thường thực hiện nhất đó
là lưu trữ và truy xuất cơ sở dữ liệu (database), cung cấp thông tin cho trình
khách. Việc truy xuất cơ sở dữ liệu trong JSP và servlet dựa vào trình truy
xuất JDBC theo chuẩn Java. JDBC là các trình đạo diễn cho phép bạn truy cập
vào cơ sở dữ liệu của các hệ như Access, MS SQL Server, Oracle… bằng
ngôn ngữ truy vấn SQL.
Theo đặc tả của Sun có 4 kiểu JDBC sau:
Truy xuất cơ sở dữ liệu JDBC-ODBC
Java Application,
Applet, Servlet
JDBC Driver
ODBC
Database driver
Cơ sở dữ liệu (Access,
SQL Server, Oracle)
Mã Java
Mã đặc
thù
Kiểu 1: JDBC sử dụng cầu nối ODBC. Nếu bạn đã từng làm việc với
các hệ cơ sở dữ liệu trên Windows, bạn sẽ biết đến cách kết nối ODBC (Open
Database Connectivity). ODBC là cách kết nối tổng quát nhất đến mội hệ cơ
sở dữ liệu thông qua trình quản lý ODBc của Windows. Mỗi hệ cơ sở dữ liệu
sẽ cung cấp một trình điều khiển (driver) có khả năng đọc hiểu được cơ sở dữ
liệu của chúng. Trình điều khiển này sẽ được đăng ký với bộ quản lý ODBC.
Tất cả các lệnh truy xuất cơ sở dữ liệu sau đó được thực thi bằng lệnh SQL.
Java cung cấp cho chúng ta khả năng sử dụng JDBC để gọi ODBC và bằng
cách này chúng ta có thể kiểm soát rất nhiều hệ quản trị cơ sở dữ liệu khác
nhau. Quan hệ cầu nối JDBC-ODBC được thể hiện trong hình sau. Sun cung
cấp sẵn thư viện kết nối JDBC-ODBC kèm theo bộ JDK.
Kiểu 2: JDBC kế nối trực tiếp với các trình điều khiển cơ sở dữ liệu. Ki
Java phát triển, các nhà cung cấp hỗ trợ các trình điều khiển JDBC kết nối trực
tiếp với trình điều khiển đặc thù của mỗi hệ cơ sở dữ liệu (native database
driver), mà không cần phải qua trung gian ODBC của Windows nữa. Các kết
nối này nhanh và hiệu quả hơn kiểu JDBC-ODBC.
JDBC truy xuất cơ sở dữ liệu kiểu 2
Java Application,
Applet, Servlet
JDBC Driver
Database driver
Cơ sở dữ liệu (Access,
SQL Server, Oracle)
Mã Java
Mã đặc
thù
Kiểu 3: JDBC kết nối thông qua các ứng dụng mạng trung gian. Ngày
nay, các ứng dụng đều gắn liền với Internet. Theo mô hình lập trình phân tán,
ứng dụng trung gian (middle-ware) trên một máy chủ sẽ chịu trách nhiệm kết
nối với cơ sở dữ liệu. Nhiệm vụ của trình khách là sử dụng những trình điều
khiển JDBC gọn nhẹ, có khả năng giao tiếp với ứng dụng trung gian qua
Internet để truy vấn dữ liệu.
Kiểu 4: JDBC kết nối thông qua các trình điều khiển đặc thù ở xa. Mô
hình kết nối theo kiểu 3 do phải qua ứng dụng trung gian (middle-ware) nên có
thể ảnh hưởng đến tốc độ truy xuất cơ sở dữ liệu phía máy khách. Java đưa ra
kết nối JDBC kiểu 4 cho phép trình khách sử dụng các trình điều khiển gọn
nhẹ kết nối trực tiếp vào trình điều khiển cơ sở dữ liệu đặc thù (thuần Java)
trên máy chủ ở xa thông qua mạng Internet.
Truy xuất cơ sở dữ liệu bằng JDBC kiểu 3
Java Application,
Applet, Servlet
JDBC Driver
JavaMiddle-Ware
Cơ sở dữ liệu (Access,
SQL Server, Oracle)
Mã Java
Mã Java
Internet
JavaNative Driver
Truy xuất cơ sở dữ liệu bằng JDBC kiểu 4
Java Application,
Applet, Servlet
JDBC Driver
Cơ sở dữ liệu (Access,
SQL Server, Oracle)
Mã Java
Mã Java
Internet
JavaNative Driver
II. Truy xuất cơ sở dữ liệu thông qua JDBC-ODBC
Hiện nay, hệ điều hành Windows cũng như các cơ sở dữ liệu chạy trên
nên Windows như MS Access, MS SQLServer, .. rất phổ biến nên theo xu
hướng chung đó chúng ta sử dụng các truy xuất dữ liệu bằng trình điều khiển
JDBC-ODBC (kiểu 1) – đây là kiểu thông dụng và dễ dùng nhất.
I.1. Kết nối với cơ sở dữ liệu
Kết nối với cơ sở dữ liệu, JDBC đòi hỏi hai yếu tố là trình điều khiển
(tương ứng với các kiểu kết nối) và thông tin để kết nối (như địa chỉ máy chủ,
tên tài khoản đang đăng nhập và mật khẩu …). Đối với cơ chế truy xuất thông
qua ODBC của Windows, chúng ta sử dụng trình điều khiển JdbcOdbcDriver
do Sun cung cấp. Khai báo tên lớp này như sau:
String drivername = “sun.jdbc.odbc.JdbcOdbcDriver”;
Sau đó gọi phương thức tĩnh forName của lớp Class để nạp và khởi tạo
trình điều khiển:
Class.forName (drivername).newInstance ();
Tiếp đó cung cấp cho trình điều khiển các thông tin cụ thể như: tên cơ
sở dữ liệu, tên người dùng, mật khẩu như sau:
String connectionURL = “jdbc:odbc:quanliNV”;
String username = “sa” //Tên mặc định đặng nhập vào cơ sở dữ liệu
MS SQLServer
String password = “” // Mật khẩu mặc định
Cuối cùng đối tượng Connection sẽ thể hiện kết nối đến cơ sở dữ liệu,
gọi phương thức getConnection của lớp DriverManager để yêu cầu trình điều
khiển nạp bởi Class.forName () trước đây tiếp nhận thông tin và thực hiện kết
nối.
// Đối tượng kết nối JDBC
Connection con = null;
// Tạo kết nối
con = DriverManager.getConnection (connectionURL,
username, password);
II.2. Truy vấn dữ liệu
Bước quan trọng là trích dữ liệu của các bảng trong cơ sở dữ liệu trong
cơ sở dữ liệu, định nghĩa câu truy vấn SQL như sau:
SELECT FROM [WHERE
] [GROUP BY [,
]…]
: danh sách các trường cần trích ra từ
[danh sách] , *: liệt kê hết các trường trong
bảng.
: tên 1 hoặc nhiều bảng trong CSDL
[WHERE ]: điều kiện cho phép
lọc các record với một hoặc nhiều thuộc tính thỏa điều kiện tìm
kiếm
Ví dụ: String sqlQuery = “SELECT * FROM NHANVIEN
WHERE MANV = ‘DP06’”;
String sqlQuery = “SELECT MANV, HoNV, MACV
FROM NHANVIEN”;
JDBC dựa vào đối tượng Statement để yêu cầu truy vấn dữ liệu. Đối
tượng này dùng để thực thi mọi câu lệnh SQL. Riêng đối với lệnh SQL
SELECT nếu truy vấn thành công, Statement sẽ trả về kết quả là tập dữ liệu
truy vấn được có kiểu ResultSet.
Statement stmt = null;
ResultSet rs = null;
stmt = con.createStatement ();
rs = stmt.executeQuery (sqlQuery);
II.3. Trích xuất dữ liệu
Lệnh SELECT sau khi nhận được kết quả trả về là tập ResultSet, chúng
ta gọi phương thức next () để đi đến từng mẫu tin và in ra kết quả của các cột.
Phương thức next () sẽ trả về false nếu đã đến cuối tập dữ liệu.
While (rs.next ())
{
//In dữ liệu cột thứ nhất trong mẫu tin
out.println (rs.getString (1));
//In dữ liệu của cột thứ 2 trong mẫu tin
out.println (rs.getString (2));
…
}
II.4. Xử lý các lệnh SQL INSERT / UPDATE / DELETE
Ngoài lệnh SQL SELECT thường sử dụng ra, các lệnh thay đổi dữ liệu
như INSERT (tạo một mẫu tin), UPDATE (cập nhật mẫu tin) và DELETE
(xóa bỏ mẫu tin) cũng sẽ được sử dụng rất thường xuyên trong chương trình.
INSERT:
Cú pháp: INSERT INTO [ [,
]…] VALUES ( [,
]…)
: tên bảng cần thêm mẫu tin
: tên cột cần thêm dữ liệu, nếu không nêu
tên cột nó sẽ tự động thêm dữ liệu vào các cột tương ứng
trong bảng của theo mệnh đề VALUES.
Ví dụ: INSERT INTO NHOM (MANHOM, TenNhom)
VALUES (‘DA’, ‘Data Entry A’)
String sSQL = “INSERT INTO NHOM (MANHOM,
TenNhom) VALUES (‘DA’, ‘Data Entry A’);
stat.executeQuery (sSQL);
UPDATE:
Cú pháp:
UPDATE table_name SET column_name1 = expression1,
column_name2 = expression 2, … [WHERE ]
table_name: tên bảng cần thay đổi dữ liệu
column_name1, column_name2: tên cột cần thay đổi dữ liệu
search_condition: điều kiện tìm kiếm cập nhật.
Ví dụ:
UPDATE NHOM SET MANHOM = ‘DA’, TenNhom = ‘Data Entry B’
String sSQL = “update NHOM set MANHOM = ‘DA’, TenNhom =
‘Data Entry B’;
stat.executeQuery (sSQL);
DELETE
Cú pháp:
DELETE table_name [WHERE ]
table_name: tên bảng cần xóa dữ liệu
search_condition: điều kiện tìm để xóa dữ liệu
Ví dụ:
DELETE NHOM WHERE MANHOM = ‘OF’
String sSQL = “delete NHOM where MANHOM = ‘OF’;
Stat.executeQuery (sSQL);
Phần II
PHÂN TÍCH – THIẾT KẾ – CÀI ĐẶT
Chương V
PHÂN TÍCH – THIẾT KẾ
I. Phân tích
I.1. Đặt vấn đề
Xuất phát từ nhu cầu quản lý nhân sự trên trang Web, thao tác thân thiện
với người dùng, tránh được các sai sót không thể tránh khỏi khi làm việc trực
tiếp trên CSDL có thể làm mất mát thông tin, dễ hiểu cho những người không
chuyên dùng các hệ CSDL của công ty. Em xin xây dựng một web site áp
dụng công nghệ JSP và dùng hệ quản trị CSDL SQL Server nhằm đáp ứng nhu
cầu trên. Trong quá trình làm với vốn kiến thức còn có hạn trong bước đầu
tiếp xúc với công nghệ, ngôn ngữ, mô hình quản lí CSDL mới chắc không
tránh khỏi nhiều sai sót, em mong luôn nhận được những đóng góp ý kiến quí
báo của thầy cô và bạn bè.
I.2. Định nghĩa các yêu cầu
- Quản lý
+ Xem thông tin nhân viên
+ Thêm nhân viên mới
+ Xóa nhân viên đã nghỉ việc
+ Thông báo kế hoạch sản xuất trong quí
+ Thay đổi chức vụ, lương, … của nhân viên
- Admin
+ Tạo / xóa / sửa user
+ Thêm / xóa / sửa các quyền
+ Gán quyền cho user
- Nhân viên
+ Đăng ký tuyển dụng
+ Xem thông tin các nhân viên
I.3. Phạm vi đề tài
Về dữ liệu
Cập nhật dữ liệu trực tuyến
Về giao diện
Hệ thống hoặt động trên môi trường Web
Về xử lý
o Cho phép đăng ký tuyển dụng
o Xem thông tin nhân viên
o Thêm nhân viên mới
o Xóa nhân viên đã nghỉ việc
o Thông báo kế hoạch sản xuất trong quí
o Thay đổi chức vụ, lương, … của nhân viên
I.4. Mô hình xử lý quan niệm
I.4.1. Sơ đồ ngữ cảnh
I.4.2. Sơ đồ phân rã chức năng
Đổi quyền user
Đổi password
Gán quyền user
Tạo user
Xem thông tin NV
Xóa NV
Sửa thông tin NV
Thêm NV
Đổi password
Xem thông tin NV
Đổi password
Quản lý
nhân viên
Nhân viên Quản lý
Admin
Quản lý nhân
viên
Phục vụ nhân viên
Xem thông tin
NV
Đổi password
Phục vụ admin
Đổi password
Đổi quyền user
Tạo user
Gán quyền user
Phục vụ quản lý
Xem thông tin
NV
Đổi password
Thêm NV
Xóa NV
Sửa thông tin
NV
I.4.3. Sơ đồ hệ thống
Mức 1:
Dữ liệu NV
Password
Thông tin
NV
Bảng chi tiết NV
Quản lý
Nhân viên
Đổi
password
Xem
thông tin
NV
Đổi
thông tin
NV
Nhân viên
Bảng chi tiết NV
Bảng chi tiết NV
Bảng cập nhật
Dữ liệu Password
Password
Admin
Permission
Password
Đổi
thông tin
user Bảng thay đổi
Dữ liệu user
Mức 2:
- Phân rã xử lý đổi thông tin NV
- Phân rã xử lý Đổi thông tin user
Bảng cập
nhật NV Quản lý
Nhân viên
Dữ liệu NV
1.
Thêm NV
2.
Xóa NV
3.
Edit NV
Bảng cập
nhật user Admin
Permission
Dữ liệu user
1.
Thêm user
2.
Xóa user
I.5. Mô hình dữ liệu quan niệm
Sơ đồ thực thể kết hợp
NG NGỮ
-Mã NN
-Tên NN
NV-NN
-Mã NN
-Mã NV
-Cấp độ
NHÓM
-Mã nhóm
-Tên nhóm
TDVH
-Mã TĐVH
-Tên TĐVH
TRƯỜNG
-Mã Tr
-Tên Tr
C MÔN NV-CM
TỈNH
-Mã tỉnh
-Tên tỉnh
ĐƯỜNG
-Mã đường
-Tên đường
Đ CHỈ
-Số nhã HUYỆN
-Mã huyện
-Tên
huyện
II. Thiết kế
II.1.Thiết kế xử lý
II.1.1. Sơ đồ hệ thống mức vật lý
Bảng cập
nhật user
Dữ liệu user
2.
Xóa user
username & password & permission
username & password & permission
Admin
Permission
1.
Thêm user
3.
Edit user
username & password & permission
user_id & username & password & permission
user_id user_id
II.1.2. Các đơn vị thiết kế
- Cập nhật Nhân viên
Thêm nhân viên:
MANV
MANV
Bảng cập
nhật NV Quản lý
Nhân viên
Dữ liệu NV
1.
Thêm NV
2.
Xóa NV
3.
Edit NV
MANV, HoNV, TnenNV, … MANV, HoNV, TnenNV, …
MANV, HoNV, TnenNV, … MANV, HoNV, TnenNV, …
Nhập: MANV, HoNV, TenNV, GioiTinh, NgaySinh,
NgayVaoCty, MACV, MATDVH
Xuất: thông báo đã thêm / thông báo lỗi
Chỉnh sửa thông tin nhân viên:
Nhập: MANV, HoNV, TenNV, GioiTinh, NgaySinh,
NgayVaoCty, MACV, MATDVH
Xuất: thông báo đã sửa / thông báo lỗi
Xóa nhân viên:
Nhập: MANV
Xuất: thông báo đã xóa
- Cập nhật user:
Thêm user
Nhập: username, password, permission
Xuất: thông báo đã thêm / thông báo lỗi
Sửa
Nhập: username, password, permission
Xuất: thông báo dã sửa / thông báo lỗi
Xóa
Nhập: user_id
Xuất: thông báo đã xóa / thông báo lỗi
II.1.3. Một số giải thuật được thể hiện bằng lưu đồ
Begin
Nhập tất cả các
thông tin nhân viên
Mở bảng NHANVIEN
Nhân viên đã
tồn tài?
Không
Lưu các thông tin đã nhập vào CSDL Thông báo NV đã
tồn tại
Có
Thông báo đã thêm nhân viên
Tiếp tục? Có
Begin
Nhập username,
password, permission
II.2. Thiết kế cơ sở dữ liệu
Table FieldName DataType FieldSize ValidationRule
NHANVIEN MANV Nvarchar 4 Primary Key,
len() = 4
HoNV Nvarchar 30
TenNV Nvarchar 7
GioiTinh Bit 0 or 1 0: Nam; 1: Nu
NgaySinh Smalldate >= 25/07/1985
and
(<=25/07/1948
với GioiTinh =
1, <=25/07/1943
với Giới tính =
0)
NgayVaoCt
y
Smalldate >= 25/07/2002
and <= ngày
hiện tại
MANHOM Nvarchar 2 FK, lookup
(NHOM)
MACV Int FK, lookup
(CHUCVU)
MATDVH Nvarchar 3 FK, lookup
(TDVH)
MANV: 4 ký tự, 2 ký tự đầu là mã NHOM, 2 ký tự sau là 2 ký số
Ví dụ: DA08: nhân viên thuộc nhóm Data Entry A
Table FieldName DataType FieldSize ValidationRule
CHUCVU MACV Int >=1
TenCV Nvarchar 25
CHUYEN
MON
MACM Int >=1
TenCM Nvarchar 30
TgDT Nvarchar 8 Tính bằng tháng,
ví dụ: 08 Thang
DIACHI MANV Nvarchar 4 FK, lookup
(NHANVIEN)
MADUON
G
Nvarchar 3 FK, looup
(DUONG),
trường hợp địa
chỉ người ở nông
thôn, mã đường là
000
MAXA Nvarchar 6
SoNha Nvarchar 20
DIENTH
OAI
SoDT Nvarchar 10 PK
DUONG MADUON
G
Nvarchar 3 PK, len () = 3
TenDuong Nvarchar 20
HUYEN MAHUYE
N
Nvarchar 4 PK, len () = 4
MATINH Nvarchar 2 FK, lookup
(TINH)
TenHuyen Nvarchar 20
LUONG MALUON
G
Int PK
LuongCB Money
LIDO MALD Int PK
TenLD Nvarchar 30
NGHI MALD Int FK, lookup
(LIDO)
MANV Nvarchar 4 FK, lookup
(NHANVIEN)
NgayBD Smalldate PK
NgayKT Smalldate NgayBD >
NgayKT
NGOAIN
GU
MANN Int PK
TenNN Nvarchar 15
NHOM MANHOM Nvarchar 2 PK, len () = 2
TenNhom Nvarchar 25
NV_CM MANV Nvarchar 4 FK, lookup
(NHANVIEN)
MACM Int FK, lookup
(CHUYENMON)
MATR Nvarchar 3 FK, lookup
(TRUONG)
NgayBDDT Smalldate
NgayKTDT Smalldate NgayBDDT >
NgayKTDT
NV_DT MANV Nvarchar 4 FK, lookup
(NHANVIEN)
SoDT Nvarchar 10 FK, lookup
(DIENTHOAI)
NV_LUO
NG
MANV Nvarchar 4 FK, lookup
(NHANVIEN)
MALUON
G
Int FK, lookup
(LUONG)
HeSoLuong Real
NgayLL Smalldate
NV_NN MANN Int FK, lookup
(NGOAINGU)
MANV Nvarchar 4 FK, lookup
(NHANVIEN)
CapDo Nvarchar 10
PERMISS
ION
user_id Int PK
username Nvarchar 30 Not Null
password Nvarchar 15 Not Null
permission Int Not Null
TDVH MATDVH Int PK, >=1
TenTDVH Nvarchar 25
TINH MATINH Nvarchar 2 PK, len () = 2
TenTinh Nvarchar 15 Ví dụ: TP. Ho
Chi Minh
TRUONG MATRUO
NG
Nvarchar 3 PK, len () = 3
TenTruong Nvarchar 50
TUYEND
UNG
Em_id Int PK
Ho Nvarchar 30
Ten Nvarchar 7
Email Nvarchar 30
NamSinh Smalldate Như điều kiện
của NHANVIEN
DT Nvarchar 10
TDVH Nvarchar 4 Ví dụ: PTTH: phổ
thông trung học,
DH: đại học
ViTri Int Ví trí được ghi
trong thong báo
tuyển dụng
XA MAXA Nvarchar 6 2kí tự đầu là mã
tỉnh, 2 kí tự tiếp
theo là mã huyện,
2 kí tự cuối là thứ
tự của xã trong
huyện
TenXa Nvarchar 25
MAHUYE
N
Nvarchar 4 FK, lookup
(HUYEN)
II.3. Các ràng buộc toàn vẹn
RB1: MACV là khóa chính của CHUCVU
RB2: MACM là khóa chính của CHUYENMON
RB3: MANV & MADUONG & MAXA là khóa chính của DIACHI
RB4: SoDT là khóa chính của DIENTHOAI
RB5: MADUONG là khóa chính của DUONG
RB6: MAHUYEN là khóa chính của HUYEN
RB7: MALD là khóa chính của LIDO
RB8: MALUONG là khóa chính của LUONG
RB9: MANV & MALD & NgayBD là khóa chính của NGHI
RB10: MANN là khóa chính của NGOAINGU
RB11: MANV là khóa chính của NHANVIEN
RB12: MANHOM là khóa chính của NHOM
RB13: MANV & MACM & MATRUONG & NgayBDDT là khóa
chính của NV_CM
RB14: MANV & SoDT là khóa chính của NV_DT
RB15: MANV & MALUONG & NgayLL là khóa chính của
NV_LUONG
RB16: MANV & MANN là khóa chính của NV_NN
RB17: user_id là khóa chính của PERMISSION
RB18: MATDVH là khóa chính của TDVH
RB19: MATINH là khóa chính của TINH
RB20: MATRUONG là khóa chính của TRUONG
RB21: em_id là khóa chính của TUYENDUNG
RB22: MAXA là khóa chính của XA
RB23: MANV & MALD là khóa ngoại của NGHI tham chiếu đến
NHANVIEN & LIDO
RB24: MANV & MACM & MATRUONG là khóa ngoại của
NV_CM tham chiếu đến NHANVIEN & CHUYENMON &
TRUONG
RB25: MANV & SoDT là khóa ngoại của NV_DT tham chiếu đến
NHANVIEN & DIENTHOAI
RB26: MANV & MALUONG là khóa ngoại của NV_LUONG
tham chiếu đến NHANVIEN & LUONG
RB27: MANV & MANN là khóa ngoại của NV_NN tham chiếu
đến NHANVIEN & NGOAINGU
III. Thiết kế giao diện
Website QLNV
Default.jsp
Trang chủ
Registration.jsp
Đăng ký tuyển
Login.jsp
Đăng nhập
Không hợp lệ
Các thành phần của Admin
AddNewUser.jsp
AdminViewUser.jsp
Add user
Các thành phần của
Manager
Tiếp tục Hợp lệ
Thông tin nhân
viên
Add
Thêm nhân viên
Đã thêm NV
Không tiếp tục
Tiếp tục Hợp lệ
Thông tin tỉnh
Add
Thêm tỉnh
Đã thêm tỉnh
Không tiếp tục
Tiếp tục Hợp lệ
Ngoại ngữ
Add
Thêm ngoại ngữ
Đã thêm NN
Không tiếp tục
…
CHƯƠNG VI
CÀI ĐẶT TRIỂN KHAI ỨNG DỤNG
I. Các phần mềm cần thiết
Đây là ứng dụng độc lập nền nên nó có thể chạy trên các hệ điều hành
khác nhau như các hệ thống Windows, Unix, …. Do đó chúng ta có thể cài đặt
hệ điều hành thuộc một trong các hệ thống trên và các phần mềm sau:
- Jrun 3.0 là phần mềm tạo web server cho các trang web sử dụng JSP
- JDK 1.2 trở lên.
- Microsoft SQLServer tử 7.0 trở lên
- Internet Explorer version 4 trở lên làm browser
- Vietkey hoặc các phần mềm hỗ trợ gõ phong unicode
- Macromedia Dreamweaver MX dùng để thiết kế các trang web
- CoffeeCup Firestarter tạo các flash động
- …
II. Triển khai ứng dụng
Đây là 1 ứng dụng web có truy xuất CSDL và các xử lý liên quan đều
được thực hiện trên server (ở đây là phần mềm giả lập server), nên khi sử
dựng phải khởi động các phần mềm liên quan:
- Mở MS SQLServer 2000 (Service Manager)
- Mở Jrun 3.0 (Default Server)
- Mở IE
Sau đó nhập địa chỉ sau vào thanh địa chỉ của IE
+ localhost: là địa chỉ máy chủ
+ 8100: là cổng dịch vụ của Jrun
CHƯƠNG VII
KẾ QUẢ ĐẠT ĐƯỢC VÀ HƯỚNG PHÁT TRIỂN
I. Kế quả đạt được
- Trang chủ của ứng dụng
- Trang login: khi muốn đăng nhập để chỉnh sửa CSDL, thay đổi quyền
truy nhập qua trang này để nó đưa đến các trang mà user được sử dụng
- Trang quản lý nhân sử của Manager từ trang này chúng ta có thể gọi các
trang thêm, sửa, xóa một nhân viên
- Trang thêm nhân viên mới được gọi từ trang AminStaffview
- Trang EditStaff (chỉnh sửa thông tin nhân viên) được gọi từ trang
AdminStaffView
II. Kết luận
Ứng dụng đã đáp ứng được yêu cầu đề ra trong giai đoạn phân tích thiết
kế hệ thống.
Ứng dụng kết hợp được các công nghệ độc lập nền JSP, Microsoft SQL
Server.
Về cơ sở dữ liệu, sơ đồ thực thể kết hợp đạt dạng chuẩn ba.
III. Hướng phát triển
Các hướng phát triển sau sẽ làm cho ứng dụng hoàn thiện hơn:
- Mở rộng ứng dụng với quy mô lớn hơn, có khả năng trao đổi dữ liệu
và xử lý với ứng dụng khác.
- Sử dụng tiếng Việt trong cơ sở dữ liệu.
- Xây dựng ứng dụng có khả năng upload các file ảnh, hồ sơ của các ứng
viên vào cơ sở dữ liệu.
Các file đính kèm theo tài liệu này:
- Đồ án tốt nghiệp - Phân tích thiết kế hệ thống - NGÔN NGỮ CÀI ĐẶT WEBSITE.pdf