Giao trinh lap trinh ung dung java 1

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

Đ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

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

Trang 1

Tên môn học: Lập trình ứng dụng java

Trang 2

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 19

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 32

2.2 AWT 33

2.2.1 Các đối tượng container cơ bản 33

2.2.2 Các đối tượng component cơ bản 36

2.2.3 Các sự kiện cơ bản của đối tượng 40

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 79

3.5 Tham số khởi tạo Servlet 80

3.6 Mapping Servlet 82

3.7 Sử dụng Annotations để khai báo servlets, Filter và listeners 83

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 110

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

Trang 3

3.12.3 Ánh xạ Servlet Filter trong Web.xml 119

3.12.4 Sử dụng nhiều Filter trong Servlet 119

4.3.7 Các đối tƣợng ẩn (Implicit) trong JSP 138

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.6.1 <jsp:include> Action trong JSP 147

4.6.2 <jsp:useBean> Action trong JSP 149

4.6.3 <jsp:setProperty> Action trong JSP 149

4.6.4 <jsp:getProperty> Action trong JSP 150

4.6.5 <jsp:forward> Action trong JSP 152

4.6.7 <jsp:plugin> Action trong JSP 153

4.6.7 <jsp:element>, <jsp:attribute>, <jsp:body> 154

4.6.8 <jsp:text> Action trong JSP 155

4.7 Đối tƣợng ẩn (Implicit) trong JSP 156

4.7.1 Đối tƣợng request trong JSP 156

4.7.2 Đối tƣợng response trong JSP 157

4.7.3 Đối tƣợng out trong JSP 157

4.7.3 Đối tƣợng session trong JSP 157

4.7.4 Đối tƣợng application trong JSP 158

4.7.5 Đối tƣợng config trong JSP 158

4.7.6 Đối tƣợng pageContext trong JSP 158

4.7.7 Đối tƣợng page trong JSP 159

4.8 Client Request trong JSP 159

4.9 Server Response trong JSP 165

4.10 Status Code trong JSP 171

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

Trang 4

4.15.2.Toán tử cơ bản trong EL 201

4.15.3 Hàm trong JSP EL 202

4.16 Xử lý ngoại lệ (Exception) trong JSP 206

4.17 Debug trong JSP 210

4.18 Bảo mật trong JSP 215

Trang 5

DANH MỤC TỪ VIẾT TẮT VÀ THUẬT NGỮ Từ viết

JDBC Java Database Connectivity Kết nối cơ sở dữ liệu Java API Application Programming Interface Giao diện lập trình ứng dụng UI User Interface Giao diện người dùng

AWT Abstract Window Toolkit Bộ công cụ lập trình giao diện java JFC Java Foundation Class Các lớp cơ sở của Java

J2EE Java 2 Platform, Enterprise Edition Nền tảng phát triển và triển khai ứng dụng java chuyên nghiệp

EL JSP Expression Language Ngôn ngữ biểu thức nhúng trong JSP JSP JavaServer Pages Tên công nghệ phát triển ứng dụng

web trên java

MVC Model-View-Controller Tên một hệ điều hành

JSTL Java Standard Tag Library Thư viện thẻ tiêu chuẩn Java

Trang 6

DANH MỤC HÌNH VẼ

Hình 1: 1Kiến trúc JDBC 10

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

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

Hình 2: 1 Java Foundation Class 32

Hình 2: 2 interfaces lắng nghe sự kiện 58

Hình 2: 3 Kiến trúc MVC của SWING 60

Hình 2: 4 Các lớp cơ bản trong SWING: 62

Hình 2: 5 Các đối tượng cơ bản khác của java SWING 64

Hình 2: 6 Các đối tượng nâng cao của SWING 66

Hình 3: 1 Cấu trúc Servlets 72

Hình 3: 2 Cài đặt Tomcat 74

Hình 3: 3 Vòng đời của Servlet 75

Hình 3: 4 Sơ đồ cấu trúc vòng đời của Servlet 78

