Tương tự HTML, thẻ lệnh JSP cũng bao gồm thẻ mở và thẻ đóng. Mỗi thẻ có
các thuộc tính quy định
Directives
Nhằm cung cấp thông tin tổng quát về trang JSP như : dùng ngôn ngữ lập trình gì, có quản lý phiên làm việc (session) không …
Cú pháp :
<%@ directive {attr=”value”}* %> Có các loại Directive :
1)Page directive
Page directive xác định số trang phụ thuộc vào các thuộc tính và chuyển các trang này tới JSP Container.
Một đơn vị chuyển dịch (translation unit - tập tin JSP nguồn và một số tập tin được đưa vào bằng chỉ dẫn include) có thể bao gồm nhiều chỉ dẫn page, tất cả các thuộc tính sẽ được áp dụng cho một đơn vị chuyển dịch hoàn chỉnh (nghĩa là các chỉ dẫn page không phụ thuộc vào vị trí). Tuy nhiên, sẽ chỉ có một sự kiện (occurrence) của thuộc tính (hoặc giá trị) được định nghĩa bởi directive này trong một đơn vị translation có sẵn với ngoại lệ (exception) của thuộc tính "import"; nhiều giá trị của thuộc tính được dồn lại (cumulative) (với những ngữ nghĩa được thiết lập thứ tự). Nhiều định nghĩa thuộc tính (hoặc giá trị) dẫn đến lỗi fatal translation.
Cú pháp :
Page page_directive_attr_list ::= {language="scriptingLanguage"} {extends="className"} {import="importList"} {session="true | false"} {buffer="none | sizekb"} {autoFlush=" true | false "} {isThreadSafe=" true | false "} {info="info_text"}
{errorPage="error_url"} {isErrorPage=" true | false "} {contentType="ctinfo"} {pageEncoding="peinfo"}
language: định nghĩa ngôn ngữ kịch bản được dùng trong những Scriptlet, những Srciptlet biểu thức, và những khai báo nằm trong phần thân của đơn vị translation (trang JSP và một vài file được include được sử dụng cho directive include bên dưới).
Trong JSP 1.2, chỉ được định nghĩa và quy định giá trị ngôn ngữ kịch bản cho thuộc tính này là "java". Đặc tả này chỉ mô tả những ngữ nghĩa của kịch bản dành cho khi giá trị của thuộc tính ngôn ngữ là "java".
Tất cả các ngôn ngữ kịch bản phải cung cấp một vài đối tượng ẩn (implicit) để người viết trang JSP có thể dùng trong các khai báo, các đoạn mã nhúng và các biểu thức.
Tất cả các ngôn ngữ kịch bản phải hỗ trợ JRE (Java Runtime Environment). Chúng cũng phải bộc lộ (expose) cho môi trường kịch bản
theo mô hình đối tượng theo của Java, nhất là các biến ẩn, thuộc tính các thành phần JavaBean, và các phương thức chung.
extends: Giá trị là một tên lớp của ngôn ngữ lập trình Java, tên lớp này định danh lớp cha (superclass) của lớp mà trang JSP này biến đổi (transformed).
Không nên dùng thuộc tính này nếu không có sự cân nhắc cẩn thận, do thuộc tính này giới hạn khả năng cung cấp các lớp chuyên dụng có thể cải thiện chất lượng của dịch vụ hồi đáp của JSP Container.
import: Thuộc tính import mô tả những kiểu có sẵn trong môi trường kịch bản. Giá trị tương đương với khai báo import trong ngôn ngữ lập trình Java. Nghĩa là: một danh sách (có dấu phẩy ngăn cách) của tên kiểu ngôn ngữ lập trình Java hoặc tên gói (package) đi theo trước chuỗi ".*", biểu thị tất cả các kiểu chung được khai báo trong gói đó. Danh sách import sẽ được nhập vào bởi việc thực thi trang JSP, do đó khả dụng đối với môi trường kịch bản.
Một số import mặc định như là : java.lang.* , javax.servlet.* , javax.servlet.jsp.* , và javax.servlet.http.*
session: Chỉ ra trang yêu cầu tham gia vào phiên làm việc (http).
Nếu "true" thì biến của ngôn ngữ kịch bản được đặt là "session" thuộc kiểu javax.servlet.http.HttpSession tham chiếu đến phiên làm việc (session) hiện hành (hoặc session mới của trang).
Nếu "false" : trang không tham gia vào trong phiên làm việc, biến "session" hoàn toàn không sẵn sàng, các tham chiếu tới nó không hợp lệ và kết quả trả về là lỗi biên dịch.
buffer: Chỉ định kiểu bộ đệm (buffering) đối tượng "out" JspWrite ban đầu để điều khiển nội dung xử lý xuất (output) của trang đó.
Nếu là "none", thì không có bộ đệm (buffering) và tất cả xử lý xuất (output) được ghi bởi servletResponse PrintWriter.
Kích thước bộ đệm được chỉ định bằng kilobyte, viết tắt là "kb".
Nếu kích thước bộ đệm được chỉ định, ngỏ xuất (output) được dùng làm bộ đệm với kích thước buffer tối thiểu là kích thước đã chỉ định.
Tùy thuộc vào giá trị của thuộc tính "autoFlush", những nội dung của buffer này tự động làm sạch (flush) hay một ngoại lệ (exception) được đưa ra khi tràn bộ nhớ (overflow).
autoFlush: chỉ định ngỏ ra bộ đệm có được dọn sạch tự động hay không (giá trị “true") khi bộ đệm đầy, hoặc một ngoại lệ phát sinh để báo tràn bộ đệm
Mặc định là "true".
Chú ý: sẽ không hợp lệ để ghi autoFlush="false" khi buffer="none" isThreadSafe: chỉ ra mức an toàn tuyến đoạn (threadsafe) thi công.
Nếu "false" thì JSP Container sẽ gởi đi những yêu cầu chưa giải quyết xong, mỗi thời điểm một yêu cầu, theo thứ tự mà nó nhận được.
Nếu "true" thì JSP Container có thể chọn gởi đi cùng một lúc nhiều yêu cầu chưa giải quyết của Client.
Mặc định là "true".
Chú ý : sự kiện xảy ra, nếu thuộc tính isThreadSafe là "false", JSP page autor phải bảo đảm việc truy xuất tới các đối tượng dùng chung nào đó được chia sẻ bằng thuộc tính ServletContext hoặc thuộc tính HttpSession xảy ra đồng thời.
infor: Định nghĩa một chuỗi tuỳ ý, chuỗi này được kết hợp với trang đã dịch, để thu được thông tin từ thực thi phương thức Servlet.getServletInfo ().
isErrorPage: Cho biết nếu trang JSP hiện hành là địa chỉ URL đích của errorPage trong trang JSP khác.
Nếu "true" thì biến ngôn ngữ kịch bản "exception" hoàn toàn được xác định và giá trị của nó tham chiếu đến "throwable" bị vi phạm do trang JSP bị lỗi.
Nếu "false" thì biến "exception" không có sẵn. Và các tham chiếu tới nó không hợp lệ và kết quả trả về là lỗi fatal translation.
Mặc định là "false".
errorPage: Xác định một địa chỉ URL của tài nguyên mà đối tượng Throwable (của Java Programming Language) trả ra.
Nếu địa chỉ URL đặt tên khác tên trang JSP thì khi gọi nó, biến kịch bản "exception" sẽ chứa một tham chiếu đến đối tượng Throwable không rõ ràng.
Chú ý : Đối tượng Throwable được chuyển qua throwing page implementation bằng cách lưu đối tượng tham chiếu vào chung đối tượng ServletRequest theo phương thức setAttribute () , với tên " javax.servlet.jsp.jspException ".
Nếu autoFlush=true, thì nội dung của JspWrite lúc đầu đã được thay bằng (flush) luồng xử lý xuất (output) ServletResponse, kế đến (subsequent) chiếm lấy hoàn toàn để gởi đi một ngoại lệ không rõ ràng (uncaught),
Bao giờ trang lỗi (error page) cũng chỉ ra theo miêu tả web.xml, trang JSP lỗi áp dụng trước rồi sau đó đến trang web.xml.
contentType: Xác định nghĩa kí tự mã hoá (character encoding) cho trang JSP và thay thế cho hồi đáp (response) của trang JSP, theo kiểu MIME. Giá trị là dạng "TYPE" hoặc "TYPE ; charset=CHARSET " với một khoảng trắng tuỳ ý sau dấu ";".
CHARSET xuất hiện là một giá trị IANA ứng với mỗi kí tự mã hóa.
Giá trị mặc định của TYPE là "text/html". Giá trị mặc định cho kí tự mã hoá là ISO-8859-1.
VD :
<%@ page info="my lastest JSP Example" %>
<%@ page buffer="none" isThreadSafe="yes" errorPage="/oops.jsp" %> <%@ page language="java" import="com.myco.*" buffer="16k" %> Taglib directive: Tập hợp các tag mà JSP Container thông dịch, được mở
rộng qua một "thư viện thẻ” (tag library).
Taglib directive trong một trang JSP khai báo trang sử dụng thư viện thẻ, nhận dạng các thư viện tag sử dụng URI kết hợp với tiền tố thẻ (tag prefix), nó sẽ phân biệt cách dùng của các hành động trong thư viện. Nếu việc thi công của JSP Container không thể định vị mô tả thư viện
tag, thì sẽ tạo ra một lỗi biên dịch.
Là một lỗi dịch khó tránh khỏi của taglib directive xuất hiện sau các hành động dùng tiền tố được giới thiệu trong taglib directive.
Thư viện thẻ có thể thêm một phương thức kiểm tra để xác định xem trang JSP có dùng đúng các chức năng trong thư viện thẻ không.
Cú pháp :
uri là địa chỉ URI chính xác hoặc tương đối, mà nó mô tả của thư viện thẻ kết hợp với tiền tố này. tagPrefix Xác định chuỗi prefix trong <prefix>:<tagname>,
được sử dụng để phân biệt các hành động tuỳ ý. chẳng hạn như : <myPrefix:myTag>.
Có các loại prefix dành riêng như : jsp:, jspx:, java:, javax:, servlet:, sun:, and sunw:
VD : <%@ taglib uri="http://www.mycorp/supertags" prefix="super" /> . . . <super:doMagic> . . . <super:doMagic> 2)Include directive
Include directive được dùng để thay thế văn bản hoặc code trong lúc dịch (translation-time) trang JSP. Khai báo <%@ include file="relativeURLspec" %> chèn văn bản của tài nguyên nào đó vào tập tin .jsp. File được include vào (có thể là một trang .jsp hay một trang .html) là đối tượng điều khiển truy cập có sẵn của JSP Container.
JSP Container có thể thêm một cơ chế đang được khai báo. Nếu một tập tin được thêm vào bị thay đổi thì container có thể biên dịch lại trang JSP đó.
Cú pháp :
<%@ include file = "relativeURLspec" %> Ví dụ:
<HTML>
Include page demo
<% out.println(“<STRONG>To day is :” );%> <%@ include file="Firstpage.jsp" %>
</HTML>
Ta thấy kết quả giống trang Firstpage.jsp , thực sự trang Testfile.jsp chỉ gọi trang Firstpage.jsp, sau đó trang Firstpage.jsp sẽ thi hành, nên kết quả của trang Testfile.jsp giống hệt trang Firstpage.jsp
Thêm dữ liệu vào trang JSP
Việc thêm dữ liệu là công việc có ý nghĩa trong trang JSP. Và được biểu thị theo bảng sau :
Cú pháp Loại Thời điểm Đặc tả Đối
tượng Mô tả <%@ include file=…> <jsp:include page= /> Directiv e Action Translation - time Request-time Virtual Virtual Static Static and dynamic Nội dung được phân tách bởi JSP Container. Nội dung không được phân tách; mà chỉ được thêm vào một nơi nào đó.
3)Thành tố kịch bản (Scripting Elements)
Các trang JSP có thể chứa những đoạn mã nhúng gọi là scriptlet. Một scriptlet là một đoạn mã Java liên quan đến nghiệp vụ nào đó được thực hiện ở thời điểm xử lý yêu cầu của Client. Nó kết hợp với những thành phần tĩnh để tạo ra nội dung động cho trang Web.
Các đoạn mã script được đặt trong cặp dấu <% và %>. Ngoài ra người ta còn dùng cặp dấu <%! và %> để khai báo biến hay hàm được sử dụng trong trang, cặp dấu <%= và %> để tính giá trị của một biểu thức.
Những Scripting Elements thông thường được dùng để vận dụng những đối tượng và thực hiện thao tác tính toán tác động đến nội dung phát sinh.
Có 3 lớp thành tố kịch bản: declarations, scriptlets và expressions. Ngôn ngữ kịch bản đã dùng trong trang hiện hành nhận được giá trị chỉ dẫn language.
Declarations được dùng để khai báo cấu trúc ngôn ngữ kịch bản có sẵn cho tất cả các thành tố kịch bản. Scriptlet được dùng để mô tả các hành động được thực hiện trong phần hồi đáp (response) tới các yêu cầu. Mã nhúng là các đoạn chương trình, có thể cũng được dùng để thực hiện các công việc giống như các phép lặp (iteration) và sự thực thi (execution) có điều kiện của các thành tố khác trong trang JSP. Expression là các biểu thức hoàn chỉnh trong ngôn ngữ kịch bản, chúng được lượng giá (evaluated) tại thời điểm phản hồi (response time); thông thường kết quả được chuyển đổi (converted) sang một chuỗi rồi sau đó được chèn vào luồng xuất.
Tất cả JSP Container đều hỗ trợ các thành tố kịch bản dựa trên ngôn ngữ lập trình Java. Ngoài ra, JSP Container cũng có thể hỗ trợ những ngôn ngữ kịch bản khác. Tất cả các ngôn ngữ kịch bản như vậy phải hỗ trợ :
Sự thao tác (manipulation) trong các đối tượng Java.
Việc nắm được (catching) của các ngoại lệ (exception) ngôn ngữ Java.
Mỗi element kịch bản có một "<%" dựa vào cú pháp sau : <%! this is a declaration %>
<% this is a scriptlet %> <%= this is a expression %>
Khoảng trắng tùy ý sau "<%!", "<%", "<%=" và trước "%>"
• Các khai báo (Declaration)
Các khai báo được dùng để khai báo các biến và các phương thức bằng ngôn ngữ kịch bản dùng trong trang JSP. Một khai báo phải là một câu lệnh hoàn chỉnh.
Các khai báo không đưa ra xử lý xuất nào trong luồng (stream) xử lý xuất hiện hành.
Các khai báo được khởi tạo khi trang JSP được khởi tạo và đã có sẵn cho các khai báo, các Scriptlet, và các biểu thức khác. Việc khai báo gần giống như khai báo biến trong các lớp Java. Mỗi khai báo mở đầu bằng dấu <%! Và kết thúc bằng dấu %>. Cú pháp :
<%! Declaration (s) %> VD :
<%! int i = 0; %>
<%! public String f(int i) { if (i<3) return ("…"); …} %> (Chú ý : ta phải ghi dấu chấm phẩy như viết câu lệnh trong định nghĩa lớp Java).
Scritlet là phần diễn đạt các thao tác tính toán, xử lý của Java trong trang JSP, mã nhúng nằm giữa cặp dấu <% và %>.
Các Scriptlet có thể chứa các phân mảnh hợp lý được ngôn ngữ kịch bản chỉ định trong directive language.
Các Scriptlet được thi hành (executed) tại thời điểm xử lý yêu cầu (request-processing time). Trong bất cứ trường hợp, các Scriptlet đưa đầu xuất (output) nào trong luồng out phụ thuộc vào mã có thực trong Scriptlet. Các Scriptlet có thể có các tác động phụ (side-effect), làm thay đổi rõ rệt các đối tượng.
Cú pháp : <% scriptlet %> VD : <% if (Calendar.getInstance().get(Calendar.AM_PM) == Calendar.AM) { %> Good Morning <% } else {%> Good Afternoon <% } %> • Biểu thức (Expressions)
Một thành tố biểu thức trong trang JSP là một biểu thức ngôn ngữ kịch bản được định giá (evaluated) và kết quả trả về buộc (coerce) phải là một String được phát ra sau đối tượng out JspWriter.
Biểu thức được mở đầu bằng dấu <%= và kết thúc bằng dấu %>.
Nếu kết quả không thể ép kiểu thành một String thì khi đó sẽ xuất hiện lỗi, hoặc nếu việc ép kiểu không được nhận thấy thì một biệt lệ ClassCastException sẽ phát sinh tại thời điểm yêu cầu.
Trong các biểu thức có thể có các tác động phụ (side-effect). Các tác động phụ sẽ nhận tác động khi biểu thức được định giá (evaluated). Biểu thức được định giá từ trái sang phải. Nếu các biểu thức xuất hiện trong nhiều thuộc tính lúc chạy, chúng được định giá từ trái sang phải trong thẻ.
Nội dung của một biểu thức phải là một biểu thức hoàn chỉnh trong ngôn ngữ kịch bản mà chúng được ghi.
Những biểu thức được định giá (evaluate) tại thời điểm xử lý HTTP. Giá trị một biểu thức được chuyển đổi (converted) thành một String và được chèn vào vị trí đúng đắn trong tập tin .jsp.
Cú pháp :
<%= expression %> Ví dụ:
<HTML>
<%! int count=12; //khai báo biến count %>
<%! String description = “Increase count variable”; //khai báo biến description %>
<%= description%> <%= ++count%>
</HTML>