Đề tài Tìm hiểu công nghệ jsp và ứng dụng xây dựng website quản lí nhân viên công ty Xoai

Tài liệu Đề tài Tìm hiểu công nghệ jsp và ứng dụng xây dựng website quản lí nhân viên công ty Xoai: Yêu cầu về nội dung đề tài: 1. Lý thuyết: Tìm hiểu công nghệ JSP, với các phần chính phục vụ cho chương trình như: nhúng, chuyển hướng, chuyển tham số, … Xây dựng một cơ sở dữ liệu có khả năng kết nối và làm việc trên trang web 2. Thiết kế chương trình: Thiết kế chương trình với các chức năng chính, thêm cập nhật, sửa chữa thông tin nhân viên. GIỚI THIỆU ĐỀ TÀI Phần I GIỚI THIỆU VỀ NGÔN NGỮ CÀI ĐẶT Chương I CĂN BẢN VỀ JSP JavaServer Pages (JSP) là một kỹ thuật server-side do đó chúng ta không thể thực hiện bất kỳ hành động nào ở client. JSP cho phép chúng ta tách thành phần động của trang ra khỏi thành phần tĩnh HTML. Rất đơn giản, chúng ta chỉ cần viết một tài liệu HTML bình thường rồi sau đó bao quanh mã của thành phần động trong các tag đặc biệt, hầu hết các tag bắt đầu với . Ví dụ, đây là một phần của trang JSP, có kết quả trả về là “Thanks for reading Van Dau book.” với URL là Thanks for reading book. Kỹ thuật JSP là một thành phần trong đại gia đình Java; nó ...