Hình 3: 5 Kết quả chương trình Hello Servlet 80

Hình 3: 6 Forward trong Servlet 110

Hình 3: 7 Redirect trong Servlet 111

Trang 7

DANH MỤC BẢNG BIỂU

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

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

Bảng 2: 1 So sánh SWING và AWT 60

Bảng 3: 1 Các thông tin Header từ trình duyệt 93

Bảng 3: 2 Các phương thức của HttpServletRequest 96

Bảng 3: 3 Các trường Header 101

Bảng 3: 4 Các phương thức thiết lập Response Header trong Servlet 103

Bảng 3: 5 Các HTTP Status code và thông báo tương ứng 108

Bảng 3: 6 các phương thức để thiết lập HTTP Status code trong Servlet 109

Bảng 3: 7 Các phương thức xử lý cookie trong servlet 113

Bảng 3: 8 Các phương thức của đối tượng HttpSession 116

Bảng 3: 9 Các phương thức Servlet Filter 117

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

Bảng 4: 10 Các thuộc tính liên kết với useBean action trong JSP 149

Bảng 4: 11 Các thuộc tính liên kết với setProperty action trong JSP 150

Bảng 4: 12 Các thuộc tính liên kết với getProperty action trong JSP 151

Bảng 4: 13 Các tham số liên kết với forward action trong JSP 152

Bảng 4: 14 Các đối tượng ẩn trong JSP 156

Bảng 4: 15 Các phương thức của đối tượng out 157

Bảng 4: 16 Các thông tin header từ trình duyệt 160

Bảng 4: 17 Các phương thức của HttpServletRequest 163

Trang 8

Bảng 4: 18 Tên và giá trị tương ứng của HTTP Header Request trong JSP 165

Bảng 4: 19 Các trường Header từ trình duyệt 167

Bảng 4: 20 Các phương thức của HttpServletResponse trong JSP 169

Bảng 4: 21 Các HTTP Status code và các thông báo tương ứng 174

Bảng 4: 22 Các phương thức sử dụng để thiết lập HTTP Status code trong chương trình JSP 175

Bảng 4: 23 Các thẻ Core Tags trong JSTL 185

Bảng 4: 24 Các thẻ trong nhóm Formatting Tags trong JSTL 186

Bảng 4: 25 Các thẻ SQL Tags trong JSP 187

Bảng 4: 26 Các thẻ trong nhóm XML Tags trong JSTL 188

Bảng 4: 27 Các JSTL Functions 190

Bảng 4: 28 Các phương thức truy nhập thuộc tính của JavaBean 190

Bảng 4: 29 Các thuộc tính của Custom Tag trong JSP 199

Bảng 4: 30 Các toán tử cơ bản trong EL 202

Bảng 4: 31 Các đối tượng ẩn của EL 203

Bảng 4: 32 Các phương thức quan trọng trong lớp Throwable 207

Trang 9

CHƯƠNG 1: LÀM VIỆC VỚI CƠ SỞ DỮ LIỆU TRONG JAVA Mục tiêu:

Cung cấp cho sinh viên 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

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

Trang 11

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

1.2 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

Trang 12

-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

1.3 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 ClassNotFoundException

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:

Trang 13

Đố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; Password=123456";

Connection cnObj = DriverManager.getConnection(strConnect);

Trang 14

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

“jdbc:odbc:driver={SQLServer};Server=<ServerName>; Database=<YourDB>;UserName=<dbUser>;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://<server_name>:<port>;databaseName=<YourDB>;user=<userName>; password=<pass>"

ướ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

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

Trang 15

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

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 While (kq.next()){

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

Trang 16

ƣớ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

1.4 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

Trang 17

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

1.5 Statement và Resulset, PreparedStatement

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ừ

Trang 18

• 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) { Connection con = null;

try {

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

con = DriverManager.getConnection("jdbc:mysql://localhost:3306/k7g"

,"root","admin");

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

catch (ClassNotFoundException e) { e.printStackTrace();

}

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

try {

Statement stm = con.createStatement(); String sql1 = "select * from sinhvien"; ResultSet rs = stm.executeQuery(sql1); while(rs.next()){

Trang 19

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)); System.out.println("");

}

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

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

} }

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

