1. Trang chủ
  2. » Công Nghệ Thông Tin

Giao trinh lap trinh ung dung java 1

222 1 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 222
Dung lượng 2,87 MB

Cấu trúc

  • CHƯƠNG 1: LÀM VIỆC VỚI CƠ SỞ DỮ LIỆU TRONG JAVA (9)
    • 1.1. Kiến trúc jdbc (9)
    • 1.2. Các trình điều khiển (jdbc driver) (11)
    • 1.3. Viết chương trình làm việc với csdl qua jdbc (12)
    • 1.4. Kiểu dữ liệu sql và kiểu dữ liệu java (16)
    • 1.5. Statement và Resulset (17)
    • 1.6. Transaction trong JDBC (22)
  • CHƯƠNG 2: LẬP TRÌNH GIAO DIỆN VỚI AWT VÀ SWING (32)
    • 2.1. Tổng quan về lập trình giao diện trong java (0)
    • 2.2. AWT (33)
      • 2.2.1. Các đối tƣợng container cơ bản (0)
      • 2.2.2. Các đối tƣợng component cơ bản (0)
      • 2.2.3. Các sự kiện cơ bản của đối tƣợng (40)
      • 2.2.4. Lựa chọn(Choice) (44)
      • 2.2.5. Danh sách (46)
      • 2.2.6. Trình đơn(Memu) (48)
      • 2.2.7. Layout Manager (51)
      • 2.2.8. Xử lý sự kiện (57)
    • 2.3. SWING (0)
      • 2.3.1. Giới thiệu (59)
      • 2.3.2. Mở rộng các đối tƣợng component (0)
      • 2.3.3. Mở rộng các đối tƣợng container (0)
      • 2.3.4. Các đối tƣợng nâng cao của swing (0)
  • CHƯƠNG 3: LẬP TRÌNH SERVLET (70)
    • 3.1. Tổng quan về J2EE (70)
    • 3.2. Tổng quan Servlet (71)
      • 3.2.1. Servlets là gì? (71)
      • 3.2.2. Cấu trúc Servlets (71)
      • 3.2.3. Cài đặt môi trường Servlet (73)
      • 3.1.4. Cài đặt Web Server: Tomcat (73)
    • 3.3. Vòng đời (Life Cycle) của Servlet (75)
    • 3.4. Cấu hình Servlet (0)
    • 3.5. Tham số khởi tạo Servlet (0)
    • 3.6. Mapping Servlet (82)
    • 3.7. Sử dụng Annotations để khai báo servlets, Filter và listeners (0)
    • 3.8. Form Data trong Servlet (84)
      • 3.8.1. Phương thức doGET (84)
      • 3.8.2. Phương thức GET sử dụng FORM (87)
      • 3.8.3. Client Request trong Servlet (92)
      • 3.8.4. Server Response trong Servlet (99)
      • 3.8.5. Status Code trong Servlet (104)
    • 3.9. Sử dụng forward và redirect trong Servlet (0)
    • 3.10. Cookie trong Servlet (111)
    • 3.11. Session trong Servlet (114)
    • 3.12. Filter trong Servlet (116)
      • 3.12.1. Các phương thức Servlet Filter (117)
      • 3.12.2. Ví dụ về Servlet Filter (117)
      • 3.12.3. Ánh xạ Servlet Filter trong Web.xml (119)
      • 3.12.4. Sử dụng nhiều Filter trong Servlet (119)
      • 3.12.5. Thứ bậc của các Filter (120)
    • 3.13. Xử lý ngoại lệ (Exception) trong Servlet (0)
  • CHƯƠNG 4 LẬP TRÌNH JSP (128)
    • 4.1. Java Server Pages (JSP) là gì? (128)
      • 4.1.1. Tại sao sử dụng JSP? (128)
      • 4.1.2. Cấu trúc JSP (129)
      • 4.1.4. Tiến trình JSP (130)
    • 4.2. Vòng đời (Life Cycle) trong JSP (131)
    • 4.3. Cú pháp trong JSP (133)
      • 4.3.1. Scriptlet trong JSP (133)
      • 4.3.2. Declarations trong JSP (134)
      • 4.3.3. Expression trong JSP (135)
      • 4.3.4. Comment trong JSP (136)
      • 4.3.5. Directive trong JSP (137)
      • 4.3.6. Action trong JSP (137)
      • 4.3.7. Các đối tƣợng ẩn (Implicit) trong JSP (0)
    • 4.4. Điều khiển luồng trong JSP (139)
    • 4.5. Directive trong JSP (143)
      • 4.5.1. page Directive trong JSP (144)
      • 4.5.2. Include Directive trong JSP (145)
      • 4.5.3. Taglib Directive trong JSP (146)
    • 4.6. Action trong JSP (146)
    • 4.7. Đối tƣợng ẩn (Implicit) trong JSP (0)
      • 4.7.1. Đối tƣợng request trong JSP (0)
      • 4.7.2. Đối tƣợng response trong JSP (0)
      • 4.7.3. Đối tƣợng out trong JSP (0)
      • 4.7.3. Đối tƣợng session trong JSP (0)
      • 4.7.4. Đối tƣợng application trong JSP (0)
      • 4.7.5. Đối tƣợng config trong JSP (0)
      • 4.7.6. Đối tƣợng pageContext trong JSP (0)
      • 4.7.7. Đối tƣợng page trong JSP (0)
    • 4.8. Client Request trong JSP (159)
    • 4.9. Server Response trong JSP (165)
    • 4.10. Status Code trong JSP (171)
    • 4.11. Xử lý Form trong JSP (0)
      • 4.11.1. Phương thức GET (176)
      • 4.11.2. Phương thức POST (177)
    • 4.12. Thƣ viện thẻ chuẩn - Standard Tag Library (JSTL) trong JSP (183)
    • 4.13. JavaBeans trong JSP (190)
    • 4.14. Custom Tags trong JSP (194)
    • 4.15. Expression Language (EL) trong JSP (200)
      • 4.15.1. Cú pháp đơn giản cho JSP EL (200)
      • 4.15.2. Toán tử cơ bản trong EL (0)
      • 4.15.3. Hàm trong JSP EL (0)
    • 4.16. Xử lý ngoại lệ (Exception) trong JSP (0)
    • 4.17. Debug trong JSP (0)
    • 4.18. Bảo mật trong JSP (0)

Nội dung

Cung cấp kỹ năng lập trình cơ sở dữ liệu trong java, thực hiện kết nối và tương tác các hệ quản trị cơ sở dữ liệu khác nhau, sử dụng thành thạo các JDBC API giúp các ứng dụng Java có thể kết nối và thực hiện các thao tác truy vấn và xử lý dữ liệu. Cung cấp kiến thức JDBC,Java Swing,AWT,Java servlet

LÀM VIỆC VỚI CƠ SỞ DỮ LIỆU TRONG JAVA

Kiến trúc jdbc

JDBC (Java Database Connectivity, java.sql.*) là một thƣ viện chuẩn dùng để truy cập dữ liệu quan hệ từ ứng dụng bằng ngôn ngữ truy vấn sql, một vài hệ cơ sở dữ liệu phổ biến nhƣ nhƣ Access, MS SQL, Oracle, …

Kiến trúc của JDBC gồm 2 tầng:

+ JDBC API: có nhiệm vụ chuyển các câu lệnh SQL cho bộ quản lý trình điều khiển JDBC

+ JDBC Driver API: thực hiện nhiệm vụ liện hệ với trình điều khiển của hệ quản trị cơ sở dữ liệu cụ thể

 Các lớp và giao diện cơ bản trong JDBC API

Hình 1: 2 Các lớp và giao diện cơ bản trong JDBC

Các trình điều khiển (jdbc driver)

Trình điều khiển JDBC là đoạn chương trình, do chính cầu hệ quản trị CSDL cụ thể thực hiện các câu lệnh SQL nhà xây dựng hệ quản trị CSDL hoặc do nhà cung ứng thứ ba cung cấp, có khả năng yêu

Danh sách các trình điều khiển JDBC cho các hệ quản trị CSDL khác nhau đƣợc Sun cung cấp và cập nhật liên tục tại địa chỉ: http://industry.java.sun.com/products/jdbc/drivers

Các trình điều khiển JDBC đƣợc phân làm 04 loại khác nhau

