Java Server Pages (JSP)

Java Server Pages (JSP) cho phép tách riêng phần động của những trang Web ra khỏi HTML tĩnh. JSP không chỉ hỗ trợ để tạo ra những trang Web độc lập với các nền, độc lập với các Server, mà còn là công nghệ Java rất hiệu quả để thể hiện nguyên lý WYSIWYG (Những gì bạn nhìn thấy là bạn có được chúng) trên các trang HTML tĩnh ([2], [4]).

Các trang JSP gồm có:

  • Các thành phần tĩnh HTML/XML
  • Các thể đặc biệt cùa JSP
  • Có thể có một số các đoạn mã chương ừinh viết bằng Java, được gọi là những kịch bản nhỏ Scriptlet.

Do vậy, ta có thể tạo lập và duy tri các trang JSP bằng các công cụ truyền thống như đối với HTML/XML

Một điều quan trọng cần lưu ý: đặc tả JSP là một chuẩn mờ rộng, được định nghĩa trên đỉnh cùa Servlet API. Cả Servlet và JSP cùng có một số đặc tính chung, có thể sử dung chúng phục vụ cho các nội dung Web động. Tuy nhiên, cũng có một số khác biệt gừa JSP và công nghệ Servlet như đã trình bày ờ trên. JSP dược sử dụng rộng rãi hơn. Nó không chỉ được sử dụng đối với các nhà phát triển hệ thống, mà câ những ngưòi thiết kế các hang Web, những người đóng vai trò rất quan trọng trong quh trình phát triển các trang Web ứng dụng hiện nay.

1. Kiến trúc của JSP

Mục đích cùa JSP là cung cấp các phương thức để khai báo, biểu diễn cho sự phát triển của các Servlet.

Một cách điển hình, các trang JSP là chủ điểm chính của pha dịch và xử lý các yêu cầu trên Server. Pha dịch chỉ thực hiện môi lần, trừ khi trang JSP bị thay đổi thì nó mới phải dịch lại. Giả sử về mặt cú pháp, trang JSP không có lỗi thì kết quả của pha dịch sẽ là tệp lớp cài đặt trang JSP và giao diện. Servlet như hình dưới :

Pha dịch được thực hiện bởi JSP Engine khi nó nhận được các yêu cầu lần đầu cùa một trang JSP. Lưu ý rằng, JSP 1.1 cho phép dịch trước (tiền dịch) các trang JSP thành các tệp lớp. Việc dịch trước này đặc biệt hữu dụng trong việc loại bỏ những khởi đầu chậm trễ khi một trang JSP được phân phát từ các nguồn để nhận được các yêu cầu của Client. Nguồn gốc của tệp lớp được tạo ra bởi Tomcat.

Như trên đã nêu, một chương trình JSP có thể chứa các đoạn chương trình Java và chúng kết hợp với nhau để tạo ra các JSP Servlet nhằm xử lý các yêu cầu của Client gửi đến thông qua HTTPRequest. JSP Servlet xử lý các yêu cẩu của Client (qua HTTP) và gửi kết quả cho HTTPResponse.

2. Các mô hình truy cập của JSP

Có hai mô hình truy cập phổ biến để thực hiện truy cập thông tin theo công nghệ JSP

  1.   Mô hình 1. các yêu cầu đầu vào từ Web Browser được gửi trực tiếp tới trang JSP, ở đó chúng được xừ lý và trả lời cho Client. Trong mô hình này, mọi vẩn đề truy cập đều được đảm nhận bời các Java Bean.

  1. Mô hình 2: còn được biết đến với tên gọi MVC (Model/View/Controller). Việc xừ lý thông tin được tách thành hai phần, thành phần biểu diễn và thành phần điều khiển. Thành phần biểu diễn là những trang JSP làm nhiệm vụ tạo ra câu trả lời dạng HTML/XML và xác định giao diện của người sừ dụng mà Web Browser cung cấp. Thành phần điều khiển (còn được gọi là thành phần phía trước), không đàm nhận công việc biêu diễn mà là xừ lý tất cả các yêu cầu cùa HTTP. Các thành phần điều khiển cũng đảm nhận việc tạo ra các Java Bean hoặc các đối tượng phục vụ cho các thành phần biểu diễn sừ dụng, đồng thời quyết định các thành phần phụ thuộc vào hành động của người sử dụng.

