Bài 4. Cơ Bản Về JSP Doc - 123doc

JSP & Servlet trong kiến trúc J2EE 1.2Java 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

Trang 1

Bài 4 Cơ bản về JSP

Trang 2

Nội dung

Trang 3

1 JSP trong kiến trúc J2EE

Trang 4

JSP & Servlet trong kiến trúc J2EE 1.2

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

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

4

Trang 5

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

Trang 6

2 Giới thiệu về JSP

6

Trang 9

Kết quả hiển thị

Trang 10

2.1 JSP và Servlet

10

Trang 11

● Very easy to author

● Code is compiled into a servlet

Servlets

Trang 12

Ưu điểm của JSP

 Tách biệt nội dung & cách trình bày

JSP, JavaBeans và custom tags

(JavaBeans, Custom tags)

Trang 13

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

 Servlets:

  Hạn chế trong bảo trì các trang HTML

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

deploy lại

 JSP:

Trang 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ệ

dispatching”

 Trong thực tế, cả servlet và JSP được sử

dụng trong mẫu thiết kế MVC Controller)

(Model-View- Servlet xử lý phần Controller

14

Trang 15

2.2 Kiến trúc JSP

Trang 16

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

Public class OrderServlet …{

public void doGet(…){

Public class OrderServlet …{

public void doGet(…){

Trang 17

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

Trang 18

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

File Changed

JSP

18

Trang 19

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

 Translation

 Compile

 Execution

Trang 20

Giai đoạn Translation/Compilation

mã này mới được biên dịch tiếp

trang JSP được truy cập (hoặc khi chỉnh sửa)

Trang 21

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:

 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

tương ứng của trang JSP

Trang 22

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

22

Trang 23

Khởi tạo trang JSP

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

Trang 24

Kết thúc trang JSP

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

24

Trang 25

private BookDBAO bookDBAO;

public void jspInit() {

// retrieve database access object, which was set once per web application

Trang 26

4 Các bước phát triển ứng

dụng Web với JSP

26

Trang 27

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

(Servlet or JSP), các helper classes sử dụng trong web component

dạng chưa đóng gói nhưng triển khai được)

 Web clients có thể truy cập ứng dụng qua URL

Trang 28

So sánh

Hello1 Servlet & Hello2 JSP

28

Trang 29

public class GreetingServlet extends HttpServlet {

public void doGet (HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException{

response.setContentType("text/html");

PrintWriter out = response.getWriter();

// then write the data of the response

out.println("<html>" +

"<head><title>Hello</title></head>");

Trang 30

"<input type=\"submit\" value=\"Submit\">" +

"<input type=\"reset\" value=\"Reset\">" +

"</form>");

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);

Trang 31

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 )

out.println("<h2>Hello, " + username + "!</h2>"); }

}

Trang 32

<input type="submit" value="Submit">

<input type="reset" value="Reset">

</form>

<%

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

if ( username != null && username.length() > 0 ) {

Trang 33

<h2><font color="black">Hello,

<%=username%> !</font></h2>

Trang 34

JSP “là” Servlet!

34

Trang 35

JSP là “Servlet”

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

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: HTTPSession,

ServletContext… có thể được truy cập từ

Trang 36

private static boolean _jspx_inited = false;

public final void _jspx_init()

throws org.apache.jasper.runtime.JspException {

}

36

Trang 37

greeting$jsp.java (2)

public void _jspService(HttpServletRequest request,

HttpServletResponse response) throws java.io.IOException, ServletException {

JspFactory _jspxFactory = null;

PageContext pageContext = null;

HttpSession session = null;

ServletContext application = null;

ServletConfig config = null;

JspWriter out = null;

Object page = this;

String _value = null;

Trang 38

pageContext = _jspxFactory.getPageContext(this, request,

response,"", true, 8192, true);

Trang 39

greeting$jsp.java (4)

// HTML // begin [file="/greeting.jsp";from=(38,4);to=(53,0)]

out.write("\n\n<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>\n\n<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>\n\n");

// end

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

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

if ( username != null && username.length() > 0 ) { // end

Trang 40

// 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);

Trang 41

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

Trang 42

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

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

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

42

Trang 43

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

Trang 44

(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

Trang 45

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

 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

Trang 46

 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

46

Trang 47

(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

 Mạnh mẽ hơn JavaBeans component

 (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

Trang 48

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

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

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

bảo có đủ các custom tags này (Từ phiên bản

J2EE 1.3)

48

Trang 49

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

Trang 50

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

Trang 51

6 Gọi mã nguồn Java sử

dụng JSP scripting elements

Trang 52

JSP Scripting Elements

 Cho phép chèn mã nguồn Java vào servlet được sinh tương ứng cho trang JSP

elements trong trang JSP nếu có thể

Trang 53

 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

 <%= Expression %> hoặc

Trang 54

Ví dụ: Expressions

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

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

Trang 55

jspService() của Servlet tương ứng

 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>

Trang 57

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

Trang 58

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

58

Trang 60

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();

// Static HTML fragment is sent to output stream in “as is” form

Trang 61

 Đượ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)

 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 trong trang JSP,

sử dụng declarations để override phương thức jspInit() và jspDestroy()

 Cú pháp:

 <%! Mã nguồn khai báo biến hoặc phương thức %>

Trang 63

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

public class xxxx implements HttpJSPPage {

private String randomHeading() {

return(“<H2>” + Math.random() + “</H2>”);

}

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());

Trang 64

Ví dụ: Declaration

<%!

private BookDBAO bookDBAO;

public void jspInit() {

Trang 65

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

 <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

Trang 66

Include và Forward tới tài

nguyên Web khác

66

Trang 67

Include 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

Trang 68

Include Directive

 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

banner, copyright, hoặc bất kỳ nội dung nào để tái

Trang 69

Phần tử jsp:include

 Được xử lý khi thực thi 1 trang JSP

 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

 <jsp:include page="includedPage" />

Trang 70

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

 Sử dụng include directive nếu file ít khi thay đổi

 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

70

Trang 71

Forward tới Web component khác

 Cùng cơ chế như trong Servlet

Trang 72

72

Trang 73

 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

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

Trang 74

3 loại Directives

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

khi dịch trang JSP thành Servlet

Trang 75

Page Directives

trang JSP tương ứng

 Import các class nào

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

 Loại MIME sinh ra là gì

 <%@ page contentType="MIME-Type" %>

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

 <%@ page isThreadSafe="true" %> <%! Default %>

 <%@ page isThreadSafe="false" %>

Trang 76

Implicit Objects

 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)

76

Trang 78

Scope Objects

78

Trang 79

Các loại Scope

Trang 80

Session và Application Scope

Trang 81

Session, Request, Page Scope

Trang 82

7 JavaBeans Components

82

Trang 83

 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

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

Trang 84

Quy ước thiết kế JavaBeans

 JavaBeans có các thuộc tính (properties)

 Một thuộc tính có thể là

 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

84

Trang 85

Ví dụ: JavaBeans

public class Currency {

private Locale locale;

private double amount;

Trang 86

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

 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

Trang 87

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

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

Trang 88

So sánh 2 đoạn code

<%

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

Trang 89

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

 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

Trang 91

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

 Qua JSP:setProperty

 <jsp:setProperty name="beanName"

property="propName" value="string constant"/>

tử useBean

Trang 92

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

Trang 93

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

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

tương đương với

<%

//Get the identifier of the book to display

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

bookDB.setBookId(bookId);

Trang 94

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

<jsp:useBean id="currency" class="util.Currency"

Trang 95

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)

thành String và chèn vào đối tượng “out”

Trang 96

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

Trang 97

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

Trang 98

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

98

Trang 99

8 Xử lý lỗi

Trang 100

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

 Xác định ngoại lệ được tung ra

 Với mỗi trang JSP, thêm directive sau

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

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

có directive sau

 <%@ page isErrorPage="true" %>

 Trong error page , sử dụng đối tượng

exception để hiển thị thông tin

 <%= exception.toString() %>

100

Trang 101

Ví dụ: initdestroy.jsp

<%@ page import="database.*" %>

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

<%!

private BookDBAO bookDBAO;

public void jspInit() {

// retrieve database access object, which was set once per web application

Từ khóa » Các Bài Tập Về Jsp