Ngôn ngữ cài đặt

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 fo

doc68 trang | Chia sẻ: huyen82 | Lượt xem: 1594 | Lượt tải: 0download
Tóm tắt tài liệu Ngôn ngữ cài đặt, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
r 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 hoá 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 ngoà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 toà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 toà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 toàn trang. Khai báo sẽ được chèn vào trong lớp của servlet (bên ngoà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 ngoà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” /> Ngoà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 soá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 toà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() Ngoà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 () đã hoà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 ngoà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 toà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 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 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. 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._.

Các file đính kèm theo tài liệu này:

  • docLV0920.doc