Đang tải... (xem toàn văn)
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 1Tên môn học: Lập trình ứng dụng java
Trang 21.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 33.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 44.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 5DANH 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 6DANH 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 7DANH 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 8Bả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 9CHƯƠ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 11Hì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 14Chú ý: 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 15ResultSet 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 17Bả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 19System.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 203 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 21System.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 22Ví 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 23Hì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 246 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 25at 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 26public 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 27H 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 29at 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 31account_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 32CHƯƠ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 33Checkbox, 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 34củ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 35panel.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 37public 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 39Button 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 40Chạ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