SlideShare ist ein Scribd-Unternehmen logo
1 von 19
Downloaden Sie, um offline zu lesen
9/10/2011

Nội dung


1. JSP trong kiến trúc J2EE



Bộ môn Công nghệ Phần mềm
Viện CNTT & TT
Trường Đại học Bách Khoa Hà Nội

2. Giới thiệu về JSP




LẬP TRÌNH WEB HƯỚNG JAVA
Bài 09: Cơ bản về JSP






Giảng viên: ThS. Trịnh Tuấn Đạt
Bộ môn CNPM
Email: trinhtuandat.bk@gmail.com/dattt@soict.hut.edu.vn
DatTT-DSE-SOICT-HUST
1




3. Vòng đời của trang JSP
4. Các bước phát triển ứng dụng Web với JSP
5. Kỹ thuật sinh nội dung động với JSP
6. Gọi mã nguồn Java sử dụng JSP scripting
elements
7. JavaBeans
8. Xử lý lỗi (Error handling)
9. Ví dụ: Date Website
DatTT-DSE-SOICT-HUST

2

JSP & Servlet trong kiến trúc J2EE 1.2
Một công nghệ Web mở rộng, kết
hợp với các đối tượng Java, trả về
nội dung động cho client dưới dạng
HTML hoặc XML. Client thường là
Web Browser

1. JSP trong kiến trúc J2EE

DatTT-DSE-SOICT-HUST

DatTT-DSE-SOICT-HUST

3

Static contents





4

JSP & Servlet - Web Components

Thế nào là Static & Dynamic Contents?


Java Servlet: 1 chương trình
Java, mở rộng chức năng 1 web
server, sinh nội dung động và
tương tác với web clients sử
dụng mô hình request-response

Điển hình là các trang HTML tĩnh
Hiển thị như nhau cho tất cả mọi người

Dynamic contents



Nội dung được sinh tự động theo 1 số conditions
Các Conditions có thể là




Tài khoản người dùng
Thời gian
Giá trị User nhập vào trên forms hoặc qua lựa chọn
DatTT-DSE-SOICT-HUST

5

DatTT-DSE-SOICT-HUST

6

1
9/10/2011

Trang JSP là gì?



Là 1 tài liệu text có thể trả về cả static và dynamic
content cho trình duyệt
Static content và dynamic content có thể được
ghép lẫn với nhau
Static content



Dynamic content



2. Giới thiệu về JSP









DatTT-DSE-SOICT-HUST

HTML, XML, Text
Mã Java
Các thuộc tính hiển thị của JavaBeans
Các thẻ Custom tags
DatTT-DSE-SOICT-HUST

7

Ví dụ trang JSP
(Blue: static, Red: Dynamic contents)

8

Kết quả hiển thị

<html>
<body>
Hello World!
<br>
Current time is <%= new java.util.Date() %>
</body>
</html>

DatTT-DSE-SOICT-HUST

9

DatTT-DSE-SOICT-HUST

10

JSP
Servlets

2.1. JSP và Servlet

DatTT-DSE-SOICT-HUST

HTML code in
Java
● Not easy to
author
●

11

JSP
Java-like code in
HTML
● Very easy to
author
● Code is compiled
into a servlet
●

DatTT-DSE-SOICT-HUST

12

2
9/10/2011

Ưu điểm của JSP







Tách biệt nội dung & cách trình bày
Đơn giản hóa việc phát triển ứng dụng Web với
JSP, JavaBeans và custom tags
Hỗ trợ tái sử dụng phần mềm qua các components
(JavaBeans, Custom tags)
Tự động triển khai





Ưu điểm của JSP so với Servlet?




Sử dụng lệnh println() để sinh các trang HTML
 Hạn chế trong bảo trì các trang HTML







Tự biên dịch lại các trạng JSP khi có thay đổi

Độc lập playform
Dễ dàng hơn cho ngươi thiết kế (không cần hiểu rõ
Java)
DatTT-DSE-SOICT-HUST

Servlets:

Khi thay đổi, phải biên dịch lại, (đóng gói lại),
deploy lại

JSP:


Khắc phục 2 hạn chế trên

13

DatTT-DSE-SOICT-HUST

14

Nên dùng JSP thay cho Servlet hay ngược lại?


Cần khai thác đồng thời 2 công nghệ






Sức mạnh của Servlet là “controlling and
dispatching”
Sức mạnh của JSP là “displaying”

2.2. Kiến trúc JSP

Trong thực tế, cả servlet và JSP được sử
dụng trong mẫu thiết kế MVC (Model-ViewController)



Servlet xử lý phần Controller
JSP xử lý phần View
DatTT-DSE-SOICT-HUST

15

Kiến trúc/Thiết kế ứng dụng Web

DatTT-DSE-SOICT-HUST

16

Tách biệt xử lý Request với hiển thị (Presentation)
Servlet
Request processing

Pure Servlet

forward(“conf. jsp”);
}