Trang 20

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

5 public int executeUpdate()

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 thietimport java.sql.*;

// Ten cua driver va dia chi URL cua co so du lieu

staticfinalString JDBC_DRIVER ="com.mysql.jdbc.Driver"; staticfinalString DB_URL ="jdbc:mysql://localhost/sinhvien";

// Ten nguoi dung va mat khau cua co so du lieu staticfinalString USER ="root";

staticfinalString PASS ="123456"; publicstaticvoid main(String[] args){

Connection conn =null;

PreparedStatement stmt =null;

try{

// Buoc 2: Dang ky Driver

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

Trang 21

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(,6); // Lenh nay se thiet lap diemthi stmt.setInt(,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";

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

System.out.print("\n=================");

Trang 22

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

Trang 23

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

savepoint Phương thức này nhận một đối tượng Savepoint làm tham số

Trang 24

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, createdDAte) "+ "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, createdDAte) + "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

Trang 25

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)

Rollback data

Batch Processing

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

Trang 26

public class BatchProcessingExample {

public static void main(String[] args) throws SQLException {

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

try (

Connection con = ConnectionUtils.openConnection();

PreparedStatement pstm =con.prepareStatement(sqlInsert, Statement.RETURN_GENERATED_KEYS);) {

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

} }

private static List readUsersFromCsvFile() { List users = new ArrayList<>();

for (int i = 1; i <= 2; i++) {

users.add(new User("user-" + 1, "pwd123", new java.sql.Date(System.currentTimeMillis())));

}

return users; }

Trang 27

H y xem xét ví dụ sau: import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement;

public class SQLExceptionExample {

private static final String hostName = "localhost"; private static final String dbName = "jdbcdemo"; private static final String userName = "root"; private static final String password = "";

private static final String connectionURL = "jdbc:mysql://" + hostName + ":3306/" + dbName;

public static void main(String[] args) { try {

System.out.println("inserted successfully : " + numberRowsAffected);

Trang 28

}

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

} }

Với ví dụ trên ta có thể gặp một số ngoại lệ sau:

-Nếu Driver không tồn tại hoặc không phù hợp, ta sẽ nhận đƣợc l i nhƣ sau: java.lang.ClassNotFoundException: com.mysql.jdbc.Driver2

at java.net.URLClassLoader.findClass(URLClassLoader.java:381) at java.lang.ClassLoader.loadClass(ClassLoader.java:424)

at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335) at java.lang.ClassLoader.loadClass(ClassLoader.java:357)

at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:264)

at com.gpcoder.SQLExceptionExample.main(SQLExceptionExample.java:18)

-Nếu password không đúng, ta sẽ nhận đƣợc log l i nhƣ sau:

java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)

at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129) 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.ConnectionImpl.createNewIO(ConnectionImpl.java:827) at com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:447)

at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:237)

at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:199) at java.sql.DriverManager.getConnection(DriverManager.java:664)

at java.sql.DriverManager.getConnection(DriverManager.java:247) at com.gpcoder.SQLExceptionExample.main(SQLExceptionExample.java:20) -N u sai c}u l nh SQL ta sẽ nhận c log lỗi t ơng tự sau:

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)

Trang 29

at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.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.SQLExceptionExample.main(SQLExceptionExample.java:26)

Trang 30

ÀI TẬP Bài 1

Tạo một cơ sở dữ liệu SinhVienDataBase và tạo bảng "students" với các trường

như "id", "name", "age", và "grade" trên các trên các hệ quản trị cơ sở dữ liệu khác nhau như MySQL, SQL server

-Xây dựng các phương thức thực hiện khởi tạo đối tượng Connection theo như m u sau:

-public static Connection getMySQLConnection(String hostName, String dbName, String userName, String password) throws SQLException,