3. Các phạm vi đối tượng

Trước khi tìm hiểu về cú pháp và ngữ nghĩa cùa JSP, điều quan trọng là phải hiểu rõ phạm vi hay khả năng quan sát được của các đối tượng Java xử lý các yêu cầu trong các trang JSP. Các đối tượng có thể được tạo ra một cách tường minh bằng cách sừ dụng các thẻ chỉ dẫn JSP, hoặc một cách gián tiếp thông quan các thè hành động. Những đối tượng được sinh ra sẽ được gắn tưong ứng với những phạm vi hoạt động nhất định. Có bốn phạm vi hoạt động: Application, Session, Request và Page. Hình 6.10 mô tả phạm vi cùa các đổi tượng tưcmg ứng được tạo ra.

Đế cho thuận tiện, bộ chửa JSP tạo ra một số đối tượng tiềm năng để sừ dụng trong các kịch bản và các biểu thức mà không cần phải khởi tạo ra chúng. Có chín đối tượng không tường minh được tạo lập sẵn:

  • request: đại diện cho HTTPRequest, thuộc phạm vi
  • response: đại diện cho HTTPResponse, thuộc phạm vi Page.
  • pageContext: đại diện cho PageContext, thuộc phạm vi
  • application: đại diện cho ServletContext, thuộc phạm vi Application.
  • out: đại diện cho JspWriter, thuộc phạm vi
  • coníig: đại diện cho ServletConĩig của JSP, thuộc phạm vi
  • page: đại diện cho HttpPage, thuộc phạm vi
  • session: đại diện cho HttpSession, thuộc phạm vi Sessioa
  • exception: đại diện cho Throwable, thuộc phạm vi

Lưu ý: những đối tượng trên chỉ nhìn thấy được bên trong hệ thống được sinh ra bởi _j spService (). Chúng sẽ không hoạt động (quan sát được) ở bên trong các phương thức mà ta tự khai báo.

Một vấn đề quan trọng nữa cần quan tâm là việc quản lý các phiên làm việc trong JSP. Theo mặc định, tất cả các trang JSP đều tham gia vào một phiên session của HTTP. Các phiên session là những nơi thích hợp để tổ chức lưu trữ các Bean và những đối tượng càn thiết sử dụng chung cho các trang JSP với các Servlet mà người sừ dựng cần truy cập. Mỗi session được xác định thông qua định danh ID và được lưu ờ trình duyệt cùng với mẩu tin cookie.

Số lượng các đối tượng trong một phiên session là không giới hạn. Song khi số lượng chúng nhiều quá thì hiệu suất thực hiện sẽ kém đi. Theo mặc định, phần lớn các Server cho phép mỗi đối tượng tham gia vào một phiên session với thời gian tham gia là 30 phút. Nếu muốn thay đổi, bạn có thể đặt lại thời gian hoạt động của đối tượng trong một phiên session thông qua hàm seti’fexInvalidationInterval (int sees). Cơ chế quản lý các phiên session được mô tả như hình 6.11.

Mô tơ JSP giữ tham chiếu tới đối tượng được đặt vào trong session cho đến khi hết thời gian có hiệu lực, sau đó những đối tượng đó bị huỷ bò để dọn dẹp bộ nhớ.

4. Cơ sở cú pháp của JSP

Ngoài các qui ước của HTML, JSP có ba cấu trúc chỉnh:

  • Các phần từ kịch bản (Scripting Elements) cho phép xác định những đoạn mã chương trinh Java sẽ trờ thành bộ phận cúa Servlet,
  • Các chỉ dẫn (Directives) cho phép điều khiển tất cả các cẩu trúc cùa Servlet,
  • Các hành động (Actions) cho phép chỉ ra những thành phần được sử dụng để xừ lý và nhũng thành phẩn còn lại để điều khiển trong mô tơ cùa

Lưu ý: Bạn có thể tìm hiểu chi tiết về JSP Tutorial ở địa chỉ: http://www.apl.ihu.edu/~hall/iava/Servlet-Tutorial/.

  1. Các phần tử kịch bản