Public class OrderServlet …{
public void doGet(…){
if( isOrderValid(req)){
saveOrder(req);
out.println(“<html>”);
out.println(“<body>”);
……
private void isOrderValid (….){
……
}

Public class OrderServlet …{
public void doGet(…){
……
if(bean.isOrderValid (..)){
bean.saveOrder(….);

}

JSP
presentation

private void saveOrder(….){
……
}

<html>
<body>
<ora: loop name =“order”>
…..
</ora:loop>
<body>
</html>

JavaBeans

}

isOrderValid( )
Business logic

DatTT-DSE-SOICT-HUST

17

DatTT-DSE-SOICT-HUST

saveOrder( )
18

3
9/10/2011

Kiến trúc JSP

3. Vòng đời của 1 trang JSP

DatTT-DSE-SOICT-HUST

19

DatTT-DSE-SOICT-HUST

JSP làm việc như thế nào?

20

Các giai đoạn trong vòng đời trang JSP

User Request




Server



Translation
Compile
Execution

File
JSP
Changed
?
Create Source
Compile
Execute Servlet
DatTT-DSE-SOICT-HUST

21

DatTT-DSE-SOICT-HUST

Giai đoạn Translation/Compilation






Các file JSP được dịch thành mã Servlet. Sau đó mã
này mới được biên dịch tiếp
Thực hiện tự động nhờ container, ở lần đầu tiên
trang JSP được truy cập (hoặc khi chỉnh sửa)
Với trang JSP tên là “pageName”, mã dịch sẽ nằm ở




Ví dụ:


Giai đoạn Translation/Compilation




Dữ liệu tính được chuyển thành mã Java, tác
động tới output stream trả dữ liệu về cho
client
Các phần tử JSP được xử lý khác nhau:


<AppServer_HOME>/work/Standard
Engine/localhost/context_root/pageName$jsp.java



<AppServer_HOME>/work/Standard
Engine/localhost/date/index$jsp.java
DatTT-DSE-SOICT-HUST



23

22

Các chỉ dẫn (Directives) được dùng để điều khiển
Web container biên dịch và thực thi trang JSP
Phần tử Scripting được thêm vào lớp servlet
tương ứng của trang JSP
Phần tử dạng <jsp:xxx .../> được chuyển thành
lời gọi phơng thức tới JavaBeans components
DatTT-DSE-SOICT-HUST

24

4
9/10/2011

Khởi tạo trang JSP

Các phương thức trong giai đoạn thực thi


Có thể khai báo phương thức khởi tạo thực
hiện nhiệm vụ




DatTT-DSE-SOICT-HUST

25

DatTT-DSE-SOICT-HUST

Kết thúc trang JSP





26

Ví dụ: initdestroy.jsp

Khai báo phương thức thực hiện nhiệm vụ


Đọc tham số cấu hình
Khởi tạo tài nguyên
Thực hiện bất kỳ công việc khởi tạo nào khác
bằng việc override phương thức jspInit() của
giao diện JspPage

Đọc tham số cấu hình
Giải phóng tài nguyên
Thực hiện bất kỳ công việc dọn dẹp nào bằng
cách override phương thức jspDestroy() của giao
diện JspPage

<%@ page import="database.*" %>
<%@ page errorPage="errorpage.jsp" %>
<%-- Declare initialization and finalization methods using JSP declaration --%>
<%!
private BookDBAO bookDBAO;
public void jspInit() {
// retrieve database access object, which was set once per web application
bookDBAO =
(BookDBAO)getServletContext().getAttribute("bookDB");
if (bookDBAO == null)
System.out.println("Couldn't get database.");
}

DatTT-DSE-SOICT-HUST

27

public void jspDestroy() {
bookDBAO = null;
}
%>

DatTT-DSE-SOICT-HUST

28

3. Các bước phát triển và triển khai ứng
dụng Web


4. Các bước phát triển ứng
dụng Web với JSP




(Xem lại bài trước)





Viết code (và biên dịch) cho các Web component
(Servlet or JSP), các helper classes sử dụng trong
web component
Tạo các tài nguyên tĩnh (Images, các trang HTML)
Viết file deployment descriptor (web.xml)
Build ứng dụng Web (Tạo file *.war hoặc thư mục
dạng chưa đóng gói nhưng triển khai được)
Triển khai ứng dụng Web trên 1 Web container


DatTT-DSE-SOICT-HUST

29

Web clients có thể truy cập ứng dụng qua URL
DatTT-DSE-SOICT-HUST

30

5
9/10/2011

GreetingServlet.java (1)
import
import
import
import
import

So sánh
Hello1 Servlet & Hello2 JSP

java.io.*;
java.util.*;
java.sql.*;
javax.servlet.*;
javax.servlet.http.*;

/**
* This is a simple example of an HTTP Servlet. It responds to the GET
* method of the HTTP protocol.
*/
public class GreetingServlet extends HttpServlet {
public void doGet (HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException
{
response.setContentType("text/html");
response.setBufferSize(8192);
PrintWriter out = response.getWriter();
// then write the data of the response
out.println("<html>" +
"<head><title>Hello</title></head>");

DatTT-DSE-SOICT-HUST

DatTT-DSE-SOICT-HUST

31

GreetingServlet.java (2)

32

GreetingServlet.java (3)

// then write the data of the response
out.println("<body bgcolor="#ffffff">" +
"<img src="duke.waving.gif">" +
"<h2>Hello, my name is Duke. What's yours?</h2>" +
"<form method="get">" +
"<input type="text" name="username" size="25">" +
"<p></p>" +
"<input type="submit" value="Submit">" +
"<input type="reset" value="Reset">" +
"</form>");

public String getServletInfo() {
return "The Hello servlet says hello.";
}
}

String username = request.getParameter("username");
// dispatch to another web resource
if ( username != null && username.length() > 0 ) {
RequestDispatcher dispatcher =
getServletContext().getRequestDispatcher("/response");
if (dispatcher != null)
dispatcher.include(request, response);
}
out.println("</body></html>");
out.close();
}

DatTT-DSE-SOICT-HUST

33

DatTT-DSE-SOICT-HUST

greeting.jsp

34

ResponseServlet.java

<html>
<head><title>Hello</title></head>
<body bgcolor="white">
<img src="duke.waving.gif">
<h2>My name is Duke. What is yours?</h2>

import
import
import
import
import

java.io.*;
java.util.*;
java.sql.*;
javax.servlet.*;
javax.servlet.http.*;

<form method="get">
<input type="text" name="username" size="25">
<p></p>
<input type="submit" value="Submit">
<input type="reset" value="Reset">
</form>

// This is a simple example of an HTTP Servlet. It responds to the GET
// method of the HTTP protocol.
public class ResponseServlet extends HttpServlet {
public void doGet (HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException{
PrintWriter out = response.getWriter();

<%
String username = request.getParameter("username");
if ( username != null && username.length() > 0 ) {

// then write the data of the response
String username = request.getParameter("username");
if ( username != null && username.length() > 0 )
out.println("<h2>Hello, " + username + "!</h2>");

%>
<%@include file="response.jsp" %>
<%
}
%>
</body>
</html>

}
public String getServletInfo() {
return "The Response servlet says hello.";
}
DatTT-DSE-SOICT-HUST

35

}

DatTT-DSE-SOICT-HUST

36

6
9/10/2011

response.jsp
<h2><font color="black">Hello, <%=username%>!</font></h2>

JSP “là” Servlet!

DatTT-DSE-SOICT-HUST

37

DatTT-DSE-SOICT-HUST

greeting$jsp.java (1)

JSP là “Servlet”






package org.apache.jsp;

Các trang JSP được dịch thành servlet


import
import
import
import

Tomcat biên dịch greeting.jsp thành
greeting$jsp.java

Scriptlet (Java code) trong trang JSP sẽ được
chèn vào trong phương thức jspService() của
servlet tương ứng
Các đối tượng Servlet có thể được truy cập
từ trang JSP, mã nguồn phát triển
JavaBeans, hoặc custom tag.
DatTT-DSE-SOICT-HUST

38

javax.servlet.*;
javax.servlet.http.*;
javax.servlet.jsp.*;
org.apache.jasper.runtime.*;

public class greeting$jsp extends HttpJspBase {
static {
}
public greeting$jsp( ) {
}
private static boolean _jspx_inited = false;
public final void _jspx_init()
throws org.apache.jasper.runtime.JspException {
}

39

greeting$jsp.java (2)

DatTT-DSE-SOICT-HUST

40

greeting$jsp.java (3)

public void _jspService(HttpServletRequest request,
HttpServletResponse response)
throws java.io.IOException, ServletException
{

try {
if (_jspx_inited == false) {
synchronized (this) {
if (_jspx_inited == false) {
_jspx_init();
_jspx_inited = true;
}
}
}
_jspxFactory = JspFactory.getDefaultFactory();
response.setContentType("text/html;charset=ISO-8859-1");
pageContext = _jspxFactory.getPageContext(this, request,
response,"", true, 8192, true);

JspFactory _jspxFactory = null;
PageContext pageContext = null;
HttpSession session = null;
ServletContext application = null;
ServletConfig config = null;
JspWriter out = null;
Object page = this;
String _value = null;

application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();

DatTT-DSE-SOICT-HUST

41

DatTT-DSE-SOICT-HUST

42

7
9/10/2011

greeting$jsp.java (4)

greeting$jsp.java (5)

// HTML // begin [file="/greeting.jsp";from=(38,4);to=(53,0)]
out.write("nn<html>n<head><title>Hello</title></head>n<body
bgcolor="white">n<img src="duke.waving.gif"> n<h2>My name is Duke.
What is yours?</h2>nn<form method="get">n<input type="text"
name="username" size="25">n<p></p>n<input type="submit"
value="Submit">n<input type="reset" value="Reset">n</form>nn");

// HTML // begin [file="/response.jsp";from=(40,44);to=(55,0)]
out.write("!</font></h2>nnnnnnnnnnnnnnn");
// end
// HTML // begin [file="/greeting.jsp";from=(57,37);to=(58,0)]
out.write("n");

// end
// begin [file="/greeting.jsp";from=(53,2);to=(56,0)]

// end
// begin [file="/greeting.jsp";from=(58,2);to=(60,0)]

String username = request.getParameter("username");
if ( username != null && username.length() > 0 ) {
// end
// HTML // begin [file="/greeting.jsp";from=(56,2);to=(57,4)]
out.write("n
");

}
// end
// HTML // begin [file="/greeting.jsp";from=(60,2);to=(63,0)]
out.write("n</body>n</html>n");
// end
} catch (Throwable t) {
if (out != null && out.getBufferSize() != 0) out.clearBuffer();
if (pageContext != null) pageContext.handlePageException(t);
} finally {
if (_jspxFactory != null)
_jspxFactory.releasePageContext(pageContext);
}

// end
// HTML // begin [file="/response.jsp";from=(38,4);to=(40,31)]
out.write("nn<h2><font color="black">Hello, ");
// end
// begin [file="/response.jsp";from=(40,34);to=(40,42)]
out.print(username);
// end
DatTT-DSE-SOICT-HUST

}
43

}

DatTT-DSE-SOICT-HUST

44

5. Kỹ thuật sinh nội dung động với công
nghệ JSP


5. Kỹ thuật sinh nội dung
động trong JSP

Có thể áp dụng các kỹ thuật khác nhau, tùy
các yếu tố sau





DatTT-DSE-SOICT-HUST

Có đầy đủ các kỹ thuật từ đơn giản tới phức
tạp

DatTT-DSE-SOICT-HUST

45

5. Kỹ thuật sinh nội dung động với công
nghệ JSP









Gọi mã Java trực tiếp trong JSP
Gọi mã Java gián tiếp trong JSP
Sử dụng JavaBeans
Tự phát triển và sử dụng các custom tags
Sử dụng 3rd-party custom tags hoặc JSTL
(JSP Standard Tag Library)
Sử dụng mẫu thiết kế MVC
Sử dụng Model2 frameworks đã được kiểm
chứng
DatTT-DSE-SOICT-HUST

Kích thước, độ phức tạp của project
Yêu cầu về tái sử dụng code, bảo trì, …

46

(a) Gọi mã Java trực tiếp



Đặt tất cả mã nguồn Java trong trang JSP
Chỉ phù hợp với ứng dụng Web đơn giản






Không nền dùng với loại ứng dụng Web
tương ôối phức tạp


47

Khó bảo trì
Khó tái sử dụng
Khó hiểu

Phân tách giữa contents và presentation là chưa
rõ ràng
DatTT-DSE-SOICT-HUST

48

8
9/10/2011

(b) Gọi mã Java gián tiếp








(c) Sử dụng JavaBeans

Phát triển các lớp tiện ích độc lập
Chàn vào trang JSP mã nguồn Java gọi đến
các lớp tiện ích
Tốt hơn cách 1: phân tách tốt hơn phần sinh
nội dung với phần presentation
Tái sử dụng, bảo trì tốt hơn so với cách 1
Tuy nhiên, sự tách biệt giữa contents và
presentation vẫn chưa rõ ràng
DatTT-DSE-SOICT-HUST








Phát triển các lớp tiện ích dưới dạng
JavaBeans
Khai thác được các hỗ trợ của JSP cho
JavaBeans
Dễ sử dụng hơn với người phát triển Web
Dễ tái sử dụng, bảo trì hơn 2 cách đầu

49

DatTT-DSE-SOICT-HUST

(e) Sử dụng 3rd-party custom tags hoặc
JSTL

(d) Phát triển và sử dụng các Custom Tags


Phát triển các components gọi là các custom
tags











Custom tags được thiết kế đặc biệt cho JSP


(JavaBeans: chỉ có phương thức getter & setter)

Tái sử dụng, bảo trì tốt hơn, ổn định hơn
Tuy nhiên, phát triển custom tags khó hơn
tạo các JavaBeans
DatTT-DSE-SOICT-HUST

Có nhiều custom tags mã nguồn mở/thương
mại


Mạnh mẽ hơn JavaBeans component



51

Tuân theo mẫu thiết kế MVC







Với vai trò developer hoặc deployer, cần đảm
bảo có đủ các custom tags này (Từ phiên bản
J2EE 1.3)

DatTT-DSE-SOICT-HUST

52

(g) Sử dụng các MVC Model2 Frameworks
đã kiểm chứng


Model: sử dụng các công nghệ sẵn có khác
(JDBC, hibernate, ...)
View: sử dụng JSP
Controller: sử dụng Servlet

Ví dụ: Apache Struts

JSTL (JSP Standard Tag Library) chuẩn hóa
tập các custom tags tối thiểu cho Java EE

(f) Thiết kế/Sử dụng mẫu MVC


50

Có rất nhiều lựa chọn




Apache Struts
JavaServer Faces (JSF)
Các framework khác: Echo, Tapestry, WebWorks,
Wicket

Tự thiết kế/tạo mẫu kiến trúc MVC:


Khó khăn, không nên làm (Nên sử dụng sẵn)

DatTT-DSE-SOICT-HUST

53

DatTT-DSE-SOICT-HUST

54

9
9/10/2011

JSP Scripting Elements


6. Gọi mã nguồn Java sử dụng
JSP scripting elements





Cho phép chèn mã nguồn Java vào servlet
được sinh tương ứng cho trang JSP
Nên GiẢM THIỂU sử dụng JSP scripting
elements trong trang JSP nếu có thể
Có 3 dạng:




DatTT-DSE-SOICT-HUST

DatTT-DSE-SOICT-HUST

55

Expressions











Expression được tính giá trị và chuyển thành một String
String sau đó được chèn trực tiếp vào output stream của
Servlet tương ứng
Kết quả tương đương với lệnh out.println(expression)
Có thể sử dụng các biến định nghĩa trước đó (implicit
objects) trong 1 expression

Hiển thị thời gian hiện tại sử dụng lớp Date



Hiển thị 1 số ngẫu nhiên sử dụng lớp Math



Sử dụng các implicit objects








Cú pháp




<%= Expression %> hoặc
<jsp:expression>Expression</jsp:expression>
KHÔNG được dùng dấu ; trong các expressions
DatTT-DSE-SOICT-HUST




57














Hostname: <%= request.getRemoteHost() %>
Parameter: <%= request.
getParameter(“yourParameter”) %>
Server: <%= application.getServerInfo() %>
Session ID: <%= session.getId() %>
58

Thiết lập response headers và status codes
Ghi log cho server
Cập nhật CSDL
Thực thi mã nguồn có điều khiển lặp, rẽ nhánh

<% Java code %> hoặc
<jsp:scriptlet> Java code</jsp:scriptlet>

DatTT-DSE-SOICT-HUST

Hiển thị query string (của URL yêu cầu)
<%
String queryData = request.getQueryString();
out.println(“Attached GET data: “ +
queryData);
%>

Có thể sử dụng các biến đã định nghĩa (implicit objects)
Cú pháp:


Random number: <%= Math.random() %>

Ví dụ: Scriptlets

Sử dụng để chèn mã Java bất kỳ vào phương thức
jspService() của Servlet tương ứng
Có thể làm được các việc mà expressions không thể


Current time: <%= new java.util.Date() %>

DatTT-DSE-SOICT-HUST

Scriptlets


56

Ví dụ: Expressions

Trong giai đoạn thực thi trang JSP:


Expressions: <%= Expressions %>
Scriptlets: <% Code %>
Declarations: <%! Declarations %>

59



Thiết lập response type
<% response.setContentType(“text/plain”); %>

DatTT-DSE-SOICT-HUST

60

10
9/10/2011

Ví dụ: Scriptlet với điều khiển lặp

Ví dụ: Scriptlet với điều khiển lặp (2)

<%
Iterator i = cart.getItems().iterator();
while (i.hasNext()) {
ShoppingCartItem item =
(ShoppingCartItem)i.next();
BookDetails bd = (BookDetails)item.getItem();
%>
<tr>
<td align="right" bgcolor="#ffffff">
<%=item.getQuantity()%>
</td>
<td bgcolor="#ffffaa">
<strong><a href="
<%=request.getContextPath()%>/bookdetails?bookId=
<%=bd.getBookId()%>"><%=bd.getTitle()%></a></strong>
</td>
...
<%
// End of while
}
DatTT-DSE-SOICT-HUST
61
%>

DatTT-DSE-SOICT-HUST

Ví dụ: biên dịch trang JSP


62

Ví dụ: biên dịch trang JSP
public void _jspService(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
response.setContentType(“text/html”);
HttpSession session = request.getSession(true);
JSPWriter out = response.getWriter();

Giả sử ta có đoạn mã JSP như sau:
<H2> sangHTML </H2>
<%= sangExpression() %>
<% sangScriptletCode(); %>

// Static HTML fragment is sent to output stream in “as is” form
out.println(“<H2>sangHTML</H2>”);
// Expression is converted into String and then sent to output
out.println(sangExpression());

DatTT-DSE-SOICT-HUST

63

Declarations









Nằm ngoài phương thức _jspSevice()
Declerations không được truy cập các Implicit objects (VD: đối tượng
HttpSession)

Thường được sử dụng với Expressions hoặc Scriptlets
Để thực hiện thao tác khởi tạo và dọn dẹp trang in JSP
pages, sử dụng declarations để override phương thức
jspInit() và jspDestroy()
Cú pháp:



DatTT-DSE-SOICT-HUST

}

64

Ví dụ (1)

Được sử dụng để định nghĩa các biến hoặc phương thức (sẽ
được chèn vào trong lớp Servlet tương ứng)


// Scriptlet is inserted as Java code within _jspService()
sangScriptletCode();
...

<H1>Some heading</H1>
<%!
private String randomHeading() {
return(“<H2>” + Math.random() + “</H2>”);
}
%>
<%= randomHeading() %>

<%! Mã nguồn khai báo biến hoặc phương thức %>
<jsp:declaration> Mã nguồn khai báo biến hoặc phương thức
</jsp:declaration>
DatTT-DSE-SOICT-HUST

65

DatTT-DSE-SOICT-HUST

66

11
9/10/2011

Ví dụ (2): Servlet tương ứng

Ví dụ: Declaration

public class xxxx implements HttpJSPPage {
private String randomHeading() {
return(“<H2>” + Math.random() + “</H2>”);
}

}

<%!
private BookDBAO bookDBAO;
public void jspInit() {
...
}
public void jspDestroy() {
...
}
%>

public void _jspService(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
response.setContentType(“text/html”);
HttpSession session = request.getSession(true);
JSPWriter out = response.getWriter();
out.println(“<H1>Some heading</H1>”);
out.println(randomHeading());
...
}
...
DatTT-DSE-SOICT-HUST

67

DatTT-DSE-SOICT-HUST

68

Tại sao nên sử dụng cú pháp XML?



Hỗ trợ từ JSP 1.2
Ví dụ






Including và Forwarding tới tài
nguyên Web khác

<jsp:expression>Expression</jsp:expression>
<jsp:scriptlet> Java code</jsp:scriptlet>
<jsp:declaration> declaration code </jsp:declaration>

Lợi ích



XML validation (qua XML schema)
Có sẵn nhiều công cụ XML




editor
transformer
Java APIs
DatTT-DSE-SOICT-HUST

69

DatTT-DSE-SOICT-HUST

Include Directive

Including các Contents trong 1 trang JSP


Có 2 kỹ thuật để đính kèm (including) một
tài nguyên Web (Web resource) trong 1
trang JSP






Sử dụng include directive
Sử dụng phần tử jsp:include





Được xử lý khi trang JSP được dịch thành Servlet
Hoạt động của directive là chèn text chứa trong file
khác (hoặc nội dung tĩnh hoặc 1 trang JSP khác)
vào trong trang JSP đang xét
Thường được dùng để đính kèm các thông tin
banner, copyright, hoặc bất kỳ nội dung nào để tái
sử dụng cho các trang khác
Cú pháp



DatTT-DSE-SOICT-HUST

70

71

<%@ include file="filename" %>
<%@ include file="banner.jsp" %>
DatTT-DSE-SOICT-HUST

72

12
9/10/2011

Phần tử jsp:include



Được xử lý khi thực thi 1 trang JSP
Cho phép chèn tài nguyên tĩnh/động vào 1 file JSP






Sử dụng kỹ thuật nào?


static: Nội dung của resource được chèn vào file JSP
đang xét
dynamic: Một yêu cầu được gửi tới resource cần được
đính kèm, trang cần đính kèm (included page) sẽ được
thực thi, và kết quả sẽ được đính vào response rồi trả về
cho trang JSP ban đầu







Cú pháp



<jsp:include page="includedPage" />
<jsp:include page="date.jsp"/>
DatTT-DSE-SOICT-HUST

Sử dụng include directive nếu file ít khi thay
đổi
Nhanh hơn jsp:include

Sử dụng jsp:include cho nội dung thay đổi
thường xuyên
Sử dụng jsp:include khi chưa quyết định
được sẽ đính kèm trang nào cho đến khi
main page được request

73

DatTT-DSE-SOICT-HUST

74

Forward tới Web component khác



Cùng cơ chế như trong Servlet
Cú pháp

Directives

<jsp:forward page="/main.jsp" />


Đói tượng request ban đầu sẽ được chuyển
cho trang đích. Có thể đính thêm các tham
số mới
<jsp:forward page="..." >
<jsp:param name="param1" value="value1"/>
</jsp:forward>
DatTT-DSE-SOICT-HUST

75

DatTT-DSE-SOICT-HUST

Directives





3 loại Directives

Directives là các thông điệp (messages)
chuyển đến JSP container hướng dẫn cách
biên dịch trang JSP
Không sinh ra output
Cú pháp


76



page: Các thuộc tính của trang JSP








<%@ directive {attr=value}* %>

77

<%@ include file="header.html" %>

Taglib: Chỉ ra 1 thư viện thẻ mà JSP container cần
phải interpret


DatTT-DSE-SOICT-HUST

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

include: Được sử dụng để đính kèm text/mã nguồn
khi dịch trang JSP thành Servlet

<%@ taglib uri="mytags" prefix="codecamp" %>

DatTT-DSE-SOICT-HUST

78

13
9/10/2011

Page Directives




Implicit Objects

Đưa thêm các thông tin vào Servlet biên dịch từ
trang JSP tương ứng
Cho phép điều khiển






Import các class nào




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



Loại MIME sinh ra là gì



Một trang JSP có thể truy cập tới các implicit
objects
Được tạo bởi container
Tương ứng với các lớp định nghĩa trong
Servlet (đã học ở bài trước)

Xử lý đa luồng như thế nào








<%@ page contentType="MIME-Type" %>
<%@ page isThreadSafe="true" %> <%!--Default --%>
<%@ page isThreadSafe="false" %>

Xử lý các lỗi không mong đợi như thế nào


<%@ page errorPage="errorpage.jsp" %>
DatTT-DSE-SOICT-HUST

79

DatTT-DSE-SOICT-HUST

80

Implicit Objects








request (HttpServletRequest)
response (HttpServletRepsonse)
session (HttpSession)
application(ServletContext)
out (of type JspWriter)
config (ServletConfig)
pageContext
DatTT-DSE-SOICT-HUST

Scope Objects

81

Các loại Scope

DatTT-DSE-SOICT-HUST

82

Session và Application Scope
Client 1

server

Session 1

Session ID 1

Client 2

Session ID 2

Session 2

Client 1

server

application
Client 2

DatTT-DSE-SOICT-HUST

83

DatTT-DSE-SOICT-HUST

84

14
9/10/2011

Session, Request, Page Scope

7. JavaBeans Components

DatTT-DSE-SOICT-HUST

85

DatTT-DSE-SOICT-HUST

JavaBeans là gì?










Quy ước thiết kế JavaBeans

Các lớp Java classes có thể được tái sử dụng trong
các ứng dụng
Bất kỳ Java class nào tuân theo các quy định thiết
kế đều thành một JavaBeans









Trong 1 trang JSP, có thể khởi tạo các Beans và
truy cập/thiết lập (get/set) các thuộc tính của nó
JavaBeans có thể chứa các xử lý nghiệp vụ/truy câp
database (business logic/data base access logic)





87

Read/write, read-only, hoặc write-only
Kiểu đơn hoặc kiểu mảng

Các thuộc tính được truy cập/thiết lập qua
phương thức getXxx và setXxx


PropertyClass getProperty() { ... }
PropertyClass setProperty() { ... }

JavaBeans phải có constructor mặc định
DatTT-DSE-SOICT-HUST

88

Tại sao sử dụng JavaBeans trong các
trang JSP?

Ví dụ: JavaBeans
public class Currency {
private Locale locale;
private double amount;
public Currency() {
locale = null;
amount = 0.0;
}
public void setLocale(Locale l) {
locale = l;
}
public void setAmount(double a) {
amount = a;
}
public String getFormat() {
NumberFormat nf =
NumberFormat.getCurrencyInstance(locale);
return nf.format(amount);
}
DatTT-DSE-SOICT-HUST
}

JavaBeans có các thuộc tính (properties)
Một thuộc tính có thể là


Quy định về các thuộc tính của lớp
Quy định về phương thức public get, set của các thuộc
tính

DatTT-DSE-SOICT-HUST

86



89

Một trang JSP có thể tạo và sử dụng bất kỳ
đối tượng Java nào trong 1 declaration hoặc
scriptlet như sau:

<%
ShoppingCart cart =
(ShoppingCart)session.getAttribute("cart");
// If the user has no cart, create a new one
if (cart == null) {
cart = new ShoppingCart();
session.setAttribute("cart", cart);
}
DatTT-DSE-SOICT-HUST
90
%>

15
9/10/2011

Tại sao sử dụng JavaBeans trong các
trang JSP?


So sánh 2 đoạn code

Các trang JSP pages sử dụng phần tử JSP để
tạo và truy nhập đối tượng JavaBean
<jsp:useBean id="cart“
class="cart.ShoppingCart“ scope="session"/>



Tác dụng:




<%
ShoppingCart cart = (ShoppingCart)session.getAttribute("cart");
// If the user has no cart object as an attribute in Session scope
// object, then create a new one. Otherwise, use the existing
// instance.
if (cart == null) {
cart = new ShoppingCart();

Tạo 1 thể hiện của lớp “ShoppingCart” nếu chưa
tổn tại, lưu trữ làm 1 thuộc tính của đối tượng
session
Bean được tạo được truy cập trên toàn session
với id là “cart”
DatTT-DSE-SOICT-HUST

session.setAttribute("cart", cart);
}
%>
versus
<jsp:useBean id="cart" class="cart.ShoppingCart"
scope="session"/>
91

DatTT-DSE-SOICT-HUST

Tại sao sử dụng JavaBeans trong các
trang JSP?








Tạo một JavaBeans

Người thiết kế trang Web không cần học
Java
Tách biệt rõ ràng giữa content và
presentation
Tái sử dụng mã nguồn hiệu quả
Chia sẻ đối tượng dễ dàng (cơ chế built-in)
Thuận tiện khi đọc tham số vào (request
parameters) và chuyển thành các thuộc tính
của 1 đối tượng (ví dụ ở fần sau)
DatTT-DSE-SOICT-HUST



Trang JSP khai báo sử dụng bean có tầm vực nào
đó với phần tử jsp:useBean
<jsp:useBean id="beanName"
class="fully_qualified_classname"
scope="scope"/>



Hoặc
<jsp:useBean id="beanName"
class="fully_qualified_classname"
scope="scope">
<jsp:setProperty .../>
</jsp:useBean>

93

DatTT-DSE-SOICT-HUST

Thiết lập thuộc tính cho JavaBeans













<jsp:setProperty name="beanName"
property="propName" value="string constant"/>
“beanName” phải trùng với id chỉ ra trong phần
tử useBean
Phải có phương thức setPropName trong Bean
DatTT-DSE-SOICT-HUST

Cú pháp jsp:setProperty phụ thuộc vào đầu vào của
thuộc tính


<% beanName.setPropName(value); %>

Qua JSP:setProperty


94

Thiết lập thuộc tính cho JavaBeans

2 cách thiết lập thuộc tính cho bean
Qua scriptlet


92

95






<jsp:setProperty name="beanName"
property="propName" value="string constant"/>
<jsp:setProperty name="beanName"
property="propName" param="paramName"/>
<jsp:setProperty name="beanName"
property="propName"/>
<jsp:setProperty name="beanName" property="*"/>
<jsp:setProperty name="beanName"
property="propName" value="<%= expression %>"/>
DatTT-DSE-SOICT-HUST

96

16
9/10/2011

Ví dụ: jsp:setProperty với đầu vào là
Request parameter

Ví dụ: jsp:setProperty với đầu vào là 1
Expression

<jsp:setProperty name="bookDB" property="bookId"/>

<jsp:useBean id="currency" class="util.Currency"
scope="session">
<jsp:setProperty name="currency" property="locale"

tương đương với

value="<%= request.getLocale() %>"/>
</jsp:useBean>

<%
//Get the identifier of the book to display

<jsp:setProperty name="currency" property="amount"

String bookId = request.getParameter("bookId");

value="<%=cart.getTotal()%>"/>

bookDB.setBookId(bookId);
...
%>
DatTT-DSE-SOICT-HUST

97

DatTT-DSE-SOICT-HUST

Truy cập thuộc tính của JavaBeans và
convert thành String rồi chèn vào out

Truy cập các thuộc tính của JavaBeans


2 cách truy cập 1 thuộc tính của bean:






CONVERT giá trị thuộc tính thành String và chèn
giá trị vào đối tượng “out” (implicit object)
Lấy giá trị của thuộc tính mà KHÔNG cần chuyển
thành String và chèn vào đối tượng “out”

2 cách


Qua scriptlet



Qua JSP:setProperty









99

Truy cập thuộc tính của JavaBeans mà
không convert thành String



<jsp:getProperty name="beanName" property="propName"/>

“beanName” phải trùng với thuộc tính id trong phần tử
useBean lúc khai báo
Phải có phương thức “getPropName()” trong bean

DatTT-DSE-SOICT-HUST

100

Truy cập đối tượng trong trang JSP

Phải sử dụng scriptlet
Cú pháp:



<%= beanName.getPropName() %>

Yêu cầu


DatTT-DSE-SOICT-HUST

98

Ví dụ:



<% Object o = beanName.getPropName(); %>
<%
// Print a summary of the shopping cart
int num = cart.getNumberOfItems();
if (num > 0) {
%>
DatTT-DSE-SOICT-HUST

101

DatTT-DSE-SOICT-HUST

102

17
9/10/2011

Tạo trang thông báo lỗi



8. Xử lý lỗi

Xác định ngoại lệ được tung ra
Với mỗi trang JSP, thêm directive sau








103

Ví dụ: initdestroy.jsp

<%= exception.toString() %>
DatTT-DSE-SOICT-HUST

104

Example: errorpage.jsp
<%@ page isErrorPage="true" %>
<%@ page import="java.util.*" %>
<%
ResourceBundle messages =
(ResourceBundle)session.getAttribute("messages");
if (messages == null) {
Locale locale=null;
String language = request.getParameter("language");

<%@ page import="database.*" %>
<%@ page errorPage="errorpage.jsp" %>
<%!
private BookDBAO bookDBAO;
public void jspInit() {
// retrieve database access object, which was set once per web application
bookDBAO =
(BookDBAO)getServletContext().getAttribute("bookDB");
if (bookDBAO == null)
System.out.println("Couldn't get database.");

if (language != null) {
if (language.equals("English")) {
locale=new Locale("en", "");
} else {
locale=new Locale("es", "");
}
} else
locale=new Locale("en", "");

}
public void jspDestroy() {
bookDBAO = null;
}
%>
DatTT-DSE-SOICT-HUST

<%@ page isErrorPage="true" %>

Trong error page, sử dụng đối tượng
exception để hiển thị thôgn tin


DatTT-DSE-SOICT-HUST

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

Viết 1 trang thông báo lỗi (error page), nên
có directive sau

105

messages = ResourceBundle.getBundle("BookStoreMessages", locale);
session.setAttribute("messages", messages);
}
DatTT-DSE-SOICT-HUST
106
%> ...

Example: errorpage.jsp
... (continued)
<html>
<head>
<title><%=messages.getString("ServerError")%></title>
</head>
<body bgcolor="white">
<h3>
<%=messages.getString("ServerError")%>
</h3>
<p>
<%= exception.getMessage() %>
</body>
</html>

DatTT-DSE-SOICT-HUST

9. Ví dụ: Date website

107

DatTT-DSE-SOICT-HUST

108

18
9/10/2011

9. Ví dụ: Date website -output

9. Ví dụ: Date website
<%@ page import="java.util.*" %>
<%@ page import="MyLocales" %>
<%@ page contentType="text/html; charset=ISO-8859-5" %>
<html>
<head><title>Localized Dates</title></head>
<body bgcolor="white">
<jsp:useBean id="locales" scope="application" class="MyLocales"/>
<form name="localeForm" action="index.jsp" method="post">
<b>Locale:</b>

DatTT-DSE-SOICT-HUST

109

9. Ví dụ: Date website

110

9. Ví dụ: Date website

<select name=locale>
<%
Iterator i = locales.getLocaleNames().iterator();
String selectedLocale = request.getParameter("locale");
while (i.hasNext()) {
String locale = (String)i.next();
if (selectedLocale != null && selectedLocale.equals(locale) ) { %>
<option selected><%=locale%></option>
<%} else { %>
<option><%=locale%></option>
<%}
}%>
</select>
<input type="submit" name="Submit" value="Get Date">
</form>

DatTT-DSE-SOICT-HUST

DatTT-DSE-SOICT-HUST

111

<p>
<jsp:include page="date.jsp" flush="true" />
</body>
</html>

DatTT-DSE-SOICT-HUST

112

19

Weitere ähnliche Inhalte

Was ist angesagt?

Android Training (Storing & Shared Preferences)
Android Training (Storing & Shared Preferences)Android Training (Storing & Shared Preferences)
Android Training (Storing & Shared Preferences)Khaled Anaqwa
 
Node JS Crash Course
Node JS Crash CourseNode JS Crash Course
Node JS Crash CourseHaim Michael
 
Jquery ppt
Jquery pptJquery ppt
Jquery ppt044249
 
What is dotnet (.NET) ?
What is dotnet (.NET) ?What is dotnet (.NET) ?
What is dotnet (.NET) ?Talha Shahzad
 
AWS와 부하테스트의 절묘한 만남 :: 김무현 솔루션즈 아키텍트 :: Gaming on AWS 2016
AWS와 부하테스트의 절묘한 만남 :: 김무현 솔루션즈 아키텍트 :: Gaming on AWS 2016AWS와 부하테스트의 절묘한 만남 :: 김무현 솔루션즈 아키텍트 :: Gaming on AWS 2016
AWS와 부하테스트의 절묘한 만남 :: 김무현 솔루션즈 아키텍트 :: Gaming on AWS 2016Amazon Web Services Korea
 
Introduction to the Microsoft Bot Framework v4
Introduction to the Microsoft Bot Framework v4Introduction to the Microsoft Bot Framework v4
Introduction to the Microsoft Bot Framework v4Bob German
 
Spring integration을 통해_살펴본_메시징_세계
Spring integration을 통해_살펴본_메시징_세계Spring integration을 통해_살펴본_메시징_세계
Spring integration을 통해_살펴본_메시징_세계Wangeun Lee
 
Hacking the browser with puppeteer sharp .NET conf AR 2018
Hacking the browser with puppeteer sharp .NET conf AR 2018Hacking the browser with puppeteer sharp .NET conf AR 2018
Hacking the browser with puppeteer sharp .NET conf AR 2018Darío Kondratiuk
 
Hexagonal architecture with Spring Boot
Hexagonal architecture with Spring BootHexagonal architecture with Spring Boot
Hexagonal architecture with Spring BootMikalai Alimenkou
 
Hibernate Presentation
Hibernate  PresentationHibernate  Presentation
Hibernate Presentationguest11106b
 
CQRS and Event Sourcing in a Symfony application
CQRS and Event Sourcing in a Symfony applicationCQRS and Event Sourcing in a Symfony application
CQRS and Event Sourcing in a Symfony applicationSamuel ROZE
 
Fluentd v0.14 Plugin API Details
Fluentd v0.14 Plugin API DetailsFluentd v0.14 Plugin API Details
Fluentd v0.14 Plugin API DetailsSATOSHI TAGOMORI
 
Vert.x for Microservices Architecture
Vert.x for Microservices ArchitectureVert.x for Microservices Architecture
Vert.x for Microservices ArchitectureIdan Fridman
 
Intro to web services
Intro to web servicesIntro to web services
Intro to web servicesNeil Ghosh
 

Was ist angesagt? (20)

Servlet by Rj
Servlet by RjServlet by Rj
Servlet by Rj
 
Android Training (Storing & Shared Preferences)
Android Training (Storing & Shared Preferences)Android Training (Storing & Shared Preferences)
Android Training (Storing & Shared Preferences)
 
Node JS Crash Course
Node JS Crash CourseNode JS Crash Course
Node JS Crash Course
 
Jquery ppt
Jquery pptJquery ppt
Jquery ppt
 
What is dotnet (.NET) ?
What is dotnet (.NET) ?What is dotnet (.NET) ?
What is dotnet (.NET) ?
 
Fetch API Talk
Fetch API TalkFetch API Talk
Fetch API Talk
 
AWS와 부하테스트의 절묘한 만남 :: 김무현 솔루션즈 아키텍트 :: Gaming on AWS 2016
AWS와 부하테스트의 절묘한 만남 :: 김무현 솔루션즈 아키텍트 :: Gaming on AWS 2016AWS와 부하테스트의 절묘한 만남 :: 김무현 솔루션즈 아키텍트 :: Gaming on AWS 2016
AWS와 부하테스트의 절묘한 만남 :: 김무현 솔루션즈 아키텍트 :: Gaming on AWS 2016
 
Introduction to the Microsoft Bot Framework v4
Introduction to the Microsoft Bot Framework v4Introduction to the Microsoft Bot Framework v4
Introduction to the Microsoft Bot Framework v4
 
Spring integration을 통해_살펴본_메시징_세계
Spring integration을 통해_살펴본_메시징_세계Spring integration을 통해_살펴본_메시징_세계
Spring integration을 통해_살펴본_메시징_세계
 
Bootstrap
BootstrapBootstrap
Bootstrap
 
RESTful Web Services
RESTful Web ServicesRESTful Web Services
RESTful Web Services
 
React js
React jsReact js
React js
 
Hacking the browser with puppeteer sharp .NET conf AR 2018
Hacking the browser with puppeteer sharp .NET conf AR 2018Hacking the browser with puppeteer sharp .NET conf AR 2018
Hacking the browser with puppeteer sharp .NET conf AR 2018
 
Hexagonal architecture with Spring Boot
Hexagonal architecture with Spring BootHexagonal architecture with Spring Boot
Hexagonal architecture with Spring Boot
 
Hibernate Presentation
Hibernate  PresentationHibernate  Presentation
Hibernate Presentation
 
Hexagonal architecture in PHP
Hexagonal architecture in PHPHexagonal architecture in PHP
Hexagonal architecture in PHP
 
CQRS and Event Sourcing in a Symfony application
CQRS and Event Sourcing in a Symfony applicationCQRS and Event Sourcing in a Symfony application
CQRS and Event Sourcing in a Symfony application
 
Fluentd v0.14 Plugin API Details
Fluentd v0.14 Plugin API DetailsFluentd v0.14 Plugin API Details
Fluentd v0.14 Plugin API Details
 
Vert.x for Microservices Architecture
Vert.x for Microservices ArchitectureVert.x for Microservices Architecture
Vert.x for Microservices Architecture
 
Intro to web services
Intro to web servicesIntro to web services
Intro to web services
 

Ähnlich wie Bai 09 Basic jsp

Bai4 basic jsp_4474
Bai4 basic jsp_4474Bai4 basic jsp_4474
Bai4 basic jsp_4474Ham Chơi
 
Bai1 gioi thieu_servlet_va_jsp_8952
Bai1 gioi thieu_servlet_va_jsp_8952Bai1 gioi thieu_servlet_va_jsp_8952
Bai1 gioi thieu_servlet_va_jsp_8952Ham Chơi
 
Tổng quan về jsp​
Tổng quan về jsp​Tổng quan về jsp​
Tổng quan về jsp​truong nguyen
 
JavaScript (Tieng viet)
JavaScript (Tieng viet)JavaScript (Tieng viet)
JavaScript (Tieng viet)Park Ji Hưng
 
Giao trinh java_script
Giao trinh java_scriptGiao trinh java_script
Giao trinh java_scriptnmphuong91
 
Giao trinh java_script (1)
Giao trinh java_script (1)Giao trinh java_script (1)
Giao trinh java_script (1)duynamit
 
Giao trinh asp.ne_tvoi_csharp
Giao trinh asp.ne_tvoi_csharpGiao trinh asp.ne_tvoi_csharp
Giao trinh asp.ne_tvoi_csharpngohanty13
 
Java script dh bk share-book.com
Java script dh bk   share-book.comJava script dh bk   share-book.com
Java script dh bk share-book.comphongbk1609
 
Tu hoc microsoft asp.net
Tu hoc microsoft asp.netTu hoc microsoft asp.net
Tu hoc microsoft asp.netnamhh1984ag
 
Bai2 tong quan_mvc_0567
Bai2 tong quan_mvc_0567Bai2 tong quan_mvc_0567
Bai2 tong quan_mvc_0567Ham Chơi
 
Bai3 basic servlets_956
Bai3 basic servlets_956Bai3 basic servlets_956
Bai3 basic servlets_956Ham Chơi
 
Giao trinh java script
Giao trinh java scriptGiao trinh java script
Giao trinh java scripthieusy
 
Ebook học Javascript cơ bản tới nâng cao
Ebook học Javascript cơ bản tới nâng caoEbook học Javascript cơ bản tới nâng cao
Ebook học Javascript cơ bản tới nâng caoTrung Thanh Nguyen
 
Asp net
Asp netAsp net
Asp netquanvn
 

Ähnlich wie Bai 09 Basic jsp (20)

Bai4 basic jsp_4474
Bai4 basic jsp_4474Bai4 basic jsp_4474
Bai4 basic jsp_4474
 
JSP and Database
JSP and DatabaseJSP and Database
JSP and Database
 
Bai1 gioi thieu_servlet_va_jsp_8952
Bai1 gioi thieu_servlet_va_jsp_8952Bai1 gioi thieu_servlet_va_jsp_8952
Bai1 gioi thieu_servlet_va_jsp_8952
 
Tổng quan về jsp​
Tổng quan về jsp​Tổng quan về jsp​
Tổng quan về jsp​
 
JavaScript (Tieng viet)
JavaScript (Tieng viet)JavaScript (Tieng viet)
JavaScript (Tieng viet)
 
Giao trinh java_script
Giao trinh java_scriptGiao trinh java_script
Giao trinh java_script
 
Giáo trình asp.net với c sharp
Giáo trình asp.net với c sharpGiáo trình asp.net với c sharp
Giáo trình asp.net với c sharp
 
Java script
Java scriptJava script
Java script
 
Asp control
Asp controlAsp control
Asp control
 
Giao trinh java_script (1)
Giao trinh java_script (1)Giao trinh java_script (1)
Giao trinh java_script (1)
 
Giao trinh asp.ne_tvoi_csharp
Giao trinh asp.ne_tvoi_csharpGiao trinh asp.ne_tvoi_csharp
Giao trinh asp.ne_tvoi_csharp
 
Java script dh bk share-book.com
Java script dh bk   share-book.comJava script dh bk   share-book.com
Java script dh bk share-book.com
 
Tu hoc microsoft asp.net
Tu hoc microsoft asp.netTu hoc microsoft asp.net
Tu hoc microsoft asp.net
 
Giao trinh java script
Giao trinh java scriptGiao trinh java script
Giao trinh java script
 
Bai2 tong quan_mvc_0567
Bai2 tong quan_mvc_0567Bai2 tong quan_mvc_0567
Bai2 tong quan_mvc_0567
 
Bai3 basic servlets_956
Bai3 basic servlets_956Bai3 basic servlets_956
Bai3 basic servlets_956
 
Giao trinh java script
Giao trinh java scriptGiao trinh java script
Giao trinh java script
 
Ebook học Javascript cơ bản tới nâng cao
Ebook học Javascript cơ bản tới nâng caoEbook học Javascript cơ bản tới nâng cao
Ebook học Javascript cơ bản tới nâng cao
 
Ch06
Ch06Ch06
Ch06
 
Asp net
Asp netAsp net
Asp net
 

Bai 09 Basic jsp

  • 1. 9/10/2011 Nội dung  1. JSP trong kiến trúc J2EE  Bộ môn Công nghệ Phần mềm Viện CNTT & TT Trường Đại học Bách Khoa Hà Nội 2. Giới thiệu về JSP   LẬP TRÌNH WEB HƯỚNG JAVA Bài 09: Cơ bản về JSP    Giảng viên: ThS. Trịnh Tuấn Đạt Bộ môn CNPM Email: trinhtuandat.bk@gmail.com/dattt@soict.hut.edu.vn DatTT-DSE-SOICT-HUST 1   3. Vòng đời của trang JSP 4. Các bước phát triển ứng dụng Web với JSP 5. Kỹ thuật sinh nội dung động với JSP 6. Gọi mã nguồn Java sử dụng JSP scripting elements 7. JavaBeans 8. Xử lý lỗi (Error handling) 9. Ví dụ: Date Website DatTT-DSE-SOICT-HUST 2 JSP & Servlet trong kiến trúc J2EE 1.2 Một công nghệ Web mở rộng, kết hợp với các đối tượng Java, trả về nội dung động cho client dưới dạng HTML hoặc XML. Client thường là Web Browser 1. JSP trong kiến trúc J2EE DatTT-DSE-SOICT-HUST DatTT-DSE-SOICT-HUST 3 Static contents    4 JSP & Servlet - Web Components Thế nào là Static & Dynamic Contents?  Java Servlet: 1 chương trình Java, mở rộng chức năng 1 web server, sinh nội dung động và tương tác với web clients sử dụng mô hình request-response Điển hình là các trang HTML tĩnh Hiển thị như nhau cho tất cả mọi người Dynamic contents   Nội dung được sinh tự động theo 1 số conditions Các Conditions có thể là    Tài khoản người dùng Thời gian Giá trị User nhập vào trên forms hoặc qua lựa chọn DatTT-DSE-SOICT-HUST 5 DatTT-DSE-SOICT-HUST 6 1
  • 2. 9/10/2011 Trang JSP là gì?  Là 1 tài liệu text có thể trả về cả static và dynamic content cho trình duyệt Static content và dynamic content có thể được ghép lẫn với nhau Static content  Dynamic content  2. Giới thiệu về JSP      DatTT-DSE-SOICT-HUST HTML, XML, Text Mã Java Các thuộc tính hiển thị của JavaBeans Các thẻ Custom tags DatTT-DSE-SOICT-HUST 7 Ví dụ trang JSP (Blue: static, Red: Dynamic contents) 8 Kết quả hiển thị <html> <body> Hello World! <br> Current time is <%= new java.util.Date() %> </body> </html> DatTT-DSE-SOICT-HUST 9 DatTT-DSE-SOICT-HUST 10 JSP Servlets 2.1. JSP và Servlet DatTT-DSE-SOICT-HUST HTML code in Java ● Not easy to author ● 11 JSP Java-like code in HTML ● Very easy to author ● Code is compiled into a servlet ● DatTT-DSE-SOICT-HUST 12 2
  • 3. 9/10/2011 Ưu điểm của JSP     Tách biệt nội dung & cách trình bày Đơn giản hóa việc phát triển ứng dụng Web với JSP, JavaBeans và custom tags Hỗ trợ tái sử dụng phần mềm qua các components (JavaBeans, Custom tags) Tự động triển khai    Ưu điểm của JSP so với Servlet?   Sử dụng lệnh println() để sinh các trang HTML  Hạn chế trong bảo trì các trang HTML    Tự biên dịch lại các trạng JSP khi có thay đổi Độc lập playform Dễ dàng hơn cho ngươi thiết kế (không cần hiểu rõ Java) DatTT-DSE-SOICT-HUST Servlets: Khi thay đổi, phải biên dịch lại, (đóng gói lại), deploy lại JSP:  Khắc phục 2 hạn chế trên 13 DatTT-DSE-SOICT-HUST 14 Nên dùng JSP thay cho Servlet hay ngược lại?  Cần khai thác đồng thời 2 công nghệ    Sức mạnh của Servlet là “controlling and dispatching” Sức mạnh của JSP là “displaying” 2.2. Kiến trúc JSP Trong thực tế, cả servlet và JSP được sử dụng trong mẫu thiết kế MVC (Model-ViewController)   Servlet xử lý phần Controller JSP xử lý phần View DatTT-DSE-SOICT-HUST 15 Kiến trúc/Thiết kế ứng dụng Web DatTT-DSE-SOICT-HUST 16 Tách biệt xử lý Request với hiển thị (Presentation) Servlet Request processing Pure Servlet forward(“conf. jsp”); } Public class OrderServlet …{ public void doGet(…){ if( isOrderValid(req)){ saveOrder(req); out.println(“<html>”); out.println(“<body>”); …… private void isOrderValid (….){ …… } Public class OrderServlet …{ public void doGet(…){ …… if(bean.isOrderValid (..)){ bean.saveOrder(….); } JSP presentation private void saveOrder(….){ …… } <html> <body> <ora: loop name =“order”> ….. </ora:loop> <body> </html> JavaBeans } isOrderValid( ) Business logic DatTT-DSE-SOICT-HUST 17 DatTT-DSE-SOICT-HUST saveOrder( ) 18 3
  • 4. 9/10/2011 Kiến trúc JSP 3. Vòng đời của 1 trang JSP DatTT-DSE-SOICT-HUST 19 DatTT-DSE-SOICT-HUST JSP làm việc như thế nào? 20 Các giai đoạn trong vòng đời trang JSP User Request   Server  Translation Compile Execution File JSP Changed ? Create Source Compile Execute Servlet DatTT-DSE-SOICT-HUST 21 DatTT-DSE-SOICT-HUST Giai đoạn Translation/Compilation    Các file JSP được dịch thành mã Servlet. Sau đó mã này mới được biên dịch tiếp Thực hiện tự động nhờ container, ở lần đầu tiên trang JSP được truy cập (hoặc khi chỉnh sửa) Với trang JSP tên là “pageName”, mã dịch sẽ nằm ở   Ví dụ:  Giai đoạn Translation/Compilation   Dữ liệu tính được chuyển thành mã Java, tác động tới output stream trả dữ liệu về cho client Các phần tử JSP được xử lý khác nhau:  <AppServer_HOME>/work/Standard Engine/localhost/context_root/pageName$jsp.java  <AppServer_HOME>/work/Standard Engine/localhost/date/index$jsp.java DatTT-DSE-SOICT-HUST  23 22 Các chỉ dẫn (Directives) được dùng để điều khiển Web container biên dịch và thực thi trang JSP Phần tử Scripting được thêm vào lớp servlet tương ứng của trang JSP Phần tử dạng <jsp:xxx .../> được chuyển thành lời gọi phơng thức tới JavaBeans components DatTT-DSE-SOICT-HUST 24 4
  • 5. 9/10/2011 Khởi tạo trang JSP Các phương thức trong giai đoạn thực thi  Có thể khai báo phương thức khởi tạo thực hiện nhiệm vụ    DatTT-DSE-SOICT-HUST 25 DatTT-DSE-SOICT-HUST Kết thúc trang JSP    26 Ví dụ: initdestroy.jsp Khai báo phương thức thực hiện nhiệm vụ  Đọc tham số cấu hình Khởi tạo tài nguyên Thực hiện bất kỳ công việc khởi tạo nào khác bằng việc override phương thức jspInit() của giao diện JspPage Đọc tham số cấu hình Giải phóng tài nguyên Thực hiện bất kỳ công việc dọn dẹp nào bằng cách override phương thức jspDestroy() của giao diện JspPage <%@ page import="database.*" %> <%@ page errorPage="errorpage.jsp" %> <%-- Declare initialization and finalization methods using JSP declaration --%> <%! private BookDBAO bookDBAO; public void jspInit() { // retrieve database access object, which was set once per web application bookDBAO = (BookDBAO)getServletContext().getAttribute("bookDB"); if (bookDBAO == null) System.out.println("Couldn't get database."); } DatTT-DSE-SOICT-HUST 27 public void jspDestroy() { bookDBAO = null; } %> DatTT-DSE-SOICT-HUST 28 3. Các bước phát triển và triển khai ứng dụng Web  4. Các bước phát triển ứng dụng Web với JSP   (Xem lại bài trước)   Viết code (và biên dịch) cho các Web component (Servlet or JSP), các helper classes sử dụng trong web component Tạo các tài nguyên tĩnh (Images, các trang HTML) Viết file deployment descriptor (web.xml) Build ứng dụng Web (Tạo file *.war hoặc thư mục dạng chưa đóng gói nhưng triển khai được) Triển khai ứng dụng Web trên 1 Web container  DatTT-DSE-SOICT-HUST 29 Web clients có thể truy cập ứng dụng qua URL DatTT-DSE-SOICT-HUST 30 5
  • 6. 9/10/2011 GreetingServlet.java (1) import import import import import So sánh Hello1 Servlet & Hello2 JSP java.io.*; java.util.*; java.sql.*; javax.servlet.*; javax.servlet.http.*; /** * This is a simple example of an HTTP Servlet. It responds to the GET * method of the HTTP protocol. */ public class GreetingServlet extends HttpServlet { public void doGet (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); response.setBufferSize(8192); PrintWriter out = response.getWriter(); // then write the data of the response out.println("<html>" + "<head><title>Hello</title></head>"); DatTT-DSE-SOICT-HUST DatTT-DSE-SOICT-HUST 31 GreetingServlet.java (2) 32 GreetingServlet.java (3) // then write the data of the response out.println("<body bgcolor="#ffffff">" + "<img src="duke.waving.gif">" + "<h2>Hello, my name is Duke. What's yours?</h2>" + "<form method="get">" + "<input type="text" name="username" size="25">" + "<p></p>" + "<input type="submit" value="Submit">" + "<input type="reset" value="Reset">" + "</form>"); public String getServletInfo() { return "The Hello servlet says hello."; } } String username = request.getParameter("username"); // dispatch to another web resource if ( username != null && username.length() > 0 ) { RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/response"); if (dispatcher != null) dispatcher.include(request, response); } out.println("</body></html>"); out.close(); } DatTT-DSE-SOICT-HUST 33 DatTT-DSE-SOICT-HUST greeting.jsp 34 ResponseServlet.java <html> <head><title>Hello</title></head> <body bgcolor="white"> <img src="duke.waving.gif"> <h2>My name is Duke. What is yours?</h2> import import import import import java.io.*; java.util.*; java.sql.*; javax.servlet.*; javax.servlet.http.*; <form method="get"> <input type="text" name="username" size="25"> <p></p> <input type="submit" value="Submit"> <input type="reset" value="Reset"> </form> // This is a simple example of an HTTP Servlet. It responds to the GET // method of the HTTP protocol. public class ResponseServlet extends HttpServlet { public void doGet (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ PrintWriter out = response.getWriter(); <% String username = request.getParameter("username"); if ( username != null && username.length() > 0 ) { // then write the data of the response String username = request.getParameter("username"); if ( username != null && username.length() > 0 ) out.println("<h2>Hello, " + username + "!</h2>"); %> <%@include file="response.jsp" %> <% } %> </body> </html> } public String getServletInfo() { return "The Response servlet says hello."; } DatTT-DSE-SOICT-HUST 35 } DatTT-DSE-SOICT-HUST 36 6
  • 7. 9/10/2011 response.jsp <h2><font color="black">Hello, <%=username%>!</font></h2> JSP “là” Servlet! DatTT-DSE-SOICT-HUST 37 DatTT-DSE-SOICT-HUST greeting$jsp.java (1) JSP là “Servlet”    package org.apache.jsp; Các trang JSP được dịch thành servlet  import import import import Tomcat biên dịch greeting.jsp thành greeting$jsp.java Scriptlet (Java code) trong trang JSP sẽ được chèn vào trong phương thức jspService() của servlet tương ứng Các đối tượng Servlet có thể được truy cập từ trang JSP, mã nguồn phát triển JavaBeans, hoặc custom tag. DatTT-DSE-SOICT-HUST 38 javax.servlet.*; javax.servlet.http.*; javax.servlet.jsp.*; org.apache.jasper.runtime.*; public class greeting$jsp extends HttpJspBase { static { } public greeting$jsp( ) { } private static boolean _jspx_inited = false; public final void _jspx_init() throws org.apache.jasper.runtime.JspException { } 39 greeting$jsp.java (2) DatTT-DSE-SOICT-HUST 40 greeting$jsp.java (3) public void _jspService(HttpServletRequest request, HttpServletResponse response) throws java.io.IOException, ServletException { try { if (_jspx_inited == false) { synchronized (this) { if (_jspx_inited == false) { _jspx_init(); _jspx_inited = true; } } } _jspxFactory = JspFactory.getDefaultFactory(); response.setContentType("text/html;charset=ISO-8859-1"); pageContext = _jspxFactory.getPageContext(this, request, response,"", true, 8192, true); JspFactory _jspxFactory = null; PageContext pageContext = null; HttpSession session = null; ServletContext application = null; ServletConfig config = null; JspWriter out = null; Object page = this; String _value = null; application = pageContext.getServletContext(); config = pageContext.getServletConfig(); session = pageContext.getSession(); out = pageContext.getOut(); DatTT-DSE-SOICT-HUST 41 DatTT-DSE-SOICT-HUST 42 7
  • 8. 9/10/2011 greeting$jsp.java (4) greeting$jsp.java (5) // HTML // begin [file="/greeting.jsp";from=(38,4);to=(53,0)] out.write("nn<html>n<head><title>Hello</title></head>n<body bgcolor="white">n<img src="duke.waving.gif"> n<h2>My name is Duke. What is yours?</h2>nn<form method="get">n<input type="text" name="username" size="25">n<p></p>n<input type="submit" value="Submit">n<input type="reset" value="Reset">n</form>nn"); // HTML // begin [file="/response.jsp";from=(40,44);to=(55,0)] out.write("!</font></h2>nnnnnnnnnnnnnnn"); // end // HTML // begin [file="/greeting.jsp";from=(57,37);to=(58,0)] out.write("n"); // end // begin [file="/greeting.jsp";from=(53,2);to=(56,0)] // end // begin [file="/greeting.jsp";from=(58,2);to=(60,0)] String username = request.getParameter("username"); if ( username != null && username.length() > 0 ) { // end // HTML // begin [file="/greeting.jsp";from=(56,2);to=(57,4)] out.write("n "); } // end // HTML // begin [file="/greeting.jsp";from=(60,2);to=(63,0)] out.write("n</body>n</html>n"); // end } catch (Throwable t) { if (out != null && out.getBufferSize() != 0) out.clearBuffer(); if (pageContext != null) pageContext.handlePageException(t); } finally { if (_jspxFactory != null) _jspxFactory.releasePageContext(pageContext); } // end // HTML // begin [file="/response.jsp";from=(38,4);to=(40,31)] out.write("nn<h2><font color="black">Hello, "); // end // begin [file="/response.jsp";from=(40,34);to=(40,42)] out.print(username); // end DatTT-DSE-SOICT-HUST } 43 } DatTT-DSE-SOICT-HUST 44 5. Kỹ thuật sinh nội dung động với công nghệ JSP  5. Kỹ thuật sinh nội dung động trong JSP Có thể áp dụng các kỹ thuật khác nhau, tùy các yếu tố sau    DatTT-DSE-SOICT-HUST Có đầy đủ các kỹ thuật từ đơn giản tới phức tạp DatTT-DSE-SOICT-HUST 45 5. Kỹ thuật sinh nội dung động với công nghệ JSP        Gọi mã Java trực tiếp trong JSP Gọi mã Java gián tiếp trong JSP Sử dụng JavaBeans Tự phát triển và sử dụng các custom tags Sử dụng 3rd-party custom tags hoặc JSTL (JSP Standard Tag Library) Sử dụng mẫu thiết kế MVC Sử dụng Model2 frameworks đã được kiểm chứng DatTT-DSE-SOICT-HUST Kích thước, độ phức tạp của project Yêu cầu về tái sử dụng code, bảo trì, … 46 (a) Gọi mã Java trực tiếp   Đặt tất cả mã nguồn Java trong trang JSP Chỉ phù hợp với ứng dụng Web đơn giản     Không nền dùng với loại ứng dụng Web tương ôối phức tạp  47 Khó bảo trì Khó tái sử dụng Khó hiểu Phân tách giữa contents và presentation là chưa rõ ràng DatTT-DSE-SOICT-HUST 48 8
  • 9. 9/10/2011 (b) Gọi mã Java gián tiếp      (c) Sử dụng JavaBeans Phát triển các lớp tiện ích độc lập Chàn vào trang JSP mã nguồn Java gọi đến các lớp tiện ích Tốt hơn cách 1: phân tách tốt hơn phần sinh nội dung với phần presentation Tái sử dụng, bảo trì tốt hơn so với cách 1 Tuy nhiên, sự tách biệt giữa contents và presentation vẫn chưa rõ ràng DatTT-DSE-SOICT-HUST     Phát triển các lớp tiện ích dưới dạng JavaBeans Khai thác được các hỗ trợ của JSP cho JavaBeans Dễ sử dụng hơn với người phát triển Web Dễ tái sử dụng, bảo trì hơn 2 cách đầu 49 DatTT-DSE-SOICT-HUST (e) Sử dụng 3rd-party custom tags hoặc JSTL (d) Phát triển và sử dụng các Custom Tags  Phát triển các components gọi là các custom tags       Custom tags được thiết kế đặc biệt cho JSP  (JavaBeans: chỉ có phương thức getter & setter) Tái sử dụng, bảo trì tốt hơn, ổn định hơn Tuy nhiên, phát triển custom tags khó hơn tạo các JavaBeans DatTT-DSE-SOICT-HUST Có nhiều custom tags mã nguồn mở/thương mại  Mạnh mẽ hơn JavaBeans component  51 Tuân theo mẫu thiết kế MVC     Với vai trò developer hoặc deployer, cần đảm bảo có đủ các custom tags này (Từ phiên bản J2EE 1.3) DatTT-DSE-SOICT-HUST 52 (g) Sử dụng các MVC Model2 Frameworks đã kiểm chứng  Model: sử dụng các công nghệ sẵn có khác (JDBC, hibernate, ...) View: sử dụng JSP Controller: sử dụng Servlet Ví dụ: Apache Struts JSTL (JSP Standard Tag Library) chuẩn hóa tập các custom tags tối thiểu cho Java EE (f) Thiết kế/Sử dụng mẫu MVC  50 Có rất nhiều lựa chọn    Apache Struts JavaServer Faces (JSF) Các framework khác: Echo, Tapestry, WebWorks, Wicket Tự thiết kế/tạo mẫu kiến trúc MVC:  Khó khăn, không nên làm (Nên sử dụng sẵn) DatTT-DSE-SOICT-HUST 53 DatTT-DSE-SOICT-HUST 54 9
  • 10. 9/10/2011 JSP Scripting Elements  6. Gọi mã nguồn Java sử dụng JSP scripting elements   Cho phép chèn mã nguồn Java vào servlet được sinh tương ứng cho trang JSP Nên GiẢM THIỂU sử dụng JSP scripting elements trong trang JSP nếu có thể Có 3 dạng:    DatTT-DSE-SOICT-HUST DatTT-DSE-SOICT-HUST 55 Expressions       Expression được tính giá trị và chuyển thành một String String sau đó được chèn trực tiếp vào output stream của Servlet tương ứng Kết quả tương đương với lệnh out.println(expression) Có thể sử dụng các biến định nghĩa trước đó (implicit objects) trong 1 expression Hiển thị thời gian hiện tại sử dụng lớp Date  Hiển thị 1 số ngẫu nhiên sử dụng lớp Math  Sử dụng các implicit objects     Cú pháp    <%= Expression %> hoặc <jsp:expression>Expression</jsp:expression> KHÔNG được dùng dấu ; trong các expressions DatTT-DSE-SOICT-HUST   57         Hostname: <%= request.getRemoteHost() %> Parameter: <%= request. getParameter(“yourParameter”) %> Server: <%= application.getServerInfo() %> Session ID: <%= session.getId() %> 58 Thiết lập response headers và status codes Ghi log cho server Cập nhật CSDL Thực thi mã nguồn có điều khiển lặp, rẽ nhánh <% Java code %> hoặc <jsp:scriptlet> Java code</jsp:scriptlet> DatTT-DSE-SOICT-HUST Hiển thị query string (của URL yêu cầu) <% String queryData = request.getQueryString(); out.println(“Attached GET data: “ + queryData); %> Có thể sử dụng các biến đã định nghĩa (implicit objects) Cú pháp:  Random number: <%= Math.random() %> Ví dụ: Scriptlets Sử dụng để chèn mã Java bất kỳ vào phương thức jspService() của Servlet tương ứng Có thể làm được các việc mà expressions không thể  Current time: <%= new java.util.Date() %> DatTT-DSE-SOICT-HUST Scriptlets  56 Ví dụ: Expressions Trong giai đoạn thực thi trang JSP:  Expressions: <%= Expressions %> Scriptlets: <% Code %> Declarations: <%! Declarations %> 59  Thiết lập response type <% response.setContentType(“text/plain”); %> DatTT-DSE-SOICT-HUST 60 10
  • 11. 9/10/2011 Ví dụ: Scriptlet với điều khiển lặp Ví dụ: Scriptlet với điều khiển lặp (2) <% Iterator i = cart.getItems().iterator(); while (i.hasNext()) { ShoppingCartItem item = (ShoppingCartItem)i.next(); BookDetails bd = (BookDetails)item.getItem(); %> <tr> <td align="right" bgcolor="#ffffff"> <%=item.getQuantity()%> </td> <td bgcolor="#ffffaa"> <strong><a href=" <%=request.getContextPath()%>/bookdetails?bookId= <%=bd.getBookId()%>"><%=bd.getTitle()%></a></strong> </td> ... <% // End of while } DatTT-DSE-SOICT-HUST 61 %> DatTT-DSE-SOICT-HUST Ví dụ: biên dịch trang JSP  62 Ví dụ: biên dịch trang JSP public void _jspService(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType(“text/html”); HttpSession session = request.getSession(true); JSPWriter out = response.getWriter(); Giả sử ta có đoạn mã JSP như sau: <H2> sangHTML </H2> <%= sangExpression() %> <% sangScriptletCode(); %> // Static HTML fragment is sent to output stream in “as is” form out.println(“<H2>sangHTML</H2>”); // Expression is converted into String and then sent to output out.println(sangExpression()); DatTT-DSE-SOICT-HUST 63 Declarations      Nằm ngoài phương thức _jspSevice() Declerations không được truy cập các Implicit objects (VD: đối tượng HttpSession) Thường được sử dụng với Expressions hoặc Scriptlets Để thực hiện thao tác khởi tạo và dọn dẹp trang in JSP pages, sử dụng declarations để override phương thức jspInit() và jspDestroy() Cú pháp:   DatTT-DSE-SOICT-HUST } 64 Ví dụ (1) Được sử dụng để định nghĩa các biến hoặc phương thức (sẽ được chèn vào trong lớp Servlet tương ứng)  // Scriptlet is inserted as Java code within _jspService() sangScriptletCode(); ... <H1>Some heading</H1> <%! private String randomHeading() { return(“<H2>” + Math.random() + “</H2>”); } %> <%= randomHeading() %> <%! Mã nguồn khai báo biến hoặc phương thức %> <jsp:declaration> Mã nguồn khai báo biến hoặc phương thức </jsp:declaration> DatTT-DSE-SOICT-HUST 65 DatTT-DSE-SOICT-HUST 66 11
  • 12. 9/10/2011 Ví dụ (2): Servlet tương ứng Ví dụ: Declaration public class xxxx implements HttpJSPPage { private String randomHeading() { return(“<H2>” + Math.random() + “</H2>”); } } <%! private BookDBAO bookDBAO; public void jspInit() { ... } public void jspDestroy() { ... } %> public void _jspService(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType(“text/html”); HttpSession session = request.getSession(true); JSPWriter out = response.getWriter(); out.println(“<H1>Some heading</H1>”); out.println(randomHeading()); ... } ... DatTT-DSE-SOICT-HUST 67 DatTT-DSE-SOICT-HUST 68 Tại sao nên sử dụng cú pháp XML?   Hỗ trợ từ JSP 1.2 Ví dụ     Including và Forwarding tới tài nguyên Web khác <jsp:expression>Expression</jsp:expression> <jsp:scriptlet> Java code</jsp:scriptlet> <jsp:declaration> declaration code </jsp:declaration> Lợi ích   XML validation (qua XML schema) Có sẵn nhiều công cụ XML    editor transformer Java APIs DatTT-DSE-SOICT-HUST 69 DatTT-DSE-SOICT-HUST Include Directive Including các Contents trong 1 trang JSP  Có 2 kỹ thuật để đính kèm (including) một tài nguyên Web (Web resource) trong 1 trang JSP     Sử dụng include directive Sử dụng phần tử jsp:include   Được xử lý khi trang JSP được dịch thành Servlet Hoạt động của directive là chèn text chứa trong file khác (hoặc nội dung tĩnh hoặc 1 trang JSP khác) vào trong trang JSP đang xét Thường được dùng để đính kèm các thông tin banner, copyright, hoặc bất kỳ nội dung nào để tái sử dụng cho các trang khác Cú pháp   DatTT-DSE-SOICT-HUST 70 71 <%@ include file="filename" %> <%@ include file="banner.jsp" %> DatTT-DSE-SOICT-HUST 72 12
  • 13. 9/10/2011 Phần tử jsp:include   Được xử lý khi thực thi 1 trang JSP Cho phép chèn tài nguyên tĩnh/động vào 1 file JSP    Sử dụng kỹ thuật nào?  static: Nội dung của resource được chèn vào file JSP đang xét dynamic: Một yêu cầu được gửi tới resource cần được đính kèm, trang cần đính kèm (included page) sẽ được thực thi, và kết quả sẽ được đính vào response rồi trả về cho trang JSP ban đầu    Cú pháp   <jsp:include page="includedPage" /> <jsp:include page="date.jsp"/> DatTT-DSE-SOICT-HUST Sử dụng include directive nếu file ít khi thay đổi Nhanh hơn jsp:include Sử dụng jsp:include cho nội dung thay đổi thường xuyên Sử dụng jsp:include khi chưa quyết định được sẽ đính kèm trang nào cho đến khi main page được request 73 DatTT-DSE-SOICT-HUST 74 Forward tới Web component khác   Cùng cơ chế như trong Servlet Cú pháp Directives <jsp:forward page="/main.jsp" />  Đói tượng request ban đầu sẽ được chuyển cho trang đích. Có thể đính thêm các tham số mới <jsp:forward page="..." > <jsp:param name="param1" value="value1"/> </jsp:forward> DatTT-DSE-SOICT-HUST 75 DatTT-DSE-SOICT-HUST Directives    3 loại Directives Directives là các thông điệp (messages) chuyển đến JSP container hướng dẫn cách biên dịch trang JSP Không sinh ra output Cú pháp  76  page: Các thuộc tính của trang JSP     <%@ directive {attr=value}* %> 77 <%@ include file="header.html" %> Taglib: Chỉ ra 1 thư viện thẻ mà JSP container cần phải interpret  DatTT-DSE-SOICT-HUST <%@ page import="java.util.* %> include: Được sử dụng để đính kèm text/mã nguồn khi dịch trang JSP thành Servlet <%@ taglib uri="mytags" prefix="codecamp" %> DatTT-DSE-SOICT-HUST 78 13
  • 14. 9/10/2011 Page Directives   Implicit Objects Đưa thêm các thông tin vào Servlet biên dịch từ trang JSP tương ứng Cho phép điều khiển    Import các class nào   <%@ page import="java.util.* %>  Loại MIME sinh ra là gì  Một trang JSP có thể truy cập tới các implicit objects Được tạo bởi container Tương ứng với các lớp định nghĩa trong Servlet (đã học ở bài trước) Xử lý đa luồng như thế nào     <%@ page contentType="MIME-Type" %> <%@ page isThreadSafe="true" %> <%!--Default --%> <%@ page isThreadSafe="false" %> Xử lý các lỗi không mong đợi như thế nào  <%@ page errorPage="errorpage.jsp" %> DatTT-DSE-SOICT-HUST 79 DatTT-DSE-SOICT-HUST 80 Implicit Objects        request (HttpServletRequest) response (HttpServletRepsonse) session (HttpSession) application(ServletContext) out (of type JspWriter) config (ServletConfig) pageContext DatTT-DSE-SOICT-HUST Scope Objects 81 Các loại Scope DatTT-DSE-SOICT-HUST 82 Session và Application Scope Client 1 server Session 1 Session ID 1 Client 2 Session ID 2 Session 2 Client 1 server application Client 2 DatTT-DSE-SOICT-HUST 83 DatTT-DSE-SOICT-HUST 84 14
  • 15. 9/10/2011 Session, Request, Page Scope 7. JavaBeans Components DatTT-DSE-SOICT-HUST 85 DatTT-DSE-SOICT-HUST JavaBeans là gì?      Quy ước thiết kế JavaBeans Các lớp Java classes có thể được tái sử dụng trong các ứng dụng Bất kỳ Java class nào tuân theo các quy định thiết kế đều thành một JavaBeans      Trong 1 trang JSP, có thể khởi tạo các Beans và truy cập/thiết lập (get/set) các thuộc tính của nó JavaBeans có thể chứa các xử lý nghiệp vụ/truy câp database (business logic/data base access logic)   87 Read/write, read-only, hoặc write-only Kiểu đơn hoặc kiểu mảng Các thuộc tính được truy cập/thiết lập qua phương thức getXxx và setXxx  PropertyClass getProperty() { ... } PropertyClass setProperty() { ... } JavaBeans phải có constructor mặc định DatTT-DSE-SOICT-HUST 88 Tại sao sử dụng JavaBeans trong các trang JSP? Ví dụ: JavaBeans public class Currency { private Locale locale; private double amount; public Currency() { locale = null; amount = 0.0; } public void setLocale(Locale l) { locale = l; } public void setAmount(double a) { amount = a; } public String getFormat() { NumberFormat nf = NumberFormat.getCurrencyInstance(locale); return nf.format(amount); } DatTT-DSE-SOICT-HUST } JavaBeans có các thuộc tính (properties) Một thuộc tính có thể là  Quy định về các thuộc tính của lớp Quy định về phương thức public get, set của các thuộc tính DatTT-DSE-SOICT-HUST 86  89 Một trang JSP có thể tạo và sử dụng bất kỳ đối tượng Java nào trong 1 declaration hoặc scriptlet như sau: <% ShoppingCart cart = (ShoppingCart)session.getAttribute("cart"); // If the user has no cart, create a new one if (cart == null) { cart = new ShoppingCart(); session.setAttribute("cart", cart); } DatTT-DSE-SOICT-HUST 90 %> 15
  • 16. 9/10/2011 Tại sao sử dụng JavaBeans trong các trang JSP?  So sánh 2 đoạn code Các trang JSP pages sử dụng phần tử JSP để tạo và truy nhập đối tượng JavaBean <jsp:useBean id="cart“ class="cart.ShoppingCart“ scope="session"/>  Tác dụng:   <% ShoppingCart cart = (ShoppingCart)session.getAttribute("cart"); // If the user has no cart object as an attribute in Session scope // object, then create a new one. Otherwise, use the existing // instance. if (cart == null) { cart = new ShoppingCart(); Tạo 1 thể hiện của lớp “ShoppingCart” nếu chưa tổn tại, lưu trữ làm 1 thuộc tính của đối tượng session Bean được tạo được truy cập trên toàn session với id là “cart” DatTT-DSE-SOICT-HUST session.setAttribute("cart", cart); } %> versus <jsp:useBean id="cart" class="cart.ShoppingCart" scope="session"/> 91 DatTT-DSE-SOICT-HUST Tại sao sử dụng JavaBeans trong các trang JSP?      Tạo một JavaBeans Người thiết kế trang Web không cần học Java Tách biệt rõ ràng giữa content và presentation Tái sử dụng mã nguồn hiệu quả Chia sẻ đối tượng dễ dàng (cơ chế built-in) Thuận tiện khi đọc tham số vào (request parameters) và chuyển thành các thuộc tính của 1 đối tượng (ví dụ ở fần sau) DatTT-DSE-SOICT-HUST  Trang JSP khai báo sử dụng bean có tầm vực nào đó với phần tử jsp:useBean <jsp:useBean id="beanName" class="fully_qualified_classname" scope="scope"/>  Hoặc <jsp:useBean id="beanName" class="fully_qualified_classname" scope="scope"> <jsp:setProperty .../> </jsp:useBean> 93 DatTT-DSE-SOICT-HUST Thiết lập thuộc tính cho JavaBeans        <jsp:setProperty name="beanName" property="propName" value="string constant"/> “beanName” phải trùng với id chỉ ra trong phần tử useBean Phải có phương thức setPropName trong Bean DatTT-DSE-SOICT-HUST Cú pháp jsp:setProperty phụ thuộc vào đầu vào của thuộc tính  <% beanName.setPropName(value); %> Qua JSP:setProperty  94 Thiết lập thuộc tính cho JavaBeans 2 cách thiết lập thuộc tính cho bean Qua scriptlet  92 95    <jsp:setProperty name="beanName" property="propName" value="string constant"/> <jsp:setProperty name="beanName" property="propName" param="paramName"/> <jsp:setProperty name="beanName" property="propName"/> <jsp:setProperty name="beanName" property="*"/> <jsp:setProperty name="beanName" property="propName" value="<%= expression %>"/> DatTT-DSE-SOICT-HUST 96 16
  • 17. 9/10/2011 Ví dụ: jsp:setProperty với đầu vào là Request parameter Ví dụ: jsp:setProperty với đầu vào là 1 Expression <jsp:setProperty name="bookDB" property="bookId"/> <jsp:useBean id="currency" class="util.Currency" scope="session"> <jsp:setProperty name="currency" property="locale" tương đương với value="<%= request.getLocale() %>"/> </jsp:useBean> <% //Get the identifier of the book to display <jsp:setProperty name="currency" property="amount" String bookId = request.getParameter("bookId"); value="<%=cart.getTotal()%>"/> bookDB.setBookId(bookId); ... %> DatTT-DSE-SOICT-HUST 97 DatTT-DSE-SOICT-HUST Truy cập thuộc tính của JavaBeans và convert thành String rồi chèn vào out Truy cập các thuộc tính của JavaBeans  2 cách truy cập 1 thuộc tính của bean:    CONVERT giá trị thuộc tính thành String và chèn giá trị vào đối tượng “out” (implicit object) Lấy giá trị của thuộc tính mà KHÔNG cần chuyển thành String và chèn vào đối tượng “out” 2 cách  Qua scriptlet  Qua JSP:setProperty     99 Truy cập thuộc tính của JavaBeans mà không convert thành String  <jsp:getProperty name="beanName" property="propName"/> “beanName” phải trùng với thuộc tính id trong phần tử useBean lúc khai báo Phải có phương thức “getPropName()” trong bean DatTT-DSE-SOICT-HUST 100 Truy cập đối tượng trong trang JSP Phải sử dụng scriptlet Cú pháp:  <%= beanName.getPropName() %> Yêu cầu  DatTT-DSE-SOICT-HUST 98 Ví dụ:  <% Object o = beanName.getPropName(); %> <% // Print a summary of the shopping cart int num = cart.getNumberOfItems(); if (num > 0) { %> DatTT-DSE-SOICT-HUST 101 DatTT-DSE-SOICT-HUST 102 17
  • 18. 9/10/2011 Tạo trang thông báo lỗi   8. Xử lý lỗi Xác định ngoại lệ được tung ra Với mỗi trang JSP, thêm directive sau     103 Ví dụ: initdestroy.jsp <%= exception.toString() %> DatTT-DSE-SOICT-HUST 104 Example: errorpage.jsp <%@ page isErrorPage="true" %> <%@ page import="java.util.*" %> <% ResourceBundle messages = (ResourceBundle)session.getAttribute("messages"); if (messages == null) { Locale locale=null; String language = request.getParameter("language"); <%@ page import="database.*" %> <%@ page errorPage="errorpage.jsp" %> <%! private BookDBAO bookDBAO; public void jspInit() { // retrieve database access object, which was set once per web application bookDBAO = (BookDBAO)getServletContext().getAttribute("bookDB"); if (bookDBAO == null) System.out.println("Couldn't get database."); if (language != null) { if (language.equals("English")) { locale=new Locale("en", ""); } else { locale=new Locale("es", ""); } } else locale=new Locale("en", ""); } public void jspDestroy() { bookDBAO = null; } %> DatTT-DSE-SOICT-HUST <%@ page isErrorPage="true" %> Trong error page, sử dụng đối tượng exception để hiển thị thôgn tin  DatTT-DSE-SOICT-HUST <%@ page errorPage="errorpage.jsp" %> Viết 1 trang thông báo lỗi (error page), nên có directive sau 105 messages = ResourceBundle.getBundle("BookStoreMessages", locale); session.setAttribute("messages", messages); } DatTT-DSE-SOICT-HUST 106 %> ... Example: errorpage.jsp ... (continued) <html> <head> <title><%=messages.getString("ServerError")%></title> </head> <body bgcolor="white"> <h3> <%=messages.getString("ServerError")%> </h3> <p> <%= exception.getMessage() %> </body> </html> DatTT-DSE-SOICT-HUST 9. Ví dụ: Date website 107 DatTT-DSE-SOICT-HUST 108 18
  • 19. 9/10/2011 9. Ví dụ: Date website -output 9. Ví dụ: Date website <%@ page import="java.util.*" %> <%@ page import="MyLocales" %> <%@ page contentType="text/html; charset=ISO-8859-5" %> <html> <head><title>Localized Dates</title></head> <body bgcolor="white"> <jsp:useBean id="locales" scope="application" class="MyLocales"/> <form name="localeForm" action="index.jsp" method="post"> <b>Locale:</b> DatTT-DSE-SOICT-HUST 109 9. Ví dụ: Date website 110 9. Ví dụ: Date website <select name=locale> <% Iterator i = locales.getLocaleNames().iterator(); String selectedLocale = request.getParameter("locale"); while (i.hasNext()) { String locale = (String)i.next(); if (selectedLocale != null && selectedLocale.equals(locale) ) { %> <option selected><%=locale%></option> <%} else { %> <option><%=locale%></option> <%} }%> </select> <input type="submit" name="Submit" value="Get Date"> </form> DatTT-DSE-SOICT-HUST DatTT-DSE-SOICT-HUST 111 <p> <jsp:include page="date.jsp" flush="true" /> </body> </html> DatTT-DSE-SOICT-HUST 112 19