Lecture 04 Servlets

1

LẬP TRÌNH NET TRÊN JAVA – SERVLETS
Giới thiệu và cấu trúc

Nội dung
2

Applet Servlets, JSP , Sockets programming RMI, RMI URL JDBC

Applet
3

Chương trình GUI chạy trên web browser Java bytecode được tải đến từ web server y ợ Vấn đề về cơ chế bảo mật
Sandbox
Mã Java bytecode chưa được kiểm thử trước khi chạy Không kiểm tra được độ tin cậy của mã chạy

Servlets
4

Không phải là chương trình GUI Khởi tạo trang web động, trả lời lại những y ạ g ộ g, ạ g yêu cầu của web JSP: Java Server Pages
Là những phương pháp khác nhau để khởi tạo servlets. servlets

Lập trình mạng
5

Là sự giao tiếp giữa các tiến trình ế ế Các cách tiếp cận khác nhau: p ậ
Mức thấp thông qua API: sockets
Cần phải hiểu rõ hình thức mạng, địa chỉ …

Tiếp cận hướng đối tượng: RMI, CORBA Tiếp cận trên cơ sở hướng phục vụ: URL

Sockets
6

Sockets API thường được sử dụng nhiều ề trong lập trình API trên C Socket là sự giao tiếp trừu tượng điểm cuối Các loại sockets khác nhau:
Stream (kết nối qua stream byte) Datagram (các messages độ lập) D t ( á độc lậ )

Sử dụng sockets cần phải hiểu rõ về các tầng kết nối mạng OSI, địa chỉ mạng, hàng đợi … ế ố

Java sockets
7

Sockets trong Java đơn giản hơn trong C
Che giấu chi tiết API được sử dụng thích hợp nhất với TCP/IP

Các đối tượng khác nhau được sử dụng cho các kiểu giao tiếp mạng khác nhau:
Socket (Stream Client) ServerSocket (Stream Server) DatagramSocket (M D t S k t (Message oriented) i t d)

8

Socket và ServerSocket (trên giao tiếp TCP/IP) iế
Thiết lập kết nối ngang hàng ế ế ố Socket cung cấp I/O stream liên kết với kết nối g p
Sử dụng phương thức I/O của Java

Xuất hiện ngoại lệ mới là vấn đề khó giải quyết Nên sử dụng không nhiều quá một stream

9

DatagramSocket và DatagramPacket (UDP) D P k
Giao tiếp hướng thông tin ế
Trao đổi thông tin, gửi và nhận Nằm trong Java I/O

Các hạn chế
Không tin cậy Hàng đợi không được đảm bảo Nhân đôi thông tin có thể xảy ra Cần hiể ấ Cầ hiểu rất rõ về giao thức mạng để sử dụng ề i hứ ửd

Socket class
10

Class mô tả về socket ề Tạo một socket ạ ộ
Socket(InetAddress address, int port) Socket(String host, int port) host Socket(InetAddress address, int port, InetAddress, localAddr, InetAddress localAddr int localPort) Socket(String host, int port, InetAddress, localAddr, localAddr int localPort) Socket()

… (tiếp)
11

Lấy thông tin về một socket

InetAddress getInetAddress() : trả về địa chỉ mà socket kết nối đến. int getPort() : trả về địa chỉ mà socket kết nối đến. InetAddress getLocalAddress() : trả về địa chỉ cục bộ. bộ int getLocalPort() : trả về địa chỉ cục bộ.
Sử dụng Streams

public OutputStream getOutputStream() throws IOException - Trả về một output stream cho việc viết các byte đến
socket này. y

public InputStream getInputStream() throws IOException - Trả về một input stream cho việc đọc các byte từ
socket này. y

Ví dụ - kết nối đến webserver
12