-Loại 1: Bridge Driver kết nối với các hệ CSDL thông qua cầu nối ODBC, dùng trong ngày đầu Java xuất hiện, ngày nay không còn phổ biến do có nhiều hạn chế Nó cung cấp kèm trong bộ J2SE với tên: sun.jdbc.odbc.JdbcOdbcDriver

-Loại 2: Native API Driver : chuyển các lời gọi của JDBC API sang thƣ viện hàm (API) tương ứng với từng hệ CSDL cụ thể Trình điều khiển do nhà xây dựng hệ CSDL cung cấp

-Loại 3: JDBC-Net Driver : chuyển các lời gọi JDBC API sang một dạng chuẩn độc lập với các hệ CSDL, và sau đƣợc chuyển sang lời gọi của hệ CSDL cụ thể bỡi 1 chương trình trung gian Trình điều khiển của các nhà cung ứng thứ 3 thường thuộc loại này Lợi thế của trình điều khiển loại này là không cần cung cấp mã lệnh kèm theo và có thể sử dụng cùng một trình điều khiển để truy cập đến nhiều hệ CSDL khác nhau

-Loại 4: Native Protocol Driver : chuyển các lời gọi JDBC API sang mã lệnh của hệ CSDL cụ thể Đây là các trình điều khiển thuần Java, có nghĩa là không cần phải có mã lệnh của hệ CSDL cụ thể khi thi hành chương trình.

Viết chương trình làm việc với csdl qua jdbc

Với 1 chương trình viết bởi ngôn ngữ Java có sử dụng JDBC cho việc giao tiếp với cơ sở dữ liệu thì bạn phải thực hiện 5 bước như sau:

1) Nạp trình điều khiển kết nối (Load Driver)

2) Thiết lập kết nối đến cơ sở dữ liệu thông qua Connection String (Establish a database connection)

3) Tạo và thực thi 1 câu lệnh truy vấn đến cơ sở dữ liệu (Create and execute an SQL Statement)

4) Xử lý kết quả nhận về sau khi thi hành lệnh truy vấn thành công trên cơ sở dữ liệu (Process the results)

5) Đóng kết nối và giải phóng tài nguyên đ dành cho kết nối đó (Close the database connection) ƣớc 1: Nạp trình điều hiển ết n i Lo d Driver : Để tiến hành nạp trình điều khiển kết nối, bạn phải dùng phương thức forName của lớp Class để tạo ra 1 thể hiện của lớp kết nối dựa trên giao thức mà JDBC cung cấp Cú pháp của lệnh này nhƣ sau public static Class forName(String ClassName) throws ClassNotFoundExcepti on

Ví dụ : sử dụng kết nối theo kiểu 1 của JDBC (ODBC-JDBC Bridge) thì câu lệnh để load driver cho kiểu này là:

Class.forName(“jdbc:odbc:JdbcOdbcDriver”);

Chú ý: Chu i “jdbc:odbc:JdbcOdbcDriver” dùng làm tham số của hàm chính là giao thức điều khiển dành cho kết nối loại 1 của JDBC

Trình điều khiển của MySQL:

Class.forName(“org.gjt.mm.mysql.Driver”);

Trình điều khiển của Oracle:

Class.forName(“oracle.jdbc.driver.OracleDriver”);

Trình điều khiển của Sybase: Class.forName(“com.sybase.jdbc.SybDriver”); Trình điều khiển qua cầu nối ODBC:

Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);

Chú ý: Nếu chúng ta có sử dụng tới OBBC, thì đầu tiên phải tạo nguồn ODBC cho ứng dụng

Ví dụ trên windows (Access database), Start -> Control Panel -> Administrative

Tools -> Data Sources (ODBC) Đối với MySQL, ta phải tải một gói driver có tên MySQL Connector J JDBC driver về từ: http://dev.mysql.com/downloads/ Giải nén sau đó add tập tin jar vào project, ví dụ trên Eclipse nhƣ sau:

- Trong trường hợp khác, bạn muốn kết nối đến cơ sở dữ liệu bằng kiểu kết nối thứ 4 của JDBC đối với cơ sở dữ liệu SQL Server, ta có thể thực hiện nhƣ sau

Class.forName(“com.microsoft.sqlserver.jdbc.SQLServerDriver”);

Chú ý : Trong tình huống này thì chu i

“com.microsoft.sqlserver.jdbc.SQLServerDriver” dùng làm tham số của hàm chính là giao thức điều khiển dành cho kết nối loại 4 của JDBC đối với cơ sở dữ liệu SQL Server ƣớc 2: Thiết l p ết n i đến cơ sở dữ liệu (Establish a database connection)

Việc kết nối với CSDL được thực hiện với một trong các phương thức sau trong lớp DriverManager:

-public static Connection getConnection(String url) throws SQLException: thực hiện kết nối vớiCSDL đƣợc yêu cầu Bộ quản lý trình điều khiển sẽ tự động lựa chọn trình điều khiển phù hợp trong số các trình điều khiển đã đƣợc nạp

-public static Connection getConnection(String url, String user, String pass) throws SQLException:tiến hành kết nối tới CSDL với tài khoản user và mật mã pass

-public static Connection getConnection(String url, Properties info) throws SQLException: tương tự hai phương thức trên ngoài ra cung cấp thêm các thông tin qui định thuộc tính kết nối thông qua đối tƣợng của lớp Properties

Kết quả trả về của các phương thức trên là đối tượng của lớp java.sql.Connection đƣợc dùng để đại diện cho kết nối đếnCSDL

Ví dụ: kết nối đến Database có tên qlCuocHen đ tạo ra trong SQL Server thông qua tài khoản sa với mật khẩu là 123456 thông qua kiểu kết nối thứ nhất của JDBC Câu lệnh có thể viết nhƣ sau

String strConnect ="jdbc:odbc:driver={SQL Server};Server=BODUA-D778EAB2E; Database =qlCuocHen; UserName=sa; Password3456";

Connection cnObj = DriverManager.getConnection(strConnect);

Chú ý: Cú pháp của chu i kết nối đƣợc mô tả nhƣ sau

“jdbc:odbc:driver={SQLServer};Server=; Database=;UserN ame=;Password=”

Tương tự, nếu sử dụng kiểu kết nối thứ nhất, bạn có thể sử dụng connection String theo cú pháp nhƣ sau

“dbc:sqlserver://:;databaseName=;user=; password=" ƣớc 3: Tạo và th c thi 1 c u tru v n dữ liệu dạng SQL (Create and Execute an SQL Statement)

Khi 1 kết nối đ đƣợc thiết lập đến Database thành công, để có thể tác động lên cơ sở dữ liệu thông qua connection đó thì bạn phải tạo ra 1 đối tƣợng để có thể thực thi các tác động lên cơ sở dữ liệu của chương trình thông qua các câu lệnh dạng SQL, đối tƣợng đó có thể là object của 1 trong 3 lớp sau :

(Trong ph m vi này t i m tả cho việc s d ng i t ng Statement)

Nhƣ vậy, sau khi thiết lập kết nối thành công, ta phải tạo ra 1 đối tƣợng

Statement để nhận về 1 thể hiện của lớp này thông qua phương thức createStatement() của đối tƣợng Connection đ thiết lập

Cú pháp public Statement createStatement() throws SQLException

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

String Url=""jdbc:odbc:driver={SQLServer};Server=BODUA-D778EAB2E; Databas e =qlCuocHen;UserName=sa; Password3456";"; ketNoi= DriverManager.getConnection(Url);

Statement stCmd = this.ketNoi.createStatement(); ƣớc 4: X l ết quả nh n về s u hi thi hành lệnh tru v n thành c ng tr n cơ sở dữ liệu Process the results

Một đối tƣợng của lớp Statement, sau khi tạo ra có thể thực thi 1 lệnh SQL tác động lên cơ sở dữ liệu thông qua phương thức executeQuery() (hay executeUpdate() – thường dùng khi cần thực hiện các câu lệnh SQL dạng DDL: Data Definition Language) Kết quả trả về khi thực thi lệnh executeQuery sẽ là 1 đối tƣợng của lớp

ResultSet chứa thông tin là kết quả truy vấn đƣợc từ cơ sở dữ liệu Cú pháp của lệnh này nhƣ sau: public ResultSet executeQuery(String strQuery) throws SQLException