doc60 trang | Chia sẻ: hunglv | Lượt xem: 1184 | Lượt tải: 2download
Bạn đang xem trước 20 trang mẫu tài liệu Đề tài Tìm hiểu công nghệ jsp và ứng dụng xây dựng website quản lí nhân viên công ty Xoai, để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
Yêu cầu về nội dung đề tài: 1. Lý thuyết: Tìm hiểu cơng nghệ JSP, với các phần chính phục vụ cho chương trình như: nhúng, chuyển hướng, chuyển tham số, … Xây dựng một cơ sở dữ liệu cĩ khả năng kết nối và làm việc trên trang web 2. Thiết kế chương trình: Thiết kế chương trình với các chức năng chính, thêm cập nhật, sửa chữa thơng tin nhân viên. GIỚI THIỆU ĐỀ TÀI Phần I GIỚI THIỆU VỀ NGƠN NGỮ CÀI ĐẶT Chương I CĂN BẢN VỀ JSP JavaServer Pages (JSP) là một kỹ thuật server-side do đĩ chúng ta khơng thể thực hiện bất kỳ hành động nào ở client. JSP cho phép chúng ta tách thành phần động của trang ra khỏi thành phần tĩnh HTML. Rất đơn giản, chúng ta chỉ cần viết một tài liệu HTML bình thường rồi sau đĩ bao quanh mã của thành phần động trong các tag đặc biệt, hầu hết các tag bắt đầu với . Ví dụ, đây là một phần của trang JSP, cĩ kết quả trả về là “Thanks for reading Van Dau book.” với URL là Thanks for reading book. Kỹ thuật JSP là một thành phần trong đại gia đình Java; nĩ sử dùng ngơn ngữ kịch bản dựa vào ngơn ngữ lập trình Java, và các trang JSP được biên dịch thành servlets. Từ đĩ chúng ta cũng nhận biết được, JSP thì khơng phụ thuộc bất kỳ nền (platform) nào. Nĩ đáp ứng được khuynh hướng của Sun MicroSystem là “write one, run anywhere”. Các trang JSP cĩ thể gọi các thành phần JavaBeans, Enterprise JavaBeans (EJB) hoặc custom tags để thực hiện các xử lý trên server. Và như thế, kỹ thuật JSP là thành phần chủ chốt trong kiến trúc khả chuyển của Java cho những ứng dụng dựa vào Web. Như đã biết, JSPs sẽ biên dịch thành servlets nhưng JSP khơng thể thay thế servlet vì các lý do sau: Một số tác vụ được giải quyết rất tốt bằng servlet. Ví dụ, các ứng dụng xuất ra dữ liệu nhị phân hoặc chỉ xác định nơi gởi trở lại cho người dùng (bằng cách dùng response.sendRedirect) được dùng servlet thì tốt nhất. Một số tác vụ khác lại được giải quyết rất tốt bằng JSP như các tình huống mà cấu trúc nền tảng của trang HTML là cố định nhưng các giá trị trong nĩ lại thay đổi. Cịn các tác vụ cịn lại cần sự kết hợp cả servlet và JSP. Ví dụ, trong yêu cầu gốc được trả lời bằng một servlet mà thực hiện mọi cơng việc, lưu trữ các kết quả trong các Beans và điều phối yêu cầu này đến một trong những trang JSP cĩ thể hiển thị nĩ. Cả ba định hướng này đều cĩ chổ đứng của nĩ. Chẳng cĩ định hướng nào hổ trợ đầy đủ cho mọi ứng dụng . Trước khi đi vào chi tiết cơng nghệ JSP, chúng tơi cĩ một vài so sánh các cơng nghệ được sử dụng trong ứng dụng với các cơng nghệ khác. So sánh JSP với các cơng nghệ khác. I.1. JSP với ASP ASP là cơng nghệ tương đương từ Microsoft. JSP cĩ ba lợi thế so với ASP. - Phần động được viết bằng Java, chứ khơng phải bằng các ngơn ngữ script như VBScript, JavaScript. Vì thế nĩ mạnh mẽ hơn tốt hơn đối với các ứng dụng phức tạp cần các thành phần sử dụng lại. - JSP chạy được trên nhiều hệ điều hành và web servers khác nhau ngay cả với IIS của Microsoft (cần cĩ plugins từ Webphere, JRun, ...) Hỗ trợ sự mở rộng tag với custom tag. I.2. JSP với PHP Lợi điểm của JSP với PHP cũng như với ASP. JSP được viết bằng Java mà chúng ta đã biết với các API mở rộng cho mạng, truy cập cơ sở dữ liệu, các đối tượng phân tán, … trong khi với PHP địi hỏi chúng ta phải học cả một ngơn ngữ mới. II. Các thành phần script của JSP. Các thẻ bọc mã trong JSP cho phép chúng ta chèn mã vào servlet mã sẽ được phát sinh từ trang JSP. Cĩ ba dạng sau: Biểu thức cĩ dạng , được định giá trị và chèn vào luồng xuất của servlet. Scriptlet cĩ dạng , được chèn vào phương thức _jspService của servlet (được gọi là service). Khai báo cĩ dạng , được chèn vào thân của lớp servlet, như là các field của lớp thơng thường. Template text Trong nhiều trường hợp, phần lớn các trang JSP chỉ bao gồm HTML tĩnh, được biết như là template text. Cĩ hai ngoại lệ phụ cho quy tắc “template text được chuyển thẳng sang HTML tĩnh”. Đầu tiên, nếu chúng ta muốn cĩ <% trong luồng xuất thì chúng ta cần phải đặt <\% trong template text. Thứ hai, nếu chúng ta muốn cĩ chú thích trong JSP mà khơng cĩ trong tài liệu kết quả, dùng: Chú thích HTML cĩ dạng: thì được chuyển qua tài liệu HTML thơng thường. Cú pháp XML Trong JSP cĩ rất nhiều element cĩ cú pháp XML như jsp:useBean, jsp:include, jsp:setProperty, ... Tuy nhiên scripting elements lại cĩ hai dạng cú pháp sau: JSP Syntax XML Syntax Java code Java code Java code II.1. Các biến được định nghĩa sẵn trong JSP Để đơn giản hố mã trong các biểu thức hay scriptlets trong JSP, người ta cung cấp cho chúng ta chín đối tượng đã được định nghĩa trước, cĩ người cịn gọi là các đối tượng ngầm định. Do các khai báo trong JSP nằm ngồi phương thức _jspService (được gọi bởi service) nên các đối tượng này khơng cho phép các khai báo truy cập vào. request Biến này cĩ kiểu là javax.servlet.http.HttpServletRequest, cĩ phạm vi trong một yêu cầu (request). Nĩ cho phép chúng ta truy cập vào các tham số của request như loại request (GET, POST, …) và các incoming HTTP header (cookies). response Cĩ kiểu là javax.servlet.http.HttpServletResponse, cĩ phạm vi tồn trang (page). Chú ý rằng vì luồng xuất thì thường làm vật đệm cho nên việc gán mã tình trạng của HTTP và response header thì hợp lý trong JSP, mặc dù điều này thì khơng được phép trong servlet một khi đã cĩ luồng xuất nào được gởi đến client. out Cĩ kiểu javax.servlet.jsp.JspWriter và phạm vi trong một trang (page). Dùng để gởi các thơng xuất đến client. Đối tượng out được dùng thường xuyên trong scriptlets, các biểu thức tự động được đưa vào luồng xuất nên hiếm khi cần tham chiếu đến đối tượng này. session Cĩ phạm vi trong một phiên truyền (session) và kiểu tương ứng là javax.servlet.http.HttpSession. Gọi về các phiên truyền được tạo tự động vì thế biến này vẫn cịn kết nối ngay cả chẳng cĩ một tham chiếu incoming session nào. Một ngoại lệ là nếu chúng ta sử dụng thuộc tính session của page directive để tắc các phiên truyền, mà lại cố tham chiếu đến biến session thì sẽ gây ra các lỗi vào lúc trang JSP được dịch thành servlet. application Biến này cĩ kiểu là javax.servlet.ServletContext, cĩ phạm vi trong tồn ứng dụng (application). ServletContext lấy từ một đối tượng cấu hình servlet là getServletConfig().getContext(). Các trang JSP cĩ thể lưu trữ dữ liệu persistent trong đối tượng ServletContext tốt hơn là trong các biến thể hiện. ServletContext cĩ các phương thức setAttribute và setAttribute mà cho phép chúng ta lưu trữ dữ liệu config Biến này cĩ phạm vi trang (page) và cĩ kiểu tương ứng là javax.servlet.ServletConfig. pageContext Biến này cĩ kiểu là javax.servlet.jsp.PageContext và cĩ phạm vi là trang (page). pageContext cho phép một điểm truy cập duy nhất tới nhiều thuộc tính của trang và cung cấp một nơi thuận tiện để lưu trữ dữ liệu dùng chung. Biến pageContext lưu trữ giá trị của javax.servlet.jsp.PageContext cùng với trang hiện hành. Cĩ thể xem chi tiết trong chương II về JavaBeans. page Biến này đồng nghĩa với this và điều này thì khơng hữu ích trong ngơn ngữ lập trình Java, cĩ kiểu là java.lang.Object và cĩ phạm vi trang (page). exception Trong một trang lỗi, chúng ta cĩ thể truy cập vào đối tượng exception. Biến này cĩ kiểu là java.lang.Throwable và phạm vị là trang (page). II.2. Biểu thức trong JSP Biểu thức trong JSP được dùng để chèn các giá trị trực tiếp vào luồng xuất. Nĩ cĩ dạng sau: Biểu thức này được định trị, được chuyển thành chuỗi, và được chèn vào trong trang. Sự định trị diễn ra ở thời gian runtime (khi trang được yêu cầu) và do đĩ cĩ đầy đủ quyền truy cập các thơng tin của yêu cầu này. Ví dụ sau đây mơ tả ngày/giờ mà trang được yêu cầu: Current time: Trong Java mỗi câu lệnh đều cĩ dấu ‘;’ kết thúc dịng. Tại sao biểu thức trong JSP lại khơng cĩ dấu ‘;’? Vì biểu thức này được đưa vào luồng xuất chẳng hạn như PrintWriter. Với ví dụ trên cĩ thể chuyển vào servlet như sau: PrintWriter out = response.getWriter(); out.println(“Current time:” + new java.util.Date()); Biểu thức như là giá trị trong elements khác. Biểu thức cĩ thể được sử dụng trong các thuộc tính của các elements khác. Giá trị từ các biểu thức này sẽ được tính vào thời gian yêu cầu (request time). Các elements cho phép sử dụng biểu thức trong các thuộc tính của chúng là: Tên Element Tên thuộc tính jsp:setProperty name và value jsp:include Page jsp:forward Page jsp:param Value II.3. JSP scriptlets Scriptlets là những đoạn mã cĩ chứa bất kỳ mã Java nào nằm giữa “”. Nếu chúng ta muốn thực hiện thứ gì đĩ phức tạp hơn là chỉ chèn vào một biểu thức đơn giản thì JSP scriptlets cho phép chúng ta thêm bất kỳ đoạn mã Java nào vào trang JSP. Các scriptlets này được đưa vào phương thức _jspService (mà được gọi bởi service) của servlet. Cĩ cú pháp: II.4. Khai báo trong JSP Một khai báo trong JSP cho phép chúng ta định nghĩa các phương thức hoặc các trường (biến) cĩ phạm vi tồn trang. Khai báo sẽ được chèn vào trong lớp của servlet (bên ngồi phương thức _jspService được gọi bởi service để xử lý một yêu cầu). Một khai báo cĩ dạng sau: Các khai báo trong JSP thì khơng phát sinh ra bất kỳ thơng xuất nào, chúng thường được dùng để liên kết với các biểu thức hoặc scriptlets. Chẳng hạn, đây là một trang JSP mà in ra số lần truy cập vào trang. III. Xử lý nhúng và chuyển hướng giữa các trang Trong quá trình xử lý và chuyển dữ liệu cho form chúng ta cĩ thể nhúng và triệu gọi những trang JSP khác với trang hiện hành.Ví dụ chúng ta cĩ thể đưa một trang HTML hoặc JSP vào trong trang JSP hiện tại để hổ trợ thêm thư viện hay tính năng bổ sung nào đĩ. Hay khi nhận được dữ liệu submit từ trình khách, trang JSP nhận được dữ liệu cĩ thể chuyển hướng hoặc triệu gọi đến trang JSP khác. III.1. Nhúng file vào trang với chỉ thi include Chỉ thị thường dùng để dem một nội dung file .html hay jsp bên ngồi vào trang hiện hành. Cú pháp sử dụng như sau: Ví dụ: Trong chương trình chúng ta cĩ sử dụng các hàm thư viện chứa trong file Common.jsp. Thư viện này được đưa vào trang JSP hiện hành như sau: III.2. Sử dụng thẻ Chỉ thị %@include % chỉ dùng để nhúng các mã nguồn tĩnh. Nếu muốn nhúng kết quả kết xuất từ các trang jsp, servlet hay .html khác vào trang hiện hành chúng ta sử dụng thẻ với cú pháp như sau: Ví dụ: trong chương trình sử dụng thẻ để nhúng kết quả của trang Header.jsp, Footer.jsp vào các trang JSP như sau: … III.3. Chuyển tham số bằng thẻ Khi nhúng trang bằng thẻ bạn cĩ thể chuyển tham số cho trang được nhúng để nhận được kết xuất linh động hơn bằng cách sử dụng thẻ con . Ví dụ testParam.jsp <% out.println (“Goi tham so từ test1.jsp”); %> testParam2.jsp <% String param = request.getParameter (“greeting”); out.println (“Goi tham so tu test2.jsp”); out.println (“param: “ + param); %> III.4. Chuyển tiếp đến trang khác với thẻ Chúng ta sử dụng thẻ để triệu gọi và chuyển dữ liệu cho trang jsp khác xử lý. Trong ví dụ sau chúng ta cĩ 3 trang JSP. Trang thứ nhất hiển thị form đăng nhập yêu cầu nhập vào tên username và password. Trang thứ hai kiểm tra: nếu username, password trùng với username, password cho trước thì thơng báo đăng nhập thành cơng, cịn nếu khơng đúng hoặc rỗng sẽ chuyển đến trang thứ 3 thơng báo yêu cầu đăng nhập những trường cịn thiếu. Ví dụ: Login.jsp <% String param = request.getParameter (“sError”); if (param.length() !=0) { out.println (“”+ param + “”); } %> Username: Password: security.jsp <% String user = (String) request.getParametrer(“username”); if (user.equals (“admin”)) { %> <% } else { %> thongbao.jsp Ban dang nhap voi usernam: Password: III.5. Thẻ jsp:plugin Phương cách đơn giản nhất để sử dụng jsp:plugin là cung cấp cho nĩ bốn thuộc tính: type, code, width, height. Chúng ta định giá trị “applet” cho thuộc tính type và ba thuộc tính cịn lại sử dụng giống như APPLET tag bình thường. Với ngoại lệ là các action thì cĩ cú pháp XML nên các thuộc tính trong nĩ cũng phải theo qui ước XML. Ví dụ với APPLET tag trong HTML <APPLET CODE=“MyApplet.class” WIDTH=457 HEIGHT=350> sử dụng jsp:plugin action như sau: <jsp:plugin type=“applet” code=“MyApplet.class” width=“457” height=“350” /> Ngồi bốn thuộc tính này jsp:plugin cịn cĩ các thuộc tính sau và hầu hết giống (nhưng khơng phải là tất cả) như các thuộc tính của APPLET tag. codebase, align, archive, hspace, name, vspace, title Giống như APPLET tag. jreversion Xác định số phiên bản của Java Runtime Environment, các giá trị cĩ thể nhận là “1.1”, “1.2”. nspluginurl URL cho Netscape mà cĩ thể download Plug-In. Giá trị mật định sẽ hướng người dùng đến web site của Sun, nhưng với intranet chúng ta cĩ thể muốn chỉ dẫn người dùng đến một bản sao cục bộ. iepluginurl URL cho Internet Explorer mà cĩ thể download Plug-In. III.6. Thẻ jsp:fallback jsp:fallback cung cấp văn bản thay thế đối với các trình duyệt khơng hổ trợ OBJECT hay EMDEB. Chúng ta sử dụng action này giống như là dùng văn bản thay thế được đặt trong APPLET tag <APPLET CODE=“MyApplet.class” WIDTH=457 HEIGHT=350> Error: this example requires Java. với <jsp:plugin type=“applet” code=“MyApplet.class” width=“457” height=“350” > Error: this example requires Java. III.7. Chuyển trang page directive cho phép chúng ta điều khiển cấu trúc của servlet bằng cách đưa vào các lớp, đặt MIME type, …. Một page directive cĩ thể được đặt bất cứ nơi nào trong trang JSP. page directive định nghĩa một số thuộc tính phụ thuộc vào trang và giao tiếp giữa các thuộc tính này với JSP container. language Định nghĩa ngơn ngữ kịch bản được sử dụng trong scriptlets, biểu thức và khai báo. Trong JSP 1.2 là phiên bản mới nhất chỉ cĩ hổ trợ “java” cho thuộc tính này do đĩ “java” này cũng là giá trị mật định. extends Thuộc tính này chỉ định lớp cha (superclass) của servlet sẽ được phát sinh cho trang JSP, cĩ dạng sau: Chú ý rằng khi sử dụng thuộc tính này phải hết sức cẩn thận vì tại server cĩ thể đã dùng lớp cha mật định. import Thuộc tính này mơ tả các kiểu sẵn dùng trong mơi trường kịch bản (theo java). Chúng ta cĩ thể import vào từng lớp hoặc cả một gĩi (package). Nếu import vào nhiều lớp hay packages thì cách nhau dấu “,”. session Thuộc tính session kiểm sốt liệu cĩ hay khơng một trang tham gia vào HTTP session. Cĩ hai giá trị “true” và “false”. Mật định là “true”, chỉ ra rằng biến ngầm định session nên được nối kết với session hiện hành. Giá trị “false” cĩ nghĩa rằng chẳng cĩ session nào được sử dụng tự động và nếu cố truy cập vào biến session sẽ trả lỗi vào lúc trang được dịch thành servlet. buffer Thuộc tính này xác định kích thước của vùng đệm được sử dụng bởi biến out. Cĩ dạng sau: Thuộc tính này cĩ giá trị mật định là “8kb”, giá trị “none” chẳng cĩ vùng đệm nào được cấp và tất cả dữ liệu xuất sẽ được ghi trực tiếp qua ServletResponse, PrintWriter. autoFlush Xác định liệu luồng xuất cĩ vùng đệm được tự động flush (giá trị “true” mật định) khi vùng đệm đầy hay sẽ tung ra một ngoại lệ khi vùng đệm tràn (“false”). Chú ý rằng sẽ khơng hợp lý nếu đặt autoFlush=“false” khi buffer=“none”. isThreadSafe Xác định mức độ an tồn của tiểu trình (thread) được cài đặt trong trang (với giao tiếp SingleThreadModel), “true” là giá trị mật định. info Định nghĩa một chuỗi cĩ thể truy xuất từ servlet bằng phương thức getServletInfo(). errorPage Thuộc tính này xác định một trang JSP nên bất kỳ các ngoại lệ nào được tung ra nhưng khơng bắt ngoại lệ này trong trang hiện hành. Ngoại lệ tung ra sẽ cĩ sẵn trong biến ngầm định exception. isErrorPage Xác định trang JSP hiện thời cĩ thể hoạt động như một trang lỗi cho một trang JSP khác. Giá trị “false” là mật định cho thuộc tính này. contentType Thuộc tính này gán Content-Type cho response header, mơ tả kiểu MIME của tài liệu được gởi đến client. Thuộc tính contentType cĩ một trong hai dạng sau: Một số kiểu MIME-Type thường dùng: “text/html”, “text/xml”, “text/plain”, “image/gif”, “image/jpeg”. pageEncoding Định nghĩa bộ mã hĩa ký tự cho trang JSP (character encoding), thuộc tính này hổ trợ cho bộ mã Unicode và Latin-1, cĩ giá trị mật định là “ISO-8859-1” III.8. Chuyển hướng sang trang mới với sendRedirect() Ngồi việc chuyển tiếp chúng ta cĩ thể sử dụng phương thức sendRedirect() để chuyển hướng và triệu gọi trang JSP khác xử lý. Sự khác nhau giữa chuyển tiếp (forward) và chuyển hướng (redirect) đĩ là lệnh sendRedirect () chỉ thực hiện triệu gọi trang mà khơng chuyển tham số của trang hiện hành cho trang chuyển hướng. Ví dụ: từ trang security.jsp ta cĩ thể chuyển hướng đến trang thongbao.jsp bằng lệnh như sau: <% … response.sendRedirect (“thongbao.jsp”); %> IV. SERVLET IV.1. Khái niệm Servlet là các thành phần đối tượng nhúng trên trình chủ Web server thực hiện xử lý yêu cầu và sinh ra các trang Web động trả về máy khách. Để sử dụng được Servlet chúng ta cần cĩ các trình chủ hiểu Java và hỗ trở triệu gọi Servlet như Apache, Jrun, Web Logic …. Ví dụ sau là một Servlet cơ bản import javax.servlet.*; import java.io.*; public class helloWorldServlet extends GnericServlet { public void service (ServletRequest request, ServletResponse response) throws IOException { response.setContextType (“text/html”); PrintWriter out = response.getWriter (); out.println (“”); out.println (“”); out.println (“ Hello World Servlet! ”); out.println (“”); out.println (“”); } } IV.2. Các phương thức xử lý cơ bản của Servlet Lớp GenericServlet là phần cài đặt tổng quát cho đặc tả giao tiếp (interface) mang tên Servlet. Theo đặc tả của giao tiếp Servlet do Sun đưa ra một servlet cơ bản cần cĩ những phương thức phục vụ cho các nhu cầu khởi tạo (init), hoạt động và phục vụ (service), hủy (destroy), trả về thơng tin cấu hình (getServletConfig), trả về thơng tin tư thân của servlet (getServletInfo). Cụ thể lớp giao tiếp Servlet được mơ tả như sau: interface Servlet { void destroy () ServletConfig getServletConfig (); String getServletInfo (); void init (ServletConfig config); void service (ServletRequest req, ServletResponse res); } IV.2.1. Phương thức khởi tạo init () public void init () Phương thức khởi tạo này được gọi khi lần đầu tiên trình chủ Web server nạp mã thực thi của servlet từ tập tin .class vào bộ nhớ và bắt đầu cho phép servlet hoạt động. Chúng ta cĩ thể dựa vào phương thức này để khởi tạo các biến mơi trường và giá trị ban đầu cần thiết cho quá trình thực thi servlet sẽ diễn ra tiếp theo. Thường trong phương thức init () ta khởi tạo giá trị mảng, tạo sẵn kết nối với cơ sở dữ liệu, nạp các lớp thư viện cần thiết…. Ví dụ chúng ta cĩ thể nạp trình điều khiển JDBC truy xuất cơ sở dữ liệu, tạo sẵn kết nối đến nguồn dữ liệu cho servlet trong phương thức init () như sau: public class staffView extends GenericServlet { String DBDriver = “sun.jdbc.odbc.JdbcOdbcDriver”; String strConn = “jdbc:odbc:quanliNV”; Connection con; public init () { Class.forName (DBDriver). newInstance (); Conn = DriverManager.getConnection (strConn); } } IV.2.2. Phương thức phục vụ service () public void service (ServletRequest req, ServletResponse res) throws IOException Sau khi phương thức init () đã hồn tất, trình chủ Web server sẽ triệu gọi đến phương thức phục vụ service (). Phương thức này được xem là trung tâm xử lý của servlet mà chúng ta cần phải cài đặt. Khi trình chủ nạp servlet vào bộ nhớ, phương thức init () chỉ được gọi duy nhất một lần trong phương thức service () cĩ thể được triệu gọi nhiều lần ứng với mỗi yêu cầu servlet phát sinh từ trình duyệt phía máy khách. Bên trong phương thức service () chúng ta cĩ thể sử dụng đối tượng tham số ServletRequest và ServletResponse để tiếp nhận dữ liệu từ trình khách chuyển lên và kết xuất kết quả phản hồi trở lại trình khách. Ví dụ: public void service (ServletRequest request, ServletResponse response) throws IOException { response.setContextType (“text/html”); PrintWriter out = response.getWriter (); out.println (“”); out.println (“”); … } IV.2.3. Phương thức hủy destroy () Khi servlet khơng cịn dùng nữa hoặc hết thời gian qui định lưu giữ trong bơ nhớ của trình chủ Web server, nĩ sẽ bị trình chủ giải phĩng. Trước khi servlet bị hủy phươg thức destroy () sẽ được gọi. Nếu như chúng ta dùng phương thức init () để thực hiện khởi tạo biến cho servlet thì phương thức destroy () ngược lại cĩ thể dùng để dọn dẹp tài nguyên mà các biến chiếm giữ, đĩng các kết nối mà phương thức init () đã mở… Ví dụ: public destroy () { conn.close (); } IV.2.4. Phương thức getServletConfig () và getServletInfo () Hai phương thức này nhằm mục đích cung cấp thơng tin. Phương thức getServletConfig () giúp người sử dụng servlet cĩ được đối tượng ServletConfig chưa các thơng tin khởi tạo từ mơi trường ngồi đưa vào servlet, getServletInfo () trả về một chuỗi thơng tin mơ tả ý nghĩa và mục đích của servlet. public String getServletInfo (); public ServletConfig getServletConfig (); IV.3. Chu trình sống của Servlet và JSP Chu trình sống của servlet Chu trình sống tính từ khi servlet bắt đầu được hệ thống gọi nạp vào bộ nhớ cho đến khi nĩ bị loại khỏi trình chủ Web server vì khơng cịn cần đến nữa. Quá trình sống của servlet trải qua các giai đoạn sau: Nạp servlet Khởi tạo servlet Thực thi servlet Dọn dẹp servlet Nạp servlet Tùy theo điều kiện, một servlet cĩ thể nạp vào bộ nhớ ở 3 thời điểm khác nhau: khi server khởi động, khi ngừoi quả trị yêu cầu hoặc khi trình duyệt triệu gọi servlet từ máy khách. Hầu hết các Web server điều cho phép bạn chọn danh sách servlet sẽ được ưu tiên nạp lúc Web server khởi động. Tuy tốn ít thời gian hơn nhưng sau đĩ servlet đã trong trạng thái sẵn sàng cĩ thể phục vụ trình khách bất kỳ lúc nào. Khởi tạo servlet Trình chủ Web server khởi tạo servlet bằng cách gọi đến phương thức init () mà servlet cài đặt. Phương thức này chỉ gọi một lần duy nhất. Chúng ta cĩ thể lợi dụng cơ hội này để khởi tạo các biến tồn cục mà servlet sẽ sử dụng sau này. Thực thi servlet Khi trình duyệt hoặc các trang JSP triệu gọi servlet thơng qua địa chỉ URL, trình chủ Web server sẽ chính thức gọi servlet thực thi thơng qua các phương thức như doGet (), doPost () hoặc service (). Ví dụ khi chúng ta gọi trực tiếp servlet từ địa chỉ URL, phương thức doGet () của servlet sẽ được gọi. Nếu chúng ta gọi servlet thơng qua thao tác post cua thẻ thì phương thức doPost () sẽ được gọi. Sau khi các phương thức này được gọi thực thi xong, servlet vẫn giữ lại trong bộ nhớ để phục vụ cho các lần triệu gọi tiếp theo. Đây cũng chính là ưu điểm làm cho servlet thực thi nhanh các ứng dụng CGI. Dọn dẹp servlet Servlet khơng giữ lại trong bộ nhớ vĩnh viễn, sẽ đến lúc cần loại servlet khỏi bộ nhớ. Ví dụ như khi nhà quản trị muốn dừng hệ thống, muốn Webserver khởi động lại để giải phĩng rác trong bộ nhớ tăng hiệu suất thực hiện…. Trước khi chấm dứt, Web server sẽ gọi đến phương thức hủy destroy () của servlet. Đây là cơ hội để servlet thực hiện một số thao tác dọn dẹp cần thiết như lưu dữ liệu xuống đĩa, ghi nhớ trạng thái của servlet để phục vụ cho lần khởi động sau, đĩng kết nối với cơ sở dữ liệu…. Và mặc dù Java cĩ thể tự động thu gom rác trong bộ nhớ nhưng nếu chúng ta đã cấp phát một khối lượng bộ nhớ lớn cho servlet trong quá trình làm việc, chúng ta nên thực hiện giải phĩng chúng trong phương thức destroy (). Chu trình sống của JSP Tương tự như chu trình sống của servlet, trang JSP cũng cĩ cbhu trình sống xác định tính từ khi hệ thống đọc biên dịch trang JSP, gọi thực thi và loại trang khỏi bộ nhớ. Chu trình sống của JSP trải qua các giai đoạn sau: Biên dịch trang JSP Nạp trang Khởi tạo Thực thi Dọn dẹp Biên dịch trang JSP Khi trình duyệt yêu cầu trang JSP, ví dụ triệu gọi trang JSP bằng URL Web server sẽ kiểm tra trang JSP đã được biên dịch hay chưa. Nếu chưa biên dịch hoặc đã biên dịch nhưng trang JSP mới vừa thay đổi trong mã nguồn thì Web server sẽ thực hiệ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 hồ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 hồn tồ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 tố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 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. Ngồ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 hố 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. 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 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ề. 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. Đị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 tồ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 tồ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" ""> ... ... 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) 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 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 tồ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 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 Ngồ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_BEGIN 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 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 hồn tồ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: Trong cách viết thứ hai, hồn tồ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: 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: 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 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 số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 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 Ngồ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Ế 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ý Cho phép đăng ký tuyển dụng 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 I.4. Mơ hình xử lý quan niệm I.4.1. Sơ đồ ngữ cảnh Đổ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 I.4.2. Sơ đồ phân rã chức năng 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 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 Phân rã xử lý Đổi thơng tin user Bảng cập nhật user Admin Permission Dữ liệu user 1. Thêm user 2. Xĩa user 3. Edit user I.5. Mơ hình dữ liệu quan niệm Sơ đồ thực thể kết hợp XA -MAXA -TenXa NHÂN VIÊN -Mã NV -Họ NV -Tên NV -Giới tính -Ngày sinh -Ngày vào Cty NGHỈ -Mã lí do -Mã NV -Ngày BĐ -Ngày KT LÍ DO -Mã lí do -Tên lí do NV-ĐT -Số ĐT -Mã NV ĐT -Số ĐT 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 -Mã CM -Tên CM NV-CM -Mã NV -Mã Tr -Mã CM -Ngày BĐĐT -Ngày KTDT LƯƠNG -Mã lương -Lương CB NV-L -Mã NV -Mã lương -Ngày LL -Bậc lương 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 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 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, … MANV MANV II.1.2. Các đơn vị thiết kế Cập nhật Nhân viên Thêm nhân viên: 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? Khơng End Cĩ Begin Nhập username, password, permission Mở bảng permission username đã tồn tài? Không Lưu các thông tin đã nhập vào CSDL Thông báo username đã tồn tại Có Thông báo đã thêm username Tiếp tục? Không End Có 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) NgayVaoCty 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 CHUYENMON 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) MADUONG 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 DIENTHOAI SoDT Nvarchar 10 PK DUONG MADUONG Nvarchar 3 PK, len () = 3 TenDuong Nvarchar 20 HUYEN MAHUYEN Nvarchar 4 PK, len () = 4 MATINH Nvarchar 2 FK, lookup (TINH) TenHuyen Nvarchar 20 LUONG MALUONG 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 NGOAINGU 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_LUONG MANV Nvarchar 4 FK, lookup (NHANVIEN) MALUONG Int FK, lookup (LUONG) HeSoLuong Real NgayLL Smalldate NV_NN MANN Int FK, lookup (NGOAINGU) MANV Nvarchar 4 FK, lookup (NHANVIEN) CapDo Nvarchar 10 PERMISSION 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 MATRUONG Nvarchar 3 PK, len () = 3 TenTruong Nvarchar 50 TUYENDUNG 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 MAHUYEN Nvarchar 4 FK, lookup (HUYEN) II.3. Các ràng buộc tồ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 Thiết kế giao diện Website QLNV Error Default.jsp Trang chủ Registration.jsp Đăng ký tuyển dụng ResultReg.jsp Thơng báo đã đăng ký xong Login.jsp Đăng nhập AdminMenu.jsp Admin? Cĩ Manager? Khơng Cĩ Admin.jsp Khơng hợp lệ Các thành phần của Admin AddNewUser.jsp Hợp lệ CSDL Trang báo lỗi AdminViewUser.jsp Xĩa user Thơng báo đã xĩa user Edit user Add user Thay đổi thơng tin user Hợp lệ Khơng hợp lệ … 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 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 … 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 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 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. Hướng phát triển Các hướng phát triển sau sẽ làm cho ứng dụng hồ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:

  • docTÌM HIỂU CÔNG NGHỆ JSP VÀ ỨNG DỤNG XÂY DỰNG WEBSITE QUẢN LÍ NHÂN VIÊN CÔNG TY XOAI.doc