Các phần tử kịch bản được sử dụng để chèn các đoạn mâ chương trinh Java vào trong một Servlet được sinh ra từ trang JSP hiện thời. Có ba thẻ chính:

  • Các thè biếu thức dạng <%= exp %>, được sử dụng để tính giá trị cùa biểu thức exp và chèn kết quà (sau khi đă được chuyển về dạng xâu, theo các chì dẫn) vào trang kết quả. exp là một biểu thức trong Java được tính giá tri lúc thực hiện chưong trình (khi trang tin được yêu cầu). Ví dụ, biểu thức JSP sau sẽ xác đinh ngày/giờ hiện thời cùa hệ thổng khi trang tin yêu cầu:

Thời gian: <%= new java. util. Dated %>

  • Các thẻ kịch bản dạng <% Java code %>, được sử dụng để chèn các phương thức dịch vụ Java code vào trang Ví dụ:

<% String queryData = request.getQueryString0; out.println(“GET Data: ” + queryData);%>

Lưu ý: Các đoạn chương trình bên trong các thẻ kịch bản, được viết trước hoặc sau thành phần tĩnh cùa HTML tạo ra các kịch bản hành động. Ví dụ

<% if(Math.random() <0.5) { %>

Là ngày <B> đẹp trời </B>!

<% } else { %>

Là ngày <B> nhiều mây </B>!

<% } %>

<% for(int i = 0; i <5; i++) {%>

<H<%= i%»Xin chào </H<%=i%»

<%} %>

  • Các thẻ khai báo dạng <%! Java code %>, được sử dụng để chèn vào nội dung cúa các lớp Servlet, chèn vào bên ngoài cùa phương thức Các thẻ khai báo không sinh ra những kết quả, chúng được sừ dụng kết hợp các thẻ biểu thức hoặc các kịch bản của JSP. Ví dụ, đoạn chương trình sau in ra số lần trang Web được truy cập sau khi nó được khởi tạo.

<%! private int accessCount = 0; %>

Số lần truy cập:

<%= ++accessCount %>

Lưu ý: Cũng giống như các kịch bản, nếu ta sử dụng những ký tự như thì phải viết thành “%\>”.

  1. Các chỉ dẫn JSP

Một chỉ dẫn trong JSP được sử dụng để gắn cấu trúc của lớp Servlet. Các thẻ chì dẫn JS p là những thông điệp dành cho mô tơ JS p. Thè chỉ dẫn được đặt ở đầu của tất cả các ưang JSP. Có hai thẻ chì dẫn chính: thẻ page, include.

(i) Chỉ dẫn JSP page. Thẻ chỉ dẫn page cho phép bạn định nghĩa một trong các thuộc tính sau:

  • <%0 page import = “package-Class” %>

Ví dụ: <%0 page import = “java.util.*” %>

  • <%0 page contenType = “MINE-Type” %>hoặc
  • <%@ page contenType = ”M1NE-Type; charset=Character-Set” %>

Trong đó, MINE là kiểu của kết quả. Ví dụ:

<%@ page oontenType = “text/plain” %>

  • <%@ page isThreadSafe = “true I false” %>

Một giá trị true (mặc định) chì ra rằng việc xử lý của Servlet là bình thường, trong đó có thể có nhiều yêu cầu được xử lý đồng thời bởi cùng một Servlet. Giá trị false chi ra rằng, Servlet cài đật SingleThreadModel để thực hiện các yêu cầu một cách tuần tự hay được thực hiện bời nhiều Servlet cùng một lúc.

  • <%@ page session = “true I false” %>

Một giá trị true (mặc định) chì ra rằng biến được định nghĩa trước session (thuộc kiểu HttpSession) sẽ được tlm thấy trong session nếu nó tồn tại. Giá trị false chỉ ra rằng, nhũng session như thế không được sử dụng, mọi cố gắng truy cập vào session đều thất bại.

  • <%@ page buffer = “sizekb I none” %>

Thuộc tính này xác định cỡ cùa vùng đệm buffer được sử dụng bởi đối tượng out của JspWri ter, cõ nhỏ nhất phải là 8 KB.

  • <%@ page autoflush = “true I false” %>

Một giá trị true (mặc định) chì ra rằng, buffer sẽ được làm sạch khi nó bị đầy. Giá trị false , ít khi sừ dụng, chi ra những ngoại lệ, khi buffer bị đầy.

  • <%@ page extends = “package.class” %>

Thuộc tính này chì ra lóp cha cùa Servlet được tạo ra. ,

  • <%0 page language = “java” %>

Thuộc tính này chi ra ngôn ngữ được sử dụng.