public interface DAO<T> {

public ArrayList<T> getAll(Connection con); public void insert(T ob,Connection con); public void updateC(T ob,Connection con) ; public boolean Delete(T ob,Connection con); public Object find(int id,Connection con);

public Object findByName(String name,Connection con); }

CREATE DATABASE banking; USE banking;

CREATE TABLE accounts (

Trang 31

account_number INT PRIMARY KEY, customer_name VARCHAR(255), balance DECIMAL(10, 2) );

INSERT INTO accounts VALUES (1, 'John Doe', 1000.00); INSERT INTO accounts VALUES (2, 'Jane Smith', 2000.00);

-Xây dựng phương thức để chuyển tiền từ tài khoản 1 sang tài khoản 2 sử dụng các khái niệm của Transaction và phương thức hiển thị số dư tài khoản

Trang 32

CHƯƠNG 2: LẬP TRÌNH GIAO DIỆN VỚI AWT VÀ SWING Mục tiêu:

Cung cấp cho sinh viên kỹ năng lập trình giao diện sử dụng bộ công cụ java AWT và SWING Sinh viên nắm kiến thức cơ bản và vận dụng xây dựng một giao diện của một hệ thống cụ thể

Nội dung:

- Những nguyên tắc thiết kế giao diện

- Những thư viện, gói xây dựng giao diện: gồm những lớp(class), những giao tiếp (interface) quản lý sự kiện vànhững thành phần (components) xây dựng nên giao diện người dùng

- Bộ quản lý trình bày (layout managers) - Xử lý sự kiện

 AWT: Trong mục này, chúng ta sẽ tìm hiểu và sử dụng các đối tượng cơ bản của lập trình giao diện: Các đối tượng chứa(container) cơ bản (Frame, Panel, Dialog) Các đối tượng thành phần (component) cơ bản (Button, Label, TextField, TextArea) Các sự kiện cơ bản của các đối tượng

 SWING: Java Swing cung cấp một loạt các thành phần giao diện người dùng (UI components) để xây dựng giao diện đồ họa cho ứng dụng Java

2.1 Tổng quan về l p trình giao diện trong java Giới thiệu JFC (Java Foundation Class):

- Là thư viện lập trình đồ họa phát triển dựa trên thư viện AWT

- JFC có khả năng tạo nên các giao diện uyển chuyển, linh hoạt hơn AWT

- Có sẵn trong thư viện chuẩn JDK từ bản 1.2 trở đi

Hình 2: 1 Java Foundation Class

Thư viện awt là bộ thư viện dùng để xây dựng giao diện người dùng cho một chương trình ứng dụng có đầy đủ các thành phần cơ bản như: Label, Button,

Trang 33

Checkbox, Radiobutton, Choice, List, Text Field, Text Area, Scrollbar, Menu, Frame…

Giới thiệu Swing: Là một gói nằm trong thư viện JFC, gồm nhiều lớp (classes) và giao diện (interfaces) h trợ mạnh mẽ cho việc lập trình giao diện đồ họa trên JDK

Java2D chuyên xử lý các thuộc tính giao diện 2 chiều như hình ảnh, text, font, màu sắc,…

2.2 AWT

2.2.1 Các đối tượng container cơ bản

Các đối tượng container được dùng để chứa các đối tượng thành phần khác Các lớp đối tượng này có một số phương thức chung như sau:

• add(Object): Thêm một đối tượng (kiểu component) vào container • remove(Object): Loại b một đối tượng ra kh i container

• removeAll(): Loại b tất cả các đối tượng mà container đang chứa

• getComponent(int): Trả về đối tượng thành phần có chỉ số là tham số đầu vào

Container quản lí các đối tượng chứa trong nó dưới dạng mảng Chỉ số của các

thành phần là số thứ tự khi thành phần đó được thêm vào container

• getComponents(): Trả về mảng tất cả các đối tượng mà container đang chứa • countComponents(): Trả về số lượng các đối tượng mà container đang chứa

