JSP: Vòng đời của trang JSP

Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực

Mỗi trang JSP sẽ phục vụ các yêu cầu như là một servlet. Do đó, vòng đời và các khả năng của các trang JSP (đặc biệt là tính động) được xác định bởi công nghệ Java Servlet.

Khi một yêu cầu được ánh xạ tới một trang JSP, bộ chứa web đầu tiên sẽ kiểm tra xem servlet của trang JSP có cũ hơn trang JSP hay không. Nếu servlet cũ hơn, kho chứa web sẽ dịch trang JSP thành lớp servlet và biên dịch lớp đó. Trong quá trình phát triển, một trong những lợi ích của các trang JSP trên các servlet là quá trình xây dựng được thực hiện tự động.

Dịch và biên dịch

Trong giai đoạn dịch, mỗi loại dữ liệu trong một trang JSP sẽ được đối xử riêng biệt, trong đó dữ liệu tĩnh được chuyển thành mã sẽ phát ra dữ liệu vào luồng phản hồi. Các thành phần JSP được xử lý như sau:

  • Chỉ thị được sử dụng để kiểm soát cách mà vùng chứa web chuyển đổi và thực hiện trang JSP.

  • Các thành phần kịch bản được chèn vào lớp servlet của trang JSP.

  • Các biểu thức của ngôn ngữ biểu thức được truyền như các tham số cho các lời gọi tới bộ đánh giá biểu thức JSP.

  • Các thành phần jsp:[set|get] Property được chuyển thành các lời gọi phương thức đến các thành phần JavaBeans.

  • Các phần tử jsp: [include|forward] được chuyển thành lời gọi của API Servlet Java.

  • Phần tử jsp:plugin được chuyển đổi thành các đánh dấu cụ thể cho trình duyệt để kích hoạt một applet.

  • Các thẻ tùy chỉnh được chuyển đổi thành các cuộc gọi đến trình xử lý thẻ thực hiện thẻ tùy chỉnh.

Trong Máy chủ ứng dụng, nguồn cho servlet được tạo từ một trang JSP có tên pageName nằm trong tệp sau:

domain-dir/generated/jsp/j2ee-modules/WAR-NAME/pageName_jsp.java

Ví dụ: nguồn cho trang index (có tên index.jsp) cho ví dụ về bản địa hoá date ở bài viết trước sẽ được đặt tên:

domain-dir/generated/jsp/j2ee-modules/date/index_jsp.java

Cả giai đoạn dịch và biên dịch đều có thể bị lỗi chỉ thấy được khi trang được yêu cầu lần đầu tiên. Nếu một lỗi xảy ra trong bất kỳ giai đoạn nào, máy chủ sẽ trả lại ngoại lệ JasperException và một thông báo bao gồm tên của trang JSP và dòng xảy ra lỗi.

Sau khi trang được dịch và biên dịch, servlet của trang JSP (phần lớn nhất) sẽ theo chu kỳ cuộc gọi của servlet được mô tả trong bài viết Chu kỳ sống của Servlet:

  1. Nếu một thể hiện của servlet của trang JSP không tồn tại thì bộ chứa sẽ:

    1. Tải trang servlet của trang JSP

    2. Khởi tạo một thể hiện của lớp servlet

    3. Khởi tạo cá thể servlet bằng cách gọi phương thức jspInit

  2. Bộ chứa sẽ gọi phương thức _jspService để chuyển các đối tượng yêu cầu và phản hồi.

Nếu bộ chứa cần gỡ bỏ servlet của trang JSP, nó sẽ gọi phương thức jspDestroy.

Thực thi

Bạn có thể kiểm soát các tham số thực thi trang JSP khác bằng cách sử dụng chỉ thị page. Chỉ thị liên quan đến bộ nhớ đệm đầu ra và các lỗi sẽ xử lý được nói đến dưới đây.

Bộ nhớ đệm

Khi một trang JSP được thực thi thì đầu ra được ghi vào đối tượng phản hồi được tự động đệm. Bạn có thể thiết lập kích thước của bộ đệm sử dụng chỉ thị page như sau:

<%@ page buffer="none|xxxkb" %>

Một bộ đệm lớn hơn cho phép ghi lại nhiều nội dung hơn trước khi thực sự gửi lại cho khách hàng, do đó sẽ cung cấp cho trang JSP thêm thời gian để thiết lập các mã trạng thái thích hợp và tiêu đề hoặc để chuyển tiếp tới một nguồn tài nguyên web khác. Một bộ đệm nhỏ hơn sẽ giúp giảm tải bộ nhớ máy chủ và cho phép máy khách bắt đầu nhận dữ liệu nhanh hơn.

Xử lý lỗi trang JSP

Số lượng thực thi (execution) có thể phát sinh khi một trang JSP đã được thực thi. Để chỉ định rằng bộ chứa web nên chuyển tiếp kiểm soát đến trang lỗi nếu xảy ra ngoại lệ thì ta đặt chỉ thị page ở đầu trang JSP:

<%@ page errorPage="file-name" %>

Trang ứng dụng Duke’s Bookstore chứa chỉ thị tut-install/javaeetutorial5/examples/web/bookstore2/web/template/preludeErrorPage.jspf:

<%@ page errorPage="errorpage.jsp"%>

Chỉ thị page sau đây trong trang tut-install/javaeetutorial5/examples/web/bookstore2/web/error/errorpage.jsp chỉ ra rằng nó đang hoạt động như một trang báo lỗi:

<%@ page isErrorPage="true" %>

Chỉ thị này sẽ tạo một đối tượng kiểu javax.servlet.jsp.ErrorData cho phép để bạn có thể truy xuất, giải thích và có thể hiển thị thông tin về nguyên nhân của ngoại lệ trong trang lỗi. Bạn truy cập đối tượng dữ liệu lỗi trong biểu thức EL-Expression Language (xem bài viết Biểu thức Ngôn ngữ Biểu hiện Hợp nhất ) theo cách của ngữ cảnh trang. Do đó, ${pageContext.errorData.statusCode} sẽ lấy ra mã trạng thái, và ${pageContext.errorData.throwable} sẽ lấy ra ngoại lệ. Bạn có thể lấy nguyên nhân của ngoại lệ bằng cách sử dụng biểu thức này:

${pageContext.errorData.throwable.cause}

Ví dụ: trang báo lỗi của Duke’s Bookstore như sau:

<%@ page isErrorPage="true" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core"
     prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt"
     prefix="fmt" %>
<html>
<head>
<title><fmt:message key="ServerError"/></title>
</head>
<body bgcolor="white">
<h3>
<fmt:message key="ServerError"/>
</h3>
<p>
: ${pageContext.errorData.throwable.cause}
</body>
</html>

Lưu ý - Bạn cũng có thể định nghĩa các trang lỗi cho WAR có chứa một trang JSP. Nếu các trang lỗi được định nghĩa cho cả WAR và một trang JSP thì trang lỗi của trang JSP sẽ được ưu tiên.


» Tiếp: Tạo nội dung tĩnh và động
« Trước: Các trang JSP mẫu
Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực
Copied !!!