JSP còn cung cấp một cơ chế đề xừ lý ngoại lệ (lỗi) khi thực thi chương trình bằng cách sử dựng thẻ page với thuộc tinh errorPage:

<%@ page isErrorPage = “false” errorPage = “errorHandler.jsp” %>

thông báo cho mô tơ JSP biết rằng những ngoại lệ được mô tả trong errorHandler.jsp.

(li) Chỉ dẫn JSP include. Thẻ chi dẫn include cho phép bạn đua các tệp chương trình, hay tệp tín vào trong trang JSP lúc nó được dịch thành Servlet.

<%@ include file=”‘relative url” %>

Trong đó, “url” là địa chỉ chứa những tệp cần phải được đưa vào trang JSP.

  1. Thẻ chú thích

Thẻ chú thích của HTML có thể sử dụng trong các trang JSP. Tuy nhiên, người sử dụng vẫn có thể nhìn thấy những chú thích đó trong những trang gốc. Nếu bạn muốn những chú thích đó không nhìn thấy được bởi người sử dụng thì phải dùng thè chú thích cùa JS p.

<%— Chú thích chi dành cho Server —%>

Những chú thích này chì có ỷ nghĩa giải thích dành cho người viết chương trình, sau khi dịch thành tệp lớp thi những người sử dụng không đọc chúng được nữa.

Ví dụ 6,9. Viết chương trình JSP để đọc dữ liệu được nhập vào từ dòng lệnh và hiển thị tên của máy tính chạy chương trình, số lần truy cập và ngày/giò hiện thời của hệ thống.

<%— jspTest.jsp —%>

<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.0 Transitional //EN> <HTML>

<HEAD>

<TITLE> Sủ dụng Java Server Pages </TITLE>

CLINK REL=STYLESHEET

HREF-“My-Style-Sheet.css”

TYPE=”text/css”>

</HEAD>

CBODY BGCOLOR= “#FDF5E6″ TEXT=”#000000″ LINK=”0000EE” VLINK=”#551A8B” ALINK=”FFOOOO”>

<CENTER>

CTABLE BORDER-5 BGCOLOR=”#EF8429″>

CTRXTH CLASS=”TITLE”>

Sử dụng Java Server Pages </TABLE>

</CENTER>

<p>

Những nội dung được tạo ra trong trang JSP

<UL>

<LI><B>Thè biều thức. </BXBR>

Hostname: <%=request.getRemoteHost() %>.

<LIXB>Thẻ kịch bàn. </BXBR>

<% out.println(“Dữ liệu đọc được: ” + request.getQueryString()); %>.

■ <LIXB>Thẻ khai báo. </BXBR>

<% private int accessCout = 0; %>

Số lần truy cập vào Web site:          <%= ++accessCout %>

<LlXB>Thè’ chi dẫn. </BXBR>

<%@ page import = “java.util.* %>

Ngày/giờ hiện thòi: <%= new Date() %>

</UL>

</BODY>

</HTML>

5. Các hành động của JSP

Các hành động JSP sử dụng các cấu trúc XML đế điều khiển hành vi của Servlet Engine. JSP có những hành động sau.

  • j sp : include – Đưa vào một tệp khi trang tin được yêu cầu.
  • j sp: useBean – Sử dụng đổi tượng
  • j sp : setProperty – Đặt lại thuộc tính cho
  • j sp: get Property – Đọc thuộc tính của
  • j sp : forward – Hướng tới một trang mới.
  • j sp: plugin – Cho phép chèn vào trình duyệt được xác định bời OBJECT hoặc EMBED cần thiết để chạy
  1. Thẻ jsp:include

Thè này cho phép bạn chèn các tệp cần thiết vào trang tin được tạo ra. Nỏ có dạng <jsp:include page = “relative URL” flush = “true” />

Nó được dùng để định hướng yêu cầu tới những nguồn tài nguyên tĩnh hoặc động trong cùng ngữ cảnh theo địa chì relative URL như khi gội trang JSP. Cơ chế thực hiện bằng cách tạo ra các tham số là các JavaBean tài nguyên (được giới thiệu ờ chương V) và đưa chúng vào yêu cầu, được mô tả như hình 6.12.

  1. Thẻ jsp:useBean