Frame là một đối tượng có thể dùng một cách độc lập, hoặc được gắn vào một

đối tượng khác như một đối tượng conponent bình thường Thông thường, Frame được dùng như một cửa sổ của một chương trình độc lập Các phương thức cơ bản của lớp Frame:

• Frame(): Khởi tạo không tham số

• Frame(String): Khởi tạo với tham số là dòng tiêu đề của frame

• setSize(int int): Định kích cỡ của frame, tham số tương ứng là chiều rộng và

chiều cao của frame

• setVisible(boolean): Cho phép frame xuất hiện hay ẩn đi trên màn hình • setTitle(String)/getTitle(): Truy nhập thuộc tính dòng tiêu đề của frame • setResizable(boolean): Thiết lập thuộc tính cho phép thay đổi kích cỡ frame • setIconImage(Image): Thiết lập ảnh icon ở góc trên (biểu tượng) của frame

Panel

Panel cũng là một dang khung chứa, nhưng khá đơn giản Panel chỉ dùng để nhóm các đối tượng giao diện với nhau Thông thường, panel được dùng trong một cửa sổ

Trang 34

của Frame hoặc một ứng dụng khác Các phương thức cơ bản của lớp Panel, ngoài các phương thức chung của container:

• Panel(): Khởi tạo không tham số

Ví dụ: Minh hoạ việc sử dụng một Panel trong một Frame

import java.awt.Button; import java.awt.Color; import java.awt.Frame; import java.awt.Label; import java.awt.Panel; import java.awt.TextField; import javax.swing.JFrame; import javax.swing.JLabel; class MyFrame1 extends JFrame { Button button1;

Button button2; TextField txt;

JLabel mylabel = new JLabel("Hello JLabel", JLabel.LEFT); MyFrame1(String title) {

super(title);

txt = new TextField("abc", 40); //txt.setEchoChar('*');

Panel panel = new Panel();

Label lblNhan1 = new Label("Nhap Ho Ten"); panel.setBounds(40, 80, 400, 200);

panel.setBackground(Color.gray); button1 = new Button("Button 1"); button1.setBounds(50, 50, 80, 30); button1.setBackground(Color.yellow); button2 = new Button("Button 2"); button2.setBounds(50, 100, 80, 30); button2.setBackground(Color.green); lblNhan1.setBounds(50, 150, 90, 40); txt.setBounds(150, 155, 100, 20); mylabel.setBounds(150, 50, 120, 30); mylabel.setText("Noi dung da thay doi");

Trang 35

panel.add(txt); panel.add(lblNhan1); panel.add(button1); panel.add(button2); panel.add(mylabel); panel.setLayout(null); this.add(panel);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // this.setSize(400, 400);

this.setBounds(20, 20, 500, 300); this.setLayout(null);

this.setVisible(true); }

}

public class PanelExample1 {

public static void main(String args[]) { new MyFrame1("Vi du 1 AWT trong java");

// MyFrame1 f1= new MyFrame1("Vi du 1 AWT trong java"); // System.out.println(f1.txt.getText());

} }

Các phương thức cơ bản củ lớp Di log:

• Dialog(Frame boolean): Khởi tạo dialog, tham số thứ nhất là frame chứa

dialog, tham số thứ hai xác định dialog có là modal hay không

• Dialog(Frame String boolean): Khởi tạo dialog, thêm tham số thứ hai là

dòng tiêu đề của dialog

Trang 36

• setVisible(boolean): Thiết lập trạng thái hiển thị hoặc ẩn dialog trên màn

hình

• setSize(int int): Định kích cỡ cho dialog, các tham số tương ứng là chiều

rộng và chiều cao của dialog

• setTitle(String)/getTitle(): Truy nhập thuộc tính dòng tiêu đề của dialog

• setResizable(boolean): Thiết lập thuộc tính cho phép thay đổi kích cỡ của dialog

• setLayout(Layout): Thiết lập chế độ hiển thị các đối tượng chứa trong dialog