Với 1 đối tượng ResultSet, bạn có thể sử dụng các phương thức tiêu biểu để thao tác đối với dữ liệu, hay điều khiển đối tƣợng này nhƣ sau

next() –chuyển con tr sang m u tin kết tiếp để truy xuất dữ liệu

getString(tenCot) – đọc thông tin của 1 trường thông tin dạng chu i có trong kết quả trả về của ResultSet Tương tự đối với các kết quả dạng khác của các kiểu thuộc dạng Primitive data type nhƣ : int, boolean, byte, long, float, double … Các phương thức tương ứng có thể lần lượt là : getInt (tenCot); getBoolean (tenCot); getByte (tenCot); getLong (tenCot); getFloat (tenCot); getDouble (tenCot)… Các hàm này thường overload 2 dạng, dạng thứ nhất sử dụng tham số kiểu chu i chỉ ra tên của cột chứa thông tin muốn đọc, dạng thứ 2 kiểu int mô tả cho chỉ số của cột muốn đọc

Ví Dụ:Giả sử sau khi đ tạo kết nối thành công, ta tạo 1 đối tƣợng của lớp Statement và đọc dữ liệu của bảng chứa thông tin là tên của các thành viên có trong dsNguoiQuen của database qlCuocHen, với các thông tin cần đọc về bao gồm các trường : hoNQ, tenNQ, gioiTinh, tuoiNQ Ta sẽ làm như sau

String strQuery= “Select hoNQ, tenNQ, gioiTinh, tuoiNQ from dsNguoiQuen;”; ResultSet kq = stCmd.executeQuery(strQuery);

// L p trong khi c n c c d li u trong ResultSet