Thẻ hành động này cho phép tài các JavaBean (đưọctrirửibàyởchưong V) vào trang JSP để sử dụng chúng. Điều này rất tiện lợi và hiệu quả vi nó cho phép ta khai thác được những khả năng sử dụng lại của các lóp được xây dựng sẵn trong Java mà không đòi hỏi phải thoả mãn những yêu cầu cụ thể, những yêu cầu này sẽ được JSP đua vào trong Servlet để thực hiện. Nó có cú pháp đon gián như sau:

<jsp:useBean id = “name” class = “package.class” />

Trước khi truy cập vào một Bean ( JavaBean) trong trang JSP thì phải chi rõ nó có tên là gì (định danh), tên lóp tưong ứng ờ đâu. Khởi tạo một đối tưọrng của lóp được chì ra bời class và nó liên kết với biến thông qua tên gọi id. Sẽ là hiệu quả hcm khi ta tham chiếu tới những JavaBean đã có sẵn, và j sp:useBean cho biết rằng, một đối tượng mới được khởi tạo chỉ khi chưa có đối tượng nào có cùng id đã được tạo ra trước đó. Khi đã tạo ra một Bean, ta có thể thay đổi các tính chất của nó bằng cách sử dụng thè j sp’.setProperty, hoậc sử dụng các thè kịch bản và gọi những phương thức tường minh cùa đối tượng đó thông qua định danh id. Ví dụ, hãy xét thẻ sau:

<jsp:useBean id = “user” class = “company.Person” scope = “session” />

Một đối tượng của lớp Person được tạo ra và được đật vào phiên làm việc session. Nếu sau đó, ờ một trang JSP khác gặp phải thè j sp : useBean trên thi nó sẽ tham chiếu tới đổi tượng ban đầu đã được sinh ra ờ trong phiên session.

Khi đă khai báo một thành phẩn JavaBean, ta có thể truy cập vào các tính chất của nó thông qua thẻ j sp : get Property và có thể thay đồi những tính chất đó thông qua thẻ

j sp: setProperty.

  1. The jsprsetProperty

Bạn có thể sử dụng thẻ jsp: setProperty để đặt lại các tính chất của các Bean mà trang JSP tham chiểu tới. Có thể thực hiện theo hai cách.

+ Cách thứ nhất: sử dụng j sp : set Property, nhưng bên ngoài cùa j sp : useBean như sau:

<jsp:useBean id=”myName” … />

<jsp:setProperty name=”myName”

property=”someProperty” … />

Trong trường hợp này, jsp: setProperty được thực hiện mà không cần để ý đến việc một đối tượng mới được tạo ra hay đã có sẵn đối tượng đó.

+ Cách thứ hai. sử dụng 3 sp : setPropertỵ bên trong của thẻ j sp : useBean như sau:

<jsp:useBean id=”myName” … >

<jsp:setProperty name=”myName”

property=”someProperty” … /> </jsp:useBean>

Ở đây, jsp: setProperty chi thực thi được khi chưa có sẵn đối tượng’Bean và một đối tượng mới được tạo ra.

  1. Thẻ jsp: getProperty

Thẻ này tìm các giá trị thể hiện các tính chất của Bean, được chuyển sang xâu và chèn vào kết quả. Có hai thuộc tính yêu cầu là:

  • Tên của Bean được tham chiếu trước đó bởi j sp: useBean,
  • Tính chất có giá trị tưcmg ứng được chèn vào.

<jsp:useBean id=”itemBean” … />

<UL>

<LI>SỐ các mặt hàng:

<jsp:getProperty name=”itemBean” propertỵ=”numItems”/>

<LI>Giá bán mỗi mặt hàng:

<jsp:getProperty name=”itemBean” property=”unitCost” />

</UL>

  1. Thẻ jsp: forward

Thẻ này cho phép bạn khai báo trước về yêu cầu tới một trang tin khác. Nó cho phép hướng dẫn để vào một trang JSP, Servlet, hay một trang HTML tĩnh bèn trong ngữ cảnh như là cầu khẩn tới những trang đó. Kết quả là mọi công việc xử lý của trang hiện thời sẽ bị dừng lại ở ncri mà thẻ hướng dẫn này xuất hiện, mặc dù những công việc đó vẫn phải tiếp tục thực hiện.

<jsp:forward page = “somePage.jsp” />

Việc triệu dẫn một trang tin có thể truyền các tham số cho các Bean được tạo ra bằng cách đưa chúng vào yêu cầu như hình 6.13.