import java.net.*; java net *; import java.io.*; public class getSocketInfo { public static void main(String[] args) { for (int i = 0; i < args.length; i++) { try { Socket theSocket = new Socket(args[i], 80); System.out.println("Connected to " + theSocket.getInetAddress() theSocket getInetAddress() + " on port " + theSocket.getPort() + " from port " + theSocket.getLocalPort() + " of " + theSocket.getLocalAddress()); theSocket getLocalAddress()); }

Lập trình internet
13

Tất cả điểm cuối được phân biệt bởi 3 loại ấ ể ố sau:
Cổng giao tiếp UDP/TCP Số cổng ( ộ lập với service) g (độc ập ) Địa chỉ IP
IP của người sử dụng IP mạng

Java Sockets và IP
14

Lớp InetAddress Phương thức: g
static InetAddress getByName(String); static InetAddress getLocalHost(); byte getAddress(); String getHostAddress(); String getHostName();

TCP client/server
15

Client sử dụng đối tượng Socket ố
Cần xác định địa chỉ server
Địa chỉ IP/hostname và số cổng Liên kết stream với giao tiếp

Server sử dụng đối tượng ServerSocket
Cần phải xác định số cổng server Nhận kết nối mới
Kết nối mới tạo đối tượng Socket

Ví dụ - in IP của locahost
16

import java.net.*; java net *; public class HostInfo { public static void main(String args[]) { HostInfo host H tI f h t = new H tI f () HostInfo(); host.init(); } public void init() { try { InetAddress myHost = InetAddress.getLocalHost(); InetAddress getLocalHost(); System.out.println(myHost.getHostAddress()); System.out.println(myHost.getHostName()); } catch (U k t h (UnknownHostException ex) { H tE ti ) System.err.println("Cannot find local host"); } } }

Ví dụ - lấy IP của local/remote host
17 1. 2. 3. 4. 5. 6. 6

public class Sample1 { public static void main (String[] args) { try { InetAddress localAddr = InetAddress.getLocalHost(); System.out.println( "Local Host Address (Host/IP): " + localAddr.toString() ); localAddr toString() InetAddress remoteAddr = InetAddress.getByName("www.vnn.vn"); System.out.println( "Web Server IP: " + remoteAddr.toString() ); } catch (UnknownHostException ex) {ex.printStackTrace(); }// end main d i }// End class }

7. 8. 9. 10. 10 11. 12. 13. 14.

Ví dụ về Talk client/server
18

Lớp Talker
Được phân luồng Đọc stream vào và đưa stream ra

Lớp TalkServer
Tạo ServerSocket, đợi sự kết nối từ client Tạo 2 đối tượng Talker và chạy chúng

Lớp TalkClient
Tạo Socket, kết nối với server ế ố Tạo 2 đối tượng Talker và chạy chúng

RMI – Remote method invocation
19

Ý tưởng tạo đối tượng Java thực thi mạng ố Server phải bao g p gồm code, theo dõi requests , q
Tại một số địa chỉ/hostname Gọi phương thức request và trả về kết quả request, Tuần tự hóa

Client hải tạo Cli t phải t đối t tượng từ xa

Ví dụ RMI code
20

SimpleRMI, AlternativeSimpleRMI
Cung cấp từ xa về thêm/bớt đối tượng Tạo đối tượng server phục vụ client

SortRMi
Tạo phương thức ngắn từ xa Có thể dễ dàng nhận/gửi các kiểu đối tượng phức

URL – Uniform Resource Locator
21

Địa chỉ internet world wide web Lớp URL của Java p
Xây dựng và phân tích các URL Tạo đối tượng URLConnection
Có thể tương tác với server

Tạo kết nối tới URL
InputStream để đọc dữ liệu từ server

Một số phương thức URL
22

String getHost(); String g g getPath(); (); String getQuery(); InputStream openStream(); URLConnection openConnection();

Tìm và in trang web
23

try { URL u = new URL("http://www.google.com"); ( p g g ) BufferedReader r = new BufferedReader( new InputStreamReader( u openStream())); u.openStream())); String s; while ( (s = r.readLine()) != null) y p ( ) System.out.print(s); } catch (... I/O and URL Exceptions ..

24

Servlets và JSP

Giới thiệu
25

JSP là công nghệ script chạy phía web server của hãng ủ Sun giống như ASP/PHP JSP dùng ngôn ngữ Java cho các phát biể như if f dù ô ữJ h á hát biểu h if, for, do…while, while, biểu thức, lời gọi hàm…. và phân biệt chữ HOA và thường thường. Hiện JSP có thể chạy trên nhiều Web server khác nhau từ Tomcat, Apache, Jrun, JavaWebServer,... Miễn là chúng hỗ trợ Servlet Engine. Để server nhận biết được file nào là JSP, ta luôn dùng ậ ợ , g extension đã qui định theo cấu hình (mặc định là *.jsp).

Lập trình web và Java
26

Java web server
27

Server bao gồm JVM ồ
Java sẵn sàng thực thi, không cần khởi động với mỗi request gửi đến JVM có một số đối tượng servlets
Khi request gửi đến, phương thức đối tượng servlet được gọi để bắt request

Nếu request gửi đến có lớp servlet mới, lớp có thể được load trực tiếp Tạo lớp với mở rộng
javax.servlet.http.HttpServlet

Tạo servlet
28

Tạo lớp sử dụng
javax.servlet.http.HttpServlet

Viết phương thức
init() – được gọi khi đối tượng được khởi tạo doGet() / doPost() – được gọi khi web request được gửi đến destroy() – được gọi khi hủy đối tượng

Ví dụ Servlet
29

public class H ll S l t extends Htt S l t { bli l HelloServlet t d HttpServlet public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // set the content type of the response response.setContentType("text/html"); C ( / ) // get a writer associated with the response stream. PrintWriter out = response getWriter(); response.getWriter(); out.println("<HEAD><TITLE>Hello</TITLE></HEAD>"); out.println("<BODY><p>Hello Client</p></BODY>"); out.close(); } }

JSP – Java Server Pages
30

Tạo mã HTML bao gồm mã Java trong đó ồ
Không cần định nghĩa lớp, chỉ cần trộn mã trong HTML

File .jsp được convert sang servlet một cách j p ợ g ộ tự động

Cấu trúc trang JSP
31

Một trang JSP là 1 file *.jsp , ví dụ: “hello.jsp” Viết một trang JSP bằng bất kỳ trình soạn thảo nào kể cả N t ả Notepad, rồi l d ồi lưu l i với tê * j lại ới tên *.jsp. JSP thường dùng các đối tượng Java chính quy để xử lý các giải thuật phức tạp Các đối tượng java này sẽ tạp. được đóng gói dạng JavaBean. Đoạn script JSP được đóng trong tag <% .... %> %>. Biểu thức dạng: <%= (exp) %> tương đương với <% out.print( out print( exp ) %>
ví dụ: <%= (5 + 3) %> tương đương với <% out.println( 5 + 3 ) %>

Các đối tượng có sẵn trong JSP
32

Đối tượng request ố Đối tượng response ợ g p Đối tượng out Đối tượng application Đối tượng session

Ví dụ JSP
33

<%@ page import="java.util.*" % %@ i t "j til *" %> <HTML> <HEAD><TITLE>JSP Demo</TITLE></HEAD> <BODY> <%! Date theDate = new Date(); Date getDate() { System.out.println( "In getDate() method" ); return theDate; } %> Hello! The time is now <%= getDate() %> </BODY> </HTML>

Ví dụ - data jsp data.jsp
34 1. 2. 3. 4. 5. 6. 6

7. 8. 9. 10. 11.

<HTML> <HEAD> <TITLE>JSP Example</TITLE> </HEAD> <BODY BGCOLOR="ffffcc"> <CENTER> <H2>Date and Time</H2> <% /*Begin JSP script–Java code sample–Comment script Java sample Comment */ java.util.Date today = new java.util.Date(); out.println("Today's out println("Today's date is: "+today); %> </CENTER> </BODY> </HTML>

Các thẻ script trong JSP
35

Khối <% ... % % %>
Dùng để nắm bắt các khai báo, biểu thức, tạo đối tượng, gọi p phương thức… VD: g <% out.println(“<h1> Hello to JSP world </h1>”); %>

Thẻ <%@page ... % ẻ %@ %>
Dùng để khai báo ngôn ngữ script, các phát biểu import. VD: %@page language="java" import="java.util.*; ja a sq a guage ja a po t ja a ut ; java.sql.*" %

Thẻ <%! .... %>
Dùng để khai báo các biến, các phương thức cấp trang JSP. VD: <%! int x = 10; double y = 2.0; %>.

… (tiếp)
36

Thẻ <%= ... %>
Dùng cho các biểu thức.VD: <%= a+b %> or <%= new java.util.Date() %>

Thẻ <%@ include ... %>
Dùng để chèn các file JSP khác VD: khác. <%@include file="copyright.html" %>

Lớp JApplet
37

Sử dụng để viết applet ể ế Appletviewer – sử dụng để chay applet mà pp ụ g y pp không cần web browser Đưa applet vào trong HTML
<APPLET code classname code=classname codebase=optional_path_to_classes width=200 height=200> Alternate text </APPLET>

38

JDBC

Kiến trúc tổng quát
39

40

Những bước cơ bản để sử dụng database trong J d b Java
1. 2. 3. 4. 5.

Tạo kết nối – connection ế ố Tạo cú pháp JDBC Statements ạ p p Chạy cú pháp SQL Nhận kết quả ResultSet Đóng kết nối

1. 1 Tạo kết nối - connection
41

import java.sql.*; i tj l* Nạp driver của dữ liệu cung cấp Class.forName( oracle.jdbc.driver.OracleDriver ); Class forName("oracle jdbc driver OracleDriver"); Phương thức động nạp driver cho cơ sở dữ liệu Oracle DriverManager.registerDriver(new g g ( com.microsoft.jdbc.sqlserver.SQLServerDriver()); Tạo kết nối - connection Connection con = D i M C ti DriverManager.getConnection( tC ti ( "jdbc:oracle:thin:@oracle-prod:1521:OPROD", username, passwd); Connection connection = DriverManager.getConnection( "jdbc:microsoft:sqlserver://<Host>:1433",username,passw d);

2. 2 Tạo cú pháp - JDBC statement
42

Statement stmt = conn.createStatement() ;
Khởi tạo đối tượng Statement dành cho gửi cú pháp SQL tới cơ sở dữ liệu:
1. 2. 3. 4. 4

Chuẩn bị Statement Liên kết tham số ế ố Cộng vào trong gói Lặp lại bước 2 và 3 đến khi truy cập vào từng phần tử của một bảng Khởi động (chạy)

5.

Ví dụ
43

Statement stmt = conn.createStatement( ); int[] rows; for(int i=0; i<accts.length; i++) { accts[i].calculateInterest( ); stmt.addBatch("UPDATE account " + "SET balance = " + accts[i].getBalance( ) + "WHERE acct_id = " + accts[i].getID( )); []g ( } rows = stmt executeBatch( ); stmt.executeBatch(

3. 3 Chạy cú pháp SQL
44

String St i createLehigh = "C t t bl t L hi h Create table Lehigh " + "(SSN Integer not null, Name VARCHAR(32), " + "Marks Integer)"; ( ), g ) stmt.executeUpdate(createLehigh); String insertLehigh = "Insert into Lehigh values“ + l "(123456789 b 100)"; (123456789,abc,100) stmt.executeUpdate(insertLehigh); p ( g );

4. 4 Nhận kết quả - ResultSet
45

String queryLehigh = "select * from Lehigh"; S h h l f h h ResultSet rs = Stmt.executeQuery(queryLehigh); while (rs.next()) { int ssn = rs.getInt("SSN"); String name = rs.getString("NAME"); int marks = rs.getInt("MARKS"); g ( ); }

5. 5 Đóng kết nối
46

stmt.close(); conn.close(); ();

Tiến trình và JDBC
47

JDBC cho phép SQL statements nhóm l i thà h nhóm h hé t t t hó lại thành hó trong một tiến trình riêng biệt Điều khiển tiến trình được thực hiện bởi đối tượng Connection, kiểu ngầm định là auto-commit, tức là mỗi một sql statement được đối xử như một tiến trình Có thể tắt chế độ auto-commit với conn.setAutoCommit(false); Và có thể bật lại với conn.setAutoCommit(true); ó l i ới tA t C it(t ) Một khi auto-commit bị tắt, không có SQL statement nào được đưa ra cho đến khi thực hiện conn commit(); conn.commit(); Tại thời điểm tất cả sự thay đổi được thực hiện bởi SQL statements sẽ là bất biến trong cơ sở dữ liệu g ệ

Bắt lỗi với ngoại lệ Exceptions
48

Chương trình có thể lấy lại và để lại trong ể ấ ể ệ ạ g phù ợp cơ sở dữ liệu trạng thái p hợp Nếu cú pháp try ném được ngoại lệ, nó có thể bắt ngoại lệ với cú pháp catch Sử dụng finally {…} để dọn dẹp ngoại lệ Có thể quay lại tiến trình catch { …} hoặc đóng kết nối tới cơ sở dữ liệu và làm sạch các quan hệ trong khối lệnh finally {…}

49

Một cách khác để kết nối cơ sở dữ liệu (JDBC ODBC) liệ (JDBC-ODBC)

Metadata trong cơ sở dữ liệu
50

Kết nối của cơ sở dữ liệ cho phép cung cấp ối ủ ở liệu h hé ấ các thông tin biểu thị các bảng thông qua cú pháp SQL dung lượng của kết nối, các quy SQL, nối trình kết nối Các thông tin đó được tạo nên bởi đối tượng DatabaseMetaData

Ví dụ Metadata
51

… Connection con = …. ; DatabaseMetaData dbmd = con.getMetaData(); String catalog = null; String schema = null; String table = “sys%”; String[ ] types = null; ResultSet rs = dbmd.getTables(catalog , schema , table , types ); …

Ví dụ JDBC - metadata
52

public static void printRS(ResultSet rs) th bli t ti id i tRS(R ltS t ) throws SQLE SQLException ti { ResultSetMetaData md = rs.getMetaData(); // get number of columns int nCols = md.getColumnCount(); // print column names for(int i=1; i < nCols; ++i) System.out.print( md.getColumnName( i)+","); / / output resultset while ( rs.next() ) { for(int i=1; i < nCols; ++i) System.out.print( rs.getString( i)+","); System.out.println( rs.getString(nCols) ); } }

Sign up to vote on this title
UsefulNot useful

Master Your Semester with Scribd & The New York Times

Special offer for students: Only $4.99/month.

Master Your Semester with a Special Offer from Scribd & The New York Times

Cancel anytime.