System.out.print(“ H v{ t n :” kq.getString(“hoNQ”) “ ” kq.getString(“t enNQ”);

System.out.print(“Gi i t nh :” (kq.getBoolean(“gioiTinh”) ”Nam”:”N ”)); System.out.println(“Hi n nay : “ kq.getInt(“tuoiNQ”).toString() ” Tu i”); }

Ho c ta c th truy xu t n ch s c a c t nh sau

// L p trong khi c n c c d li u trong ResultSet

System.out.print(“ H v{ t n :” kq.getString( ) “ ” kq.getString(2); System.out.print(“Gi i t nh :” (kq.getBoolean( ) ”Nam”:”N ”));

System.out.println(“Hi n nay : “ kq.getInt( ).toString() ” Tu i”);

} ƣớc 5: Đóng kết nối và giải phóng tài nguyên (Close the database connection) public void close() throws SQLException

Kiểu dữ liệu sql và kiểu dữ liệu java

Trong quá trình thao tác với CSDL, chúng ta sẽ gặp phải vấn đề chuyển đổi giữa kiểu dữ liệu trong CSDL sang kiểu dữ liệu Java h trợ và ngƣợc lại Việc chuyển đổi này đƣợc thực hiện nhƣ trong 2 bảng sau

Bảng 1: 1 Bảng chuyển ổi từ kiểu dữ liệu SQL sang Java

Bảng 1: 2 Bảng chuyển ổi từ kiểu dữ liệu Java sang SQL

Statement và Resulset

Sau đây chúng ta sẽ tìm hiểu kỹ hơn về hai đối tƣợng Statement và ResultSet Statement là một đối tƣợng giúp thực thi những câu lệnh sql và trả về kết quả Để có đối tƣợng này, chúng ta dùng hàm createStatement của lớp Connection Một số hàm quan trọng trong Statement nhƣ sau:

1 executeQuery() thực thi một câu lệnh có lấy giá trị trả về

2 executeUpdate() thực thi một câu lệnh mà không lấy giá trị trả về từ database

3 getConnection() trả về đối tƣợng Connection mà đ tạo ra Statement này

ResultSet là tập các kết quả trả về khi thực thi một câu lệnh sql Một vài phương thức quan trọng trong ResultSet nhƣ:

• getXXX (XXX là các kiểu dữ liệu cơ bản nhƣ Int, Float, String, Object, …) dùng để lấy về dữ liệu

• updateXXX dùng để cập nhật dữ liệu cho ResultSet

• next() di chuyển con tr tới bản ghi kế tiếp từ vị trí hiện hành

• previous() di chuyển con tr ngƣợc lại một dòng từ vị trí hiện hành

• last() di chuyển con tr tới bản ghi cuối cùng của ResultSet

• first() di chuyển con tr tới bản ghi đầu tiên trong ResultSet

• getArray() trả về giá trị trong một cột thành một mảng

• insertRow() thêm một bản ghi vào trong ResultSet và trong database

• deleteRow() xóa một bản ghi trong ResultSet và trong database

Hãy xem xét ví dụ sau: import java.sql.Connection; import java.sql.Driver; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class ConnectDemo0 { public static void main(String[] args) {

Class.forName("com.mysql.jdbc.Driver"); con = DriverManager.getConnection("jdbc:mysql://localhost:3306 /k7g"

System.out.println("connection ok");

String sql1 = "select * from sinhvien";

ResultSet rs = stm.executeQuery(sql1); while(rs.next()){

System.out.print(rs.getInt(1)+"-");

System.out.print(rs.getString("hoten")+"-");

System.out.print(rs.getString("diachi")+"-");

System.out.print(rs.getString(4)+"-");

System.out.print(rs.getInt(5));

} rs.close(); stm.close(); con.close();

PreparedStatement Interface là một interface con của Statement Nó đƣợc sử dụng để thực thi các truy vấn đƣợc tham số hóa Tất cả tham số trong JDBC đƣợc biểu diễn bởi ký tự ? (còn đƣợc biết với tên gọi là Parameter Marker) Ta phải cung cấp các giá trị cho m i tham số trước khi thực thi lệnh SQL

Phương thức setXXX() gắn kết các giá trị tới các tham số, trong đó XXX biểu diễn kiểu dữ liệu trong Java của giá trị mà ta muốn gắn kết cho tham số đầu vào Nếu quên cung cấp các giá trị, thì sẽ gặp SQLException

Các phương thức của PreparedStatement Interface

Dưới đây là một số phương thức quan trọng của PreparedStatement Interface:

1 public void setInt(int paramIndex, int giaTri)

Thiết lập tham số đ cho tới giá trị nguyên trong Java đ cung cấp Driver sẽ chuyển đổi giá trị này thành một giá trị nguyên trong SQL khi nó gửi giá trị tới Database

Trong đó, paramIndex là tham số đầu tiên, tham số thứ hai, …; giaTri là giá trị của tham số

2 public void setString(int paramIndex, String giaTri)

Thiết lập tham số đ cho thành giá trị String trong Java đ cung cấp Driver chuyển đổi giá trị này thành một kiểu VARCHAR hoặc LONGVARCHAR (tùy thuộc vào kích cỡ tham số) khi nó gửi giá trị tới Database (Miêu tả về tham số nhƣ trên.)

3 public void setFloat(int paramIndex, float giaTri)

Thiết lập tham số đ cho thành giá trị float trong Java đ cung cấp Driver chuyển đổi giá trị này thành một giá trị REAL trong SQL khi nó gửi giá trị tới Database (Miêu tả về tham số nhƣ trên.)

4 public void setDouble(int paramIndex, double giaTri)

Thiết lập tham số đ cho thành giá trị double trong Java đ cung cấp Driver chuyển đổi giá trị này thành một giá trị DOUBLE trong SQL khi nó gửi giá trị tới Database (Miêu tả về tham số nhƣ trên.)

Thực thi truy vấn SQL trong đối tƣợng PreparedStatement này, mà phải là một lệnh DML (lệnh thao tác dữ liệu) trong SQL nhƣ INSERT, UPDATE hoặc DELETE, hoặc một lệnh SQL mà không trả về bất cứ cái gì, chẳng hạn nhƣ một lệnh DDL (nhƣ CREATE, ALTER, …)

6 public ResultSet executeQuery() throws SQLException

Thực thi truy vấn SQL trong đối tƣợng PreparedStatement này và trả về đối tượng ResultSet được tạo bởi truy vấn Phương thức này ném ngoại lệ SQLException và SQLTimeoutException

//Buoc 1: can inport cac package can thiet import java.sql.*; public class ViDuJDBC {

// Ten cua driver va dia chi URL cua co so du lieu static final String JDBC_DRIVER = "com.mysql.jdbc.Driver"; static final String DB_URL = "jdbc:mysql://localhost/sinhvien";

// Ten nguoi dung va mat khau cua co so du lieu static final String USER = "root"; static final String PASS = "123456"; public static void main(String[] args) {

Class.forName("com.mysql.jdbc.Driver");

// Buoc 3: Mo mot ket noi

System.out.println("Dang ket noi toi co so du lieu "); conn = DriverManager.getConnection(DB_URL,USER,PASS);

// Buoc 4: Thuc thi truy van

System.out.println("Tao cac lenh truy van SQL ");

String sql = "UPDATE sinhvienk60 SET diemthi=? WHERE mssv=?"; stmt = conn.prepareStatement(sql);

// Gan ket cac gia tri vao trong cac tham so stmt.setInt(1, 6); // Lenh nay se thiet lap diemthi stmt.setInt(2, 1); // Lenh nay se thiet lap mssv

// Bay gio cap nhat diem thi cua ban ghi co mssv=1; int rows = stmt.executeUpdate();

System.out.println("So hang bi tac dong : " + rows );

// Lua chon tat ca ban ghi va hien thi chung sql = "SELECT mssv, ho, ten, diemthi FROM sinhvienk60";

ResultSet rs = stmt.executeQuery(sql);

// Buoc 5: Lay du lieu tu Result Set while(rs.next()){

// Lay du lieu boi su dung ten cot int mssv = rs.getInt("mssv"); int diemthi = rs.getInt("diemthi");

String ho = rs.getString("ho");

String ten = rs.getString("ten");

// Hien thi cac gia tri

System.out.print("\nMSSV: " + mssv);

System.out.print("\nHo: " + ho);

System.out.println("\nTen: " + ten);

System.out.print("\nDiem Thi: " + diemthi);

// Buoc 6: Don sach moi truong va giai phong resource rs.close(); stmt.close(); conn.close();

// Xu ly cac loi cho JDBC se.printStackTrace();

// Xu ly cac loi cho Class.forName e.printStackTrace();

// Khoi finally duoc su dung de dong cac resource try{ if(stmt!=null) stmt.close();

} try{ if(conn!=null) conn.close();

}catch(SQLException se){ se.printStackTrace();

System.out.println("\nVietJack chuc cac ban hoc tot!");

Transaction trong JDBC

Giao dịch (Transaction) là một khái niệm quan trọng trong SQL Transaction đảm bảo tính toàn vẹn dữ liệu Các câu lệnh trong Transaction đƣợc gọi là thành công nếu cả câu lệnh thành công Ngƣợc lại chỉ cần 1 trong các câu lệnh l i thì coi nhƣ giao dịch không thành công, phải rollback lại trạng thái ban đầu

Ví dụ: Người A chuyển một khoản tiền 1000$ vào tài khoản người B như vậy trong Database diễn ra 2 quá trình:

- Trừ số dư tài khoản của người A đi 1000$

- Thêm vào số dư tài khoản của người B 1000$

Nếu không có transaction thì một trong 2 quá trình l i gây tổn thất cho phía ngân hàng hoặc cho người dùng

Hình 1: 3 Các tr ng thái của Transaction

Các thuộc tính ACID miêu tả rõ ràng nhất về Transaction 4 thuộc tính này bao gồm Atomicity, Consistency, Isolation và Durability, trong đó:

-Atomicity: nghĩa là tất cả thành công hoặc không

-Consistency: bảo đảm rằng tính đồng nhất của dữ liệu

-Isolation: bảo đảm rằng Transaction này là độc lập với Transaction khác -Durability: nghĩa là khi một Transaction đ đƣợc ký thác thì nó sẽ v n tồn tại nhƣ thế cho dù xảy ra các l i, …

Theo mặc định, kết nối JDBC là trong chế độ auto-commit, tức là m i lệnh SQL đƣợc ký thác tới Database m i khi nó kết thúc Điều này là tốt với các ứng dụng nh khi mà số lƣợng đơn vị công việc là nh và không phức tạp Với các ứng dụng trung bình và lớn, việc quản lý riêng Transaction giúp bạn cải thiện rõ rệt hiệu suất và duy trì tính toàn vẹn của tiến trình

Trong JDBC, Connection Interface cung cấp các phương thức sau để quản lý transaction:

1 void setAutoCommit(boolean status): Là true theo mặc định Để thao tác với Transaction, bạn nên thiết lập về false

2 void commit(): Để ký thác các thay đổi bạn đ thực hiện

3 void rollback(): Xóa tất cả các thay đổi đ được thực hiện trước đó và quay về trạng thái trước khi thực hiện thay đổi

4 setSavepoint(String ten_cua_savepoint): Định nghĩa một savepoint mới Phương thức này cũng trả về một đối tượng Savepoint

5 releaseSavepoint(Savepoint ten_cua_savepoint): Xóa một savepoint Phương thức này nhận một đối tượng Savepoint làm tham số

6 rollback (String ten_cua_savepoint): Quay về trạng thái của savepoint đ cho

Ví Dụ: H y xem xét ví dụ sau khi thực hiện insert 2 user vào database User 1 insert thành công, User không insert đƣợc do bị l i SQL Nếu không có transaction thì User 1 được lưu vào database Chúng ta không mong muốn điều này import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; public class TransactionExample { public static void main(String[] args) throws SQLException { try (Connection con = ConnectionUtils.openConnection();

Statement st = con.createStatement();) { con.setAutoCommit(false); // 1 Disable individualtransaction try {

// This user will be inserted st.executeUpdate("INSERT INTO user(username, password, cre atedDAte) "+ "VALUE('user-1', '123', now());");

System.out.println("Inserted user-1 successfully");

// This is an error sql Cannot insert user st.executeUpdate("INSERT INTO user2(username, password, cr eatedDAte) + "VALUE('user-2', '123', now());");

System.out.println("Inserted user-2 successfully"); con.commit(); // 2 commit data to database if all command are success

} catch (Exception e) { e.printStackTrace(); con.rollback(); // 2 roll-back data if one of command are failed

System.out.println("Rollback data");

Với ví dụ trên ta sẽ có kết quả nhƣ sau:

Inserted user-1 successfully java.sql.SQLSyntaxErrorException: Table 'jdbcdemo.user2' doesn't exist at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120) at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97) at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExcepti onsMapping.java:122) at com.mysql.cj.jdbc.StatementImpl.executeUpdateInternal(StatementImpl.java:1335) at com.mysql.cj.jdbc.StatementImpl.executeLargeUpdate(StatementImpl.java:2108) at com.mysql.cj.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1245) at com.gpcoder.TransactionExample.main(TransactionExample.java:21)

Batch Processing là nhóm các lệnh có liên quan vào trong một batch và thực thi chúng Trong đó, các thao tác lệnh của chương trình được thực thi liên tiếp nhau mà không cần sự can thiệp của người dùng

Việc ứng dụng Batch Processing trong cơ sở dữ liệu là rất tiện lợi Khi bạn gửi một số lệnh SQL cùng một lúc, bạn đ giảm đƣợc chi phí thời gian giao tiếp và vì thế nâng cao đƣợc hiệu suất

Một số phương thức h trợ Batch Processing:

1 addBatch(String sql) : thêm các lệnh đơn tới batch Tham số sql ở đây là một lệnh insert, update hoặc delete Phương thức này không được gọi trên một đối tƣợng PreparedStatement và CallableStatement

2 int[] executeBatch() :bắt đầu sự thực thi của tất cả các lệnh đ đƣợc nhóm lại với nhau này Các phần tử trong mảng được trả về bởi phương thức này có thể là:

Một giá trị lớn hơn hoặc bằng 0 chỉ rằng lệnh đƣợc thực thi thành công Và giá trị đó (gọi là update count) là số hàng trong cơ sở dữ liệu bị tác động bởi sự thực thi của lệnh

Một giá trị SUCCESS_NO_INFO chỉ rằng lệnh đƣợc thực thi thành công nhƣng không biết số hàng bị tác động bởi lệnh

Một giá trị EXECUTE_FAILED chỉ rằng lệnh đ thực thi thất bại

3 clearBatch() : xóa lệnh đ thêm kh i batch

Ví dụ: Một trong những trường hợp thường sử dụng tính năng này là import dữ liệu Giả sử chúng ta có một file csv chứa danh sách user, sau khi đọc file chúng ta sẽ insert danh sách này vào database Chúng ta có thể call executeUpdate() cho từng user Tuy nhiên, nó sẽ gặp vấn đề về performance nếu danh sách user của chúng ta rất lớn Một trong những cách rất hay và thường được sử dụng là Batch Processing public class BatchProcessingExample { public static void main(String[] args) throws SQLException {

String sqlInsert = "INSERT INTO user(username, password, createdDA te) "+ " VALUE(?, ?, ?);"; try (

PreparedStatement pstm =con.prepareStatement(sqlInsert, St atement.RETURN_GENERATED_KEYS);) { try { con.setAutoCommit(false);

List users = readUsersFromCsvFile(); for (User user : users) { pstm.setString(1, user.getUsername()); pstm.setString(2, user.getPassword()); pstm.setDate(3, user.getCreatedDate()); pstm.addBatch(); // Add user to batch

// Executes the SQL statement int[] counts = pstm.executeBatch();

System.out.println("Affected row [0] = " + counts[0]); System.out.println("Affected row [1] = " + counts[1]); con.commit();

} catch (Exception e) { e.printStackTrace(); con.rollback();

List users = new ArrayList(); for (int i = 1; i

javax.servlet.ServletException

java.io.IOException /ErrorHandler

Nếu ta muốn có một Error Handler chung cho tất cả Exception, thì ta nên định nghĩa error-page sau thay cho việc định nghĩa từng phần tử error-page riêng biệt cho m i exception

java.lang.Throwable /ErrorHandler

Sau đây là một số điểm đáng chú ý trong web.xml trên để Xử lý Exception:

- ErrorHandler được định nghĩa theo cách thông thường như bất kỳ Servlet nào khác và đƣợc định cấu hình bên trong web.xml

- Nếu có bất kỳ l i nào với Status code hoặc 404 (Not Found) hoặc 403 (Forbidden), thì ErrorHandler servlet này sẽ đƣợc triệu hồi

- Nếu ứng dụng web ném hoặc ServletException hoặ IOException, thì Web container triệu hồi ErrorHandler servlet này

- Ta có thể định nghĩa các Error Handler khác nhau để xử lý các loại Error hoặc Exception khác nhau Ví dụ trên là một ví dụ chung và hi vọng rằng nó sẽ giải thích cho ta hiểu về khái niệm cơ bản này

- Các thuộc tính Request: Error/Exception

Bảng dưới liệt kê các thuộc tính request mà một Servlet xử lý l i có thể truy cập để phân tích bản chất của Error/Exception:

STT Thuộc tính và Mi u tả

1 javax.servlet.error.status_code

Thuộc tính này cung cấp status code mà có thể được lưu giữ và được phân tích sau khi lưu giữ trong kiểu dữ liệu java.lang.Integer

2 javax.servlet.error.exception_type

Thuộc tính này cung cấp thông tin về loại exception mà có thể được lưu giữ và được phân tích sau khi lưu giữ trong một kiểu dữ liệu java.lang.Class

Thuộc tính này cung cấp thông báo l i chính xác mà có thể được lưu giữ và được phân tích sau khi lưu giữ trong một kiểu dữ liệu java.lang.String

4 javax.servlet.error.request_uri

Thuộc tính này cung cấp thông tin về URL đang triệu hồi tới Servlet và nó có thể được lưu giữ và được phân tích sau khi lưu giữ trong một kiểu dữ liệu java.lang.String

Thuộc tính này cung cấp thông tin về exception mà có thể được lưu giữ và được phân tích sau khi lưu giữ trong kiểu dữ liệu java.lang.Throwable

6 javax.servlet.error.servlet_name

Thuộc tính này cung cấp tên Servlet mà có thể được lưu và được phân tích sau khi lưu giữ trong một kiểu dữ liệu java.lang.String

Bảng 3: 10 Các thuộc tính Error/Exception

Ví dụ về xử lý ngoại lệ Servlet

Sau đây là ví dụ về Servlet mà sẽ đƣợc sử dụng nhƣ là Error Handler trong bất kỳ trường hợp nào có error hoặc exception xuất hiện với bất kỳ Servlet nào đ định nghĩa Ví dụ này giúp ta hiểu hơn về Xử lý ngoại lệ trong Servlet, và ta có thể viết các chương trình phức tạp hơn bởi cùng sử dụng khái niệm này

// Import required java libraries import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import java.util.*;

// Extend HttpServlet class public class ErrorHandler extends HttpServlet {

// Method to handle GET method request public void doGet(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException

Throwable throwable = (Throwable) request.getAttribute("javax.servlet.error.exception"); Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code"); String servletName = (String) request.getAttribute("javax.servlet.error.servlet_name")

; if (servletName == null){ servletName = "Unknown";

String requestUri = (String) request.getAttribute("javax.servlet.error.request_uri"); if (requestUri == null){ requestUri = "Unknown";

// Set response content type response.setContentType("text/html");

String title = "Error/Exception Information";

String docType "\n"; out.println(docType +

"" + title + "\n" +

"\n"); if (throwable == null && statusCode == null){ out.println("

Error information is missing

"); out.println("Please return to the Home Page.");

}else if (statusCode != null){ out.println("The status code : " + statusCode);

}else{ out.println("

Error information

"); out.println("Servlet Name : " + servletName +

""); out.println("Exception Type : " + throwable.getClass( ).getName( ) +

""); out.println("The request URI: " + requestUri +

""); out.println("The exception message: " + throwable.getMessage( )); } out.println(""); out.println("");

// Method to handle POST method request public void doPost(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException { doGet(request, response);

Biên dịch ErrorHandler.java theo cách thông thường và đặt class file trong

/webapps/ROOT/WEB-INF/classes

Chúng ta thêm cấu hình sau trong web.xml để xử lý ngoại lệ:

ErrorHandler

ErrorHandler

ErrorHandler

/ErrorHandler

java.lang.Throwable /ErrorHandler

Xử lý ngoại lệ (Exception) trong Servlet

Cung cấp cho sinh viên kỹ năng lập trình java web sử dụng công nghệ JSP tạo ra các trang web động tạo nội dung dựa trên các thẻ hoặc biểu thức Java Sử dụng các đối tƣợng ẩn(implicit objects) nhƣ request, response, session, application giúp quản lý dữ liệu và trạng thái của ứng dụng Kết hợp với Servlet đ được học ở chương 3 và ứng dụng trong mô hình MVC (Model-View-Controller) để tách biệt logic dữ liệu (Model), hiển thị (View), điều khiển (Controller), kết hợp với các tính năng bảo mật của java

- Vòng đời, cấu trúc và tiến trình của một JSP

- Các cú pháp chính trong JSP, Các Thẻ JSP, các đối tƣợng ẩn(Implicit), Thƣ viện thẻ chuẩn Standard Tag Library (JSTL), Client Request, Server Response, JavaBeans, xử lý ngoại lệ(Exception), gỡ l i và bảo mật trong JSP

4.1 Java Server Pages (JSP) là gì?

JavaServer Pages (JSP) là một công nghệ để phát triển các Webpage mà h trợ nội dung động, giúp các lập trình viên chèn java code vào trong các HTML page bằng việc sử dụng các JSP tag đặc biệt, hầu hết bắt đầu với

Một thành phần JavaServer Pages (JSP) là một loại Java Servlet, đƣợc thiết kế để thực hiện vai trò của một giao diện người dùng (User Interface) cho một ứng dụng Java Web Lập trình viên Web viết JSPs nhƣ là các text file mà kết nối HTML code hoặc XHTML code, phần tử XHTML, và các JSP actions và câu lệnh JSP đƣợc nhúng

Sử dụng JSP, bạn có thể thu thập input từ người dùng thông qua các Webpage Form, trình bày các record từ một Database hoặc đăng ký quyền ưu tiên của người dùng, truy cập các thành phần JavaBeans, truyền điều khiển giữa các page và chia sẻ thông tin giữa các Request, page, …

4.1.1 Tại sao sử dụng JSP?

JavaServer Pages (JSP) thường hoạt động với cùng mục đích như các chương trình độc lập bởi sử dụng Common Gateway Interface (CGI) Nhưng JSP thường có một số lợi thế trong khi so sánh với CGI:

- Hiệu năng tốt hơn đáng kể bởi vì JSP cho phép nhúng các phần tử động trong chính các HTML page thay vì phải có một CGI file riêng biệt

- JSP luôn luôn được biên dịch trước khi nó được xử lý bởi Server, không giống nhƣ CGI/Perl mà yêu cầu Server tải một trình thông dịch (Interpreter) và Target Script m i khi trang đƣợc yêu cầu.

LẬP TRÌNH JSP

Java Server Pages (JSP) là gì?

JavaServer Pages (JSP) là một công nghệ để phát triển các Webpage mà h trợ nội dung động, giúp các lập trình viên chèn java code vào trong các HTML page bằng việc sử dụng các JSP tag đặc biệt, hầu hết bắt đầu với

Một thành phần JavaServer Pages (JSP) là một loại Java Servlet, đƣợc thiết kế để thực hiện vai trò của một giao diện người dùng (User Interface) cho một ứng dụng Java Web Lập trình viên Web viết JSPs nhƣ là các text file mà kết nối HTML code hoặc XHTML code, phần tử XHTML, và các JSP actions và câu lệnh JSP đƣợc nhúng

Sử dụng JSP, bạn có thể thu thập input từ người dùng thông qua các Webpage Form, trình bày các record từ một Database hoặc đăng ký quyền ưu tiên của người dùng, truy cập các thành phần JavaBeans, truyền điều khiển giữa các page và chia sẻ thông tin giữa các Request, page, …

4.1.1 Tại sao sử dụng JSP?

JavaServer Pages (JSP) thường hoạt động với cùng mục đích như các chương trình độc lập bởi sử dụng Common Gateway Interface (CGI) Nhưng JSP thường có một số lợi thế trong khi so sánh với CGI:

- Hiệu năng tốt hơn đáng kể bởi vì JSP cho phép nhúng các phần tử động trong chính các HTML page thay vì phải có một CGI file riêng biệt

- JSP luôn luôn được biên dịch trước khi nó được xử lý bởi Server, không giống nhƣ CGI/Perl mà yêu cầu Server tải một trình thông dịch (Interpreter) và Target Script m i khi trang đƣợc yêu cầu

- JavaServer Pages (JSP) đƣợc xây dựng ở trên cùng của Java Servlet API, vì thế, giống Servlet, JSP cũng có quyền truy cập tới tất cả Enterprise Java APIs mạnh mẽ, bao gồm JDBC, EJB, JAXP, …

- Các JSP page có thể đƣợc sử dụng để kết nối với Servlet mà xử lý Business logic, mô hình đƣợc h trợ bởi Java Servlet

- Cuối cùng, JSP là một phần toàn bộ của Java EE, một Platform đầy đủ cho các ứng dụng lớp Enterprise Nghĩa là, JSP có thể hoạt động nhƣ là một phần trong các ứng dụng đơn giản nhất cũng nhƣ các ứng dụng phức tạp

Dưới đây là các lợi thế của việc sử dụng JSP khi so sánh với các công nghệ khác:

- So với Active Server Pages (ASP): Lợi thế của JSP có thể coi là gấp đôi Đầu tiên, các phần động đƣợc viết bằng Java, không phải bằng Visual Basic hoặc ngôn ngữ MS khác, vì thế nó mạnh mẽ hơn và dễ dàng để sử dụng hơn Thứ hai, nó thích hợp cho các Hệ điều hành khác, không chỉ là Microsoft Web Server

- So với Pure Servlets: Nó tiện lợi hơn khi viết (và sửa đổi) HTML, vì có nhiều lệnh printIn hơn

- So với Server-Side Includes (SSI): SSI chỉ dành cho các thể đơn giản, không dành cho các chương trình "thực" mà sử dụng Form Data, tạo kết nối Database

- So với JavaScript: JavaScript có thể tạo HTML động trên Client nhƣng lại tương tác khó khan với Web Server để thực hiện các tác vụ phức tạp như truy cập Database và xử lý hình ảnh, …

- Với Static HTML: Tất nhiên, HTML thông thường không thể chứa thông tin động

Web Server cần một JSP engine ví dụ: Container) để xử lý các JSP page JSP container có nhiệm vụ chặn các Request cho các JSP page Bài hướng d n này sử dụng Apache, mà có JSP container có sẵn, để h trợ phát triển các JSP page

Một JSP container làm việc với Web Server để cung cấp môi trường runtime và các dịch vụ khác mà một JSP cần đến Nó biết cách để hiểu các phần tử đặc biệt mà là một phần của JSP

Sơ đồ sau minh họa vị trí của JSP container và JSP file trong một Web Application

Dưới đây là các bước giải thích cách Web Server tạo các Webpage bởi sử dụng JSP:

- Với một trang thông thường, trình duyệt gửi một HTTP request tới Web server

- Web server nhận ra rằng HTTP request là cho một JSP page và chuyển nó tới một JSP engine Điều này đƣợc thực hiện bởi sử dụng một URL hoặc một JSP page mà kết thúc với jsp thay vì html

- JSP engine tải JSP page từ đĩa và biến đổi nó thành một nội dung Servlet Sự biến đổi này là rất đơn giản, trong đó tất cả Template Text đƣợc biến đổi thành các lệnh printIn() và tất cả phần tử JSP đƣợc biến đổi thành Java code mà triển khai các hành vi động tương ứng của trang

- JSP engine biên dịch Servlet thành một lớp có thể thực thi và chuyển Request ban đầu tới một Servlet engine

Vòng đời (Life Cycle) trong JSP

Chìa khóa để tìm hiểu tính năng tầm thấp của JSP là hiểu vòng đời của nó

Vòng đời của JSP có thể đƣợc định nghĩa nhƣ là toàn bộ tiến trình từ khi tạo ra đến khi hủy nó, tương tự như vòng đời của một Servlet, nhưng thêm một bước để biên dịch một JSP thành Servlet

Sau đây là các giai đoạn trong vòng đời của của một JSP:

Bốn giai đoạn chủ yếu trong vòng đời của JSP là tương tự như vòng đời của Servlet và chúng nhƣ sau:

Hình 4: 3 Vòng ời của JSP i n dịch JSP

Khi môt trình duyệt yêu cầu một JSP, đầu tiên JSP engine kiểm tra để biết có hay không nó cần biên dịch trang này Nếu trang chƣa đƣợc biên dịch, hoặc nếu JSP đ đƣợc sửa đổi từ lần sửa đổi cuối cùng, thì JSP engine biên dịch trang này

Tiến trình biên dịch gồm 3 bước:

2) Biên dịch JSP thành một Servlet

Khi một container tải một JSP, nó gọi phương thức jspInit() trước khi phục vụ bất kỳ yêu cầu nào Nếu bạn cần thực hiện sự khởi tạo JSP riêng, ghi đề phương thức jspInit(): public void jspInit(){

Nét đặc trưng là, việc khởi tạo được thực hiện chỉ một lần và với phương thức int của Servlet, nói chung bạn khởi tạo các kết nối Database, mở các file, và tạo các bảng tra cứu trong phương thức jspInit

Giai đoạn này trong vòng đời JSP biểu diễn tất cả các tương tác với Request tới khi JSP đó bị hủy

Bất cứ khi nào một trình duyệt yêu cầu một JSP và trang đ đƣợc tải và đƣợc khởi tạo, thì JSP engine triệu hồi phương thức _jspService() trong JSP đó

Phương thức _jspService() nhận một HttpServletRequest và một

HttpServletResponse nhƣ là các tham số của nó void _jspService(HttpServletRequest request,

Phương thức _jspService() của một JSP được triệu hồi một lần cho m i yêu cầu và nó chịu trách nhiệm tạo Response cho Request đó và phương thức này cũng chịu trách nhiệm tạo các phản hồi tới tất cả 7 phương thức của HTTP, ví dụ: GET, POST, DELETE

Giai đoạn hủy một JSP trong vòng đời JSP biểu thị khi nào thì một JSP bị gỡ b kh i một container

Phương thức jspDestroy() trong JSP là phương thức hủy tương đương với trong Servlet Ghi đè phương thức jspDestroy khi bạn cần thực hiện bất kỳ quá trình hủy nào, ví dụ nhƣ giải phóng kết nối với Database, hoặc đóng các file

Phương thức jspDestroy() có form sau: public void jspDestroy()

// Your cleanup code goes here

Cú pháp trong JSP

Phần này trình bày về cú pháp đơn giản (ví dụ: các phần tử) liên quan tới lập trình JSP

Scriptlet có thể chứa bất kỳ số lượng lệnh, biến, khai báo phương thức hoặc Expression của ngôn ngữ Java nào mà là hợp lệ trong ngôn ngữ Scripting

Sau đây là cú pháp của Scriptlet trong JSP:

Có thể viết XML tương đương với cú pháp trên như sau:

Bất kỳ text, thẻ HTML, hoặc phần tử JSP nào bạn viết phải ở bên ngoài Scriptlet đó Sau đây là ví dụ đơn giản cho JSP:

Hello World

">

Nó sẽ cho kết quả sau:

Ví dụ trên có thể đƣợc viết bởi sử dụng vòng lặp while trong JSP nhƣ sau:

WHILE LOOP Example

Nó sẽ cho kết quả sau:

JSP h trợ tất cả toán tử logic và toán tử số học đƣợc h trợ bởi Java Bảng sau cung cấp danh sách tất cả toán tử với quyền ƣu tiên cao nhất đƣợc liệt kê ở trên cùng, và quyền thấp nhất là ở dưới cùng

Bên trong một expression, toán tử có quyền ƣu tiên cao hơn sẽ đƣợc tính toán trước

Loại Toán tử Thứ tự ưu tiên

Postfix () [] (toán tử dot) Trái sang phải

Tính nhân * / % Trái sang phải

Tính cộng + - Trái sang phải

Dịch chuyển >> >>> >= < , là tùy ý

Có 3 loại thẻ directive trong JSP:

Định nghĩa một thuộc tính page-dependent (phụ thuộc trang), nhƣ ngôn ngữ scripting, trang l i và các yêu cầu bộ đệm

Include một file trong suốt giai đoạn phiên dịch

Khai báo một thƣ viện thẻ, chứa các action tùy biến, đƣợc sử dụng trong trang đó

Bảng 4: 6 Các thẻ directive trong JSP

4.5.1 page Directive trong JSP page Directive trong JSP đƣợc sử dụng để cung cấp các chỉ lệnh tới container mà liên quan tới JSP page hiện tại Bạn có thể mã hóa page directive bất cứ đâu trong JSP page của bạn Theo qui ƣớc, page directive đƣợc mã hóa tại trên cùng của JSP page Sau đây là cú pháp cơ bản của page Directive trong JSP:

Bạn có thể viết XML tương đương với cú pháp trên như sau:

Các thuộc tính của page directive trong JSP

Bảng dưới liệt kê các thuộc tính liên kết với page Directive trong JSP:

Mục đích buffer Xác định một mô hình đệm cho Output Stream autoFlush Điều khiển hành vi của Output buffer của Servlet contentType Định nghĩa giản đồ m hóa ký tự errorPage Định nghĩa URL của JSP khác mà báo cáo trên Java các unchecked runtime exception isErrorPage Chỉ rằng nếu JSP page này là một URL đƣợc xác định bởi thuộc tính

ErrorPage của JSP page khác extends Xác định một lớp cha mà Servlet đ tạo phải kế thừa import Xác định một danh sách các package hoặc class để sử dụng trong JSP khi lệnh import trong Java làm việc cho các lớp Java info Định nghĩa một chu i mà có thể được truy cập với phương thức getServletInfo() của Servlet isThreadSafe Định nghĩa mô hình thread cho Servlet đ tạo language Định nghĩa ngôn ngữ lập trình đƣợc sử dụng trong JSP page session Xác định có hay không JSP page tham dự trong các HTTP session isELIgnored Xác định có hay không EL expression bên trong JSP page sẽ bị b qua isScriptingE nabled

Quyết định nếu các phần tử scripting đƣợc cho phép sử dụng

Bảng 4: 7 Các thuộc tính liên kết với page Directive

Ta có thể hiểu chi tiết hơn về các thuộc tính trên tại: Page Directive trong JSP

4.5.2 Include Directive trong JSP include Directive trong JSP đƣợc sử dụng để bao một file trong suốt giai đoạn phiên dịch Directive này nói cho container sáp nhập content của file ngoại vi khác với JSP hiện tại trong quá trình phiên dịch Bạn có thể mã hóa include directive bất cứ đâu trong JSP page

Dưới đây là form chung cho include directive trong JSP:

Tên file trong include directive là một URL quan hệ thực sự Nếu bạn chỉ xác định một tên file mà không có đường liên kết, thì JSP compiler giả sử rằng file đó là trong cùng thƣ mục nhƣ JSP của bạn

Bạn có thể viết XML tương đương với cú pháp trên:

Bạn có thể kiểm tra chi tiết về include directive tại: Include Directive trong JSP

Java Server Pages API cho phép bạn định nghĩa các Custom Tags trong JSP, mà giống nhƣ các thẻ HTML hoặc XML và một thƣ việc thẻ (tag library) là một tập hợp các thẻ được định nghĩa bởi người sử dụng mà triển khai các hành vi tùy biến taglib directive khai báo rằng: JSP page của bạn sử dụng một tập hợp các Custom Tags, thông báo vị trí của thư viện, và cung cấp một phương thức để nhận diện các Custom Tags đó trong JSP page của bạn

Cú pháp của taglib directive trong JSP nhƣ sau:

Ở đây, giá trị thuộc tính uri biểu diễn một vị trí mà container có thể hiểu và thuộc tính prefix thông báo một container về các bit đánh dấu nào là các action tùy biến Bạn có thể viết XML tương đương với cú pháp trên như sau:

Action trong JSP

JSP action sử dụng các chỉ lệnh trong cú pháp XML để điều khiển hành vi của Servlet engine Bạn có thể chèn động một file, tái sử dụng các thành phần JavaBeans, chuyển người dùng tới trang khác, hoặc tạo HTML cho Java plugin

Chỉ có một cú pháp cho phần tử Action trong JSP, khi nó tuân theo chuẩn XML

Về cơ bản, các phần tử Action là các hàm tiền định nghĩa và có các action trong JSP có sẵn sau:

Cú pháp Mục đích jsp:include Include một file tại thời điểm trang đó đƣợc yêu cầu jsp:useBean Tìm kiếm hoặc thuyết minh một JavaBean jsp:setProperty Thiết lập thuộc tính của một JavaBean jsp:getProperty Chèn thuộc tính của một JavaBean vào trong output jsp:forward Chuyển người yêu cầu tới trang mới jsp:plugin Tạo code cho trình duyệt riêng mà tạo một thẻ OBJECT hoặc

EMBED cho Java plugin jsp:element Định nghĩa động các phần tử XML jsp:attribute Định nghĩa động thuộc tính của phần tử XML đ đƣợc định nghĩa jsp:body Định nghĩa động phần thân của phần tử XML đ đƣợc định nghĩa jsp:text Sử dụng để viết template text trong các JSP page và tài liệu JSP

Bảng 4: 8 Các Action trong JSP

Các thuộc tính phổ biển của action trong JSP

Có hai thuộc tính phổ biến cho các phần tử Action: thuộc tính id và thuộc tính scope:

Thuộc tính id: Thuộc tính này nhận diện một cách duy nhất phần tử Action, và cho phép action để đƣợc tham chiếu bên trong JSP page Nếu Action tạo một đối tƣợng, thì giá trị id có thể đƣợc sử dụng để tham chiếu nó thông qua đối tƣợng ẩn PageContext Thuộc tính scope: Thuộc tính này nhận diện vòng đời của phần tử Action Thuộc tính id và thuộc tính scope đƣợc liên quan trực tiếp, khi thuộc tính scope quyết định vòng đời của đối tƣợng mà liên kết với id Thuộc tính scope có thể có 4 giá trị: page, request, session, và application

4.6.1 Action trong JSP

Action này cho phép bạn chèn các file vào trong các trang đang đƣợc tạo Cú pháp nhƣ sau:

Không giống include directive, mà chèn file tại thời điểm JSP page đƣợc phiên dịch thành một Servlet, include action này chèn file tại thời điểm page đƣợc yêu cầu Bảng sau liệt kê các thuộc tính liên quan với include action trong JSP:

Thuộc tính Mi u tả page URL quan hệ của trang để đƣợc include flush Thuộc tính Boolean quyết định có hay không nguồn được bao có bộ đệm của nó được flush trước khi nó được bao

Bảng 4: 9 Các thuộc tính liên quan với include action trong JSP

Ví dụ ta định nghĩa hai file: date.jsp và main.jsp nhƣ sau:

Nội dung của date.jsp file:

Today's date:

Nội dung của main.jsp file:

The include Action Example

Giữ tất cả các file này trong thƣ mục gốc và thử truy cập main.jsp Nó sẽ hiển thị kết quả nhƣ sau:

4.6.2 Action trong JSP useBean action trong JSP là khá linh hoạt Đầu tiên nó tìm kiếm một đối tƣợng đang tồn tại đang sử dụng thuộc tính id và scope Nếu một đối tƣợng không đƣợc tìm thấy, thì nó cố gắng tạo đối tƣợng đ xác định đó

Cách đơn giản nhất để tải một Bean nhƣ sau:

Khi lớp Bean đ đƣợc tải, bạn có thể sử dụng các jsp:setProperty action và jsp:getProperty action để sửa đổi và thu nhận các đặc tính của Bean

Bảng dưới liệt kê các thuộc tính liên kết với useBean action trong JSP:

Thuộc tính Mi u tả class Chỉ định tên package đầy đủ của Bean type Xác định kiểu biến mà sẽ tham chiếu tới đối tƣợng beanName Cung cấp tên của Bean như được xác định bởi phương thức instantiate() của lớp java.beans.Beans

Bảng 4: 10 Các thuộc tính liên kết với useBean action trong JSP 4.6.3 Action trong JSP setProperty action trong JSP thiết lập các đặc tính của một Bean Bean phải đƣợc tiền định nghĩa trước action này Có hai cách cơ bản để sử dụng setProperty Action: Bạn có thể sử dụng jsp:setProperty action sau khi, nhƣng bên ngoài của một phần tử jsp:useBean nhƣ sau:

Trong trường hợp này, jsp:setProperty được thực thi, dù cho có hay không một Bean mới đ đƣợc thuyết minh hoặc một Bean đang tồn tại đƣợc tìm thấy

Ngữ cảnh thứ hai mà jsp: setProperty có thể xuất hiện là bên trong phần thân của một phần tử jsp:useBean nhƣ sau:

Ngày đăng: 08/05/2024, 22:36

HÌNH ẢNH LIÊN QUAN

Hình 1: 1Kiến trúc JDBC - Giao trinh lap trinh ung dung java 1
Hình 1 1Kiến trúc JDBC (Trang 10)
Hình 1: 2 Các lớp và giao diện cơ bản trong JDBC - Giao trinh lap trinh ung dung java 1
Hình 1 2 Các lớp và giao diện cơ bản trong JDBC (Trang 11)
Bảng 1: 2 Bảng chuyển  ổi từ kiểu dữ liệu Java sang SQL - Giao trinh lap trinh ung dung java 1
Bảng 1 2 Bảng chuyển ổi từ kiểu dữ liệu Java sang SQL (Trang 17)
Hình 2: 2 interfaces lắng nghe sự kiện - Giao trinh lap trinh ung dung java 1
Hình 2 2 interfaces lắng nghe sự kiện (Trang 58)
Hình 2: 4 Các lớp cơ bản trong swing: - Giao trinh lap trinh ung dung java 1
Hình 2 4 Các lớp cơ bản trong swing: (Trang 62)
Hình 2: 5 Các đối tượng cơ bản khác của java SWING  2.3.3. Mở rộng các đối tượng container - Giao trinh lap trinh ung dung java 1
Hình 2 5 Các đối tượng cơ bản khác của java SWING 2.3.3. Mở rộng các đối tượng container (Trang 64)
Hình 3: 2 Cài  ặt Tomcat - Giao trinh lap trinh ung dung java 1
Hình 3 2 Cài ặt Tomcat (Trang 74)
Hình 3: 3 Vòng  ời của  Servlet - Giao trinh lap trinh ung dung java 1
Hình 3 3 Vòng ời của Servlet (Trang 75)
Bảng 3: 1 Các thông tin Header từ trình duyệt - Giao trinh lap trinh ung dung java 1
Bảng 3 1 Các thông tin Header từ trình duyệt (Trang 93)
Bảng 3: 5 Các HTTP Status code và th ng báo t ơng ứng - Giao trinh lap trinh ung dung java 1
Bảng 3 5 Các HTTP Status code và th ng báo t ơng ứng (Trang 108)
Hình 3: 7 Redirect trong Servlet - Giao trinh lap trinh ung dung java 1
Hình 3 7 Redirect trong Servlet (Trang 111)
Hình 3: 8 Servlet Filter  3.12.1. Các phương thức Servlet Filter - Giao trinh lap trinh ung dung java 1
Hình 3 8 Servlet Filter 3.12.1. Các phương thức Servlet Filter (Trang 117)
Hình 4: 1 JSP Container 4.1.4. Tiến trình JSP - Giao trinh lap trinh ung dung java 1
Hình 4 1 JSP Container 4.1.4. Tiến trình JSP (Trang 130)
Hình 4: 2 Tiến trình JSP - Giao trinh lap trinh ung dung java 1
Hình 4 2 Tiến trình JSP (Trang 131)
Hình 4: 3 Vòng  ời của JSP - Giao trinh lap trinh ung dung java 1
Hình 4 3 Vòng ời của JSP (Trang 132)
Bảng 4: 3 Các JSP action - Giao trinh lap trinh ung dung java 1
Bảng 4 3 Các JSP action (Trang 138)
Bảng 4: 4 Các   i t  ng ẩn trong JSP - Giao trinh lap trinh ung dung java 1
Bảng 4 4 Các i t ng ẩn trong JSP (Trang 139)
Bảng 4: 5 Các toán t  trong JSP - Giao trinh lap trinh ung dung java 1
Bảng 4 5 Các toán t trong JSP (Trang 143)
Bảng 4: 7 Các thuộc tính liên kết với page Directive - Giao trinh lap trinh ung dung java 1
Bảng 4 7 Các thuộc tính liên kết với page Directive (Trang 145)
Bảng 4: 8 Các Action trong JSP - Giao trinh lap trinh ung dung java 1
Bảng 4 8 Các Action trong JSP (Trang 147)
Bảng 4: 9 Các thuộc tính liên quan với include action trong JSP - Giao trinh lap trinh ung dung java 1
Bảng 4 9 Các thuộc tính liên quan với include action trong JSP (Trang 148)
Bảng 4: 12 Các thuộc tính liên kết với getProperty action trong JSP - Giao trinh lap trinh ung dung java 1
Bảng 4 12 Các thuộc tính liên kết với getProperty action trong JSP (Trang 151)
Bảng 4: 13 Các tham s  liên kết với forward action trong JSP - Giao trinh lap trinh ung dung java 1
Bảng 4 13 Các tham s liên kết với forward action trong JSP (Trang 152)
Bảng 4: 16 Các thông tin header từ trình duyệt - Giao trinh lap trinh ung dung java 1
Bảng 4 16 Các thông tin header từ trình duyệt (Trang 160)
Bảng 4: 18 Tên và giá trị t ơng ứng của HTTP Header Request trong JSP - Giao trinh lap trinh ung dung java 1
Bảng 4 18 Tên và giá trị t ơng ứng của HTTP Header Request trong JSP (Trang 165)
Bảng 4: 19 Các tr ờng Header từ trình duyệt - Giao trinh lap trinh ung dung java 1
Bảng 4 19 Các tr ờng Header từ trình duyệt (Trang 167)
Bảng 4: 23 Các thẻ Core Tags trong JSTL - Giao trinh lap trinh ung dung java 1
Bảng 4 23 Các thẻ Core Tags trong JSTL (Trang 185)
Bảng 4: 24 Các thẻ trong nhóm Formatting Tags trong JSTL - Giao trinh lap trinh ung dung java 1
Bảng 4 24 Các thẻ trong nhóm Formatting Tags trong JSTL (Trang 186)
Bảng 4: 26 Các thẻ trong nhóm XML Tags trong JSTL - Giao trinh lap trinh ung dung java 1
Bảng 4 26 Các thẻ trong nhóm XML Tags trong JSTL (Trang 188)
Bảng 4: 29 Các thuộc tính của Custom Tag trong JSP - Giao trinh lap trinh ung dung java 1
Bảng 4 29 Các thuộc tính của Custom Tag trong JSP (Trang 199)

TỪ KHÓA LIÊN QUAN

w