Ví dụ: Minh họa sử dụng đối tượng Dialog

import java.awt.*;

public class DialogDemo{

public static void main(String[] args) {// Khai b|o v{ khởi tạo frame c ti u ề

Frame myFrame = new Frame(“Frame has a dialog!”); myFrame.setSize( 00, 50); // Định k ch cỡ frame // Khai b|o v{ khởi tạo dialog

Dialog myDialog = new Dialog(myFrame, “An empty dialog!”, true); myDialog.setSize( 00, 50); // Định k ch cỡ dialog

myDialog.setVisible(true); // Hi n thị dialog} }

2.2.2 Các đối tượng component cơ bản

Label

Label (nh n) là một đối tượng để hiển thị văn bản tĩnh, những văn bản mà người dùng không thể thay đổi trực tiếp được Các phương thức cơ bản của Label:

• Label(): Khởi tạo một nhãn r ng

• Label(String): Khởi tạo một nhãn với nội dung văn bản là tham số đầu vào • Label(String int): Khởi tạo một nhãn có nội dung sẵn, tham số thứ hai xác

định cách căn lề của nhãn so với khung chứa, bao gồm {Label.CENTER, Label.LEFT, Label.RIGHT}

• setText(String)/getText(): Truy nhập nội dung văn bản của nhãn

• setAlignment(int)/getAlignment(): Truy nhập thuộc tính căn lề của nhãn • setFont(Font): Định dạng phông chữ của nhãn

package vidu.chuong2; // sử dụng nh~n trong m t frame import java.awt.*;

Trang 37

public class LabelDemo{

public static void main(String[] args) {// Khai b|o v{ khởi tạo frame c tiêu ề

Frame myFrame = new Frame(“Frame has a label!”); myFrame.setSize( 00, 50); // Định k ch cỡ frame

Label myLabel = new Label();// Khai b|o v{ khởi tạo label myLabel.setText(“This is a label!”);//G|n n i dung văn bản myLabel.setAlignment(Label.CENTER);// Căn lề gi a

myFrame.add(myLabel); // Gắn label v{o frame myFrame.setVisible(true); // Hi n thị frame} }

TextField và TextArea

Đây là hai đối tượng dùng để biểu diễn văn bản và người dùng có thể thay đổi nội

dung văn bản chứa trong chúng Điểm khác biệt là TextField chỉ cho phép một dòng văn bản, trong khi TextArea cho phép chứa nhiều dòng văn bản Các phương thức

chung của hai lớp này:

• setText(String)/getText(): Truy nhập thuộc tính nội dung văn bản chứa trong ô • getSelectedText(): Trả về chu i văn bản được bôi đen (đánh dấu chọn) trong ô • getSelectedStart(): Trả về vị trí kí tự đầu trong vùng được đánh dấu chọn (tính từ 0) • getSelectedEnd(): Trả về vị trí kí tự cuối trong vùng được đánh dấu chọn (tính từ 0) • selectAll(): Đánh dấu chọn toàn văn bản

• setEditable(boolean): Xác định vùng văn bản có thể edit được hay không

Các phương thức khác của lớp TextField:

• TextField(): Khởi tạo một ô văn bản r ng

• TextField(int): Khởi tạo một ô văn bản r ng, độ rộng xác định bởi tham số vào • TextField(String): Khởi tạo một ô văn bản có nội dung xác định bởi tham số

đầu vào

• TextField(String int): Khởi tạo vởi nội dung có sẵn, độ rộng xác định

• setEchoChar(char)/getEchoChar(): Truy nhập thuộc tính là kí tự thay thế

văn bản trong ô Thuộc tính này được dùng khi ta cần che dấu thông tin văn bản, ví dụ, ô gõ mật khẩu của chương trình

• getColums(): Trả về độ rộng của ô văn bản Các ph ơng thức khác của lớp TextArea: • TextArea(): Khởi tạo một vùng văn bản r ng

Trang 38

• TextArea(int, int): Khởi tạo một vùng văn bản r ng, kích cỡ (số dòng, số cột)

xác định bởi tham số vào

• TextArea(String): Khởi tạo một vùng văn bản có nội dung xác định bởi tham

• insertText(String int): Chèn một đoạn văn bản vào vị trí xác định (tham số

thứ hai) của vùng văn bản

• replaceText(String int int): Thay thế một đoạn văn bản trong vùng, đánh dấu

bằng vị trí bắt đầu và vị trí kết thúc (tham số thứ hai và thứ ba), bằng một đoạn văn bản mới (tham số thứ nhất)

• getRows()/getColums(): Trả về số dòng/cột của vùng văn bản

package vidu.chuong2; // t c|c i t ng ô văn bản v{ vùng văn bản v{o m t

import java.awt.*; public class TextDemo{

public static void main(String[] args) {// Khai b|o v{ khởi tạo frame c ti u ề

Frame myFrame = new Frame(“Frame has some texts!”); myFrame.setSize( 00, 50); // Định k ch cỡ frame // Khai b|o v{ khởi tạo textField

TextField myTextField = new TextField(“A text field!”); myFrame.add(myTextField); // Gắn v{o frame

// Khai b|o v{ khởi tạo textArea

TextArea myTextArea = new TextArea(5, 40);

String str=“The TextField’s columns is: ” myTextField.getColumns();

str = “The TextArea’s size is: ” myTextArea.getRows() “*” myTextArea.getColumns();

myTextArea.setText(str); // Thi t lập n i dung myFrame.add(myTextArea); // Gắn v{o frame myFrame.setVisible(true); // Hi n thị frame} }

Button

Trang 39

Button là đối tượng nút lệnh, dùng để thực hiện một nhiệm vụ xác định Các phương thức cơ bản của nút nhấn:

• Button(String): Khởi tạo nút nhấn với tên xác định trên nút • setLabel(String)/getLabel(): Truy nhập tên của nút nhấn

import java.awt.*;

import java.awt.event.*; import javax.swing.JFrame;

public class DemoButton extends JFrame implements ActionListener { Button helloButton,blueButton,whiteButton,b;

DemoButton(String tile) {super(tile);

helloButton=new Button("Hello"); blueButton=new Button("Blue"); whiteButton=new Button("White"); b=new Button("OK");

this.setLayout(new FlowLayout()); this.add(helloButton);

this.add(blueButton); this.add(whiteButton); this.add(b);

helloButton.addActionListener(this); blueButton.addActionListener(this); whiteButton.addActionListener(this);

b.addActionListener(new ActionListener() { @Override

public void actionPerformed(ActionEvent e) {

//To change body of generated methods, choose Tools | Templates

System.out.println("nhan vao ok"); }

});

this.addWindowListener(new WindowClosing());

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setBounds(50,50,300,200);

this.setVisible(true);

Trang 40

Chạy và quan sát chương trình khi nhấn vào các nút tương ứng

2.2.3 Các sự kiện cơ bản của đối tượng

M i đối tượng component có một số sự kiện xác định, phát sinh từ chính đối tượng đó Java cung cấp một số lớp sự kiện cơ bản nằm trong thư gói java.awt.event:

import java.awt.event.*;

Các lớp sự kiện cơ bản của các đối tượng bao gồm:

• ActionEvent: Xuất hiện khi một nút bị click vào, một danh sách (list) được

chọn, một menu được chọn

• ComponentEvent: Xuất hiện khi component bị thay đổi kích cỡ, vị trí,

trạng thái

• FocusEvent: Xuất hiện khi một component có hoặc mất focus

• ItemEvent: Xuất hiện khi một menu item được chọn hoặc b , khi

checkbox hoặc list item được click vào

• WindowEvent: Xuất hiện khi một của sổ được mở ra, kích hoạt, đóng lại

hoặc thoát ra

• TextEvent: Xuất hiện khi giá trị văn bản của các đối tượng TextField và

TextArea bị thay đổi

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

Tài liệu cùng người dùng

Tài liệu liên quan