Tải bản đầy đủ (.pdf) (222 trang)

Giao trinh lap trinh ung dung java 1

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (2.87 MB, 222 trang )

<span class="text_page_counter">Trang 1</span><div class="page_container" data-page="1">

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

</div><span class="text_page_counter">Trang 2</span><div class="page_container" data-page="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

<b>CHƯƠNG 2: LẬP TRÌNH GIAO DIỆN VỚI AWT VÀ SWING ... 32 </b>

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

</div><span class="text_page_counter">Trang 3</span><div class="page_container" data-page="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

</div><span class="text_page_counter">Trang 4</span><div class="page_container" data-page="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

</div><span class="text_page_counter">Trang 5</span><div class="page_container" data-page="5">

<b>DANH MỤC TỪ VIẾT TẮT VÀ THUẬT NGỮ </b>

<b>Từ viết </b>

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 <sup>Nền tảng phát triển và triển khai ứng </sup>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 <sup>Tên công nghệ phát triển ứng dụng </sup>

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

</div><span class="text_page_counter">Trang 6</span><div class="page_container" data-page="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

</div><span class="text_page_counter">Trang 7</span><div class="page_container" data-page="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

</div><span class="text_page_counter">Trang 8</span><div class="page_container" data-page="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

</div><span class="text_page_counter">Trang 9</span><div class="page_container" data-page="9">

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

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:

</div><span class="text_page_counter">Trang 11</span><div class="page_container" data-page="11">

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

<b>1.2. Các trình điều khiển (jdbc driver) </b>

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 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ỉ:

<small> </small>

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

<i><b>-Loại 1: Bridge Driver kết nối với các hệ CSDL thông qua cầu nối ODBC, </b></i>

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.

<i><b>-Loại 2: Native API Driver: chuyển các lời gọi của JDBC API sang thư viện </b></i>

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.

<i><b>-Loại 3: JDBC-Net Driver: chuyển các lời gọi JDBC API sang một dạng </b></i>

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.

</div><span class="text_page_counter">Trang 12</span><div class="page_container" data-page="12">

<i><b>-Loại 4: Native Protocol Driver: chuyển các lời gọi JDBC API sang mã lệnh </b></i>

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.

<b>1.3. Viết chương trình làm việc với csdl qua jdbc </b>

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)

<b> ước 1: Nạp trình điều hiển ết n i Lo d Driver : </b>

Để 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

<small>public static Class forName(String ClassName) throws ClassNotFoundException </small>

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à:

<small>Class.forName(“jdbc:odbc:JdbcOdbcDriver”); </small>

<i><b>Chú ý: Chu i “jdbc:odbc:JdbcOdbcDriver” dùng làm tham số của hàm chính là </b></i>

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:

<small> Class.forName(“org.gjt.mm.mysql.Driver”); </small>Trình điều khiển của Oracle:

<small>Class.forName(“oracle.jdbc.driver.OracleDriver”); </small>

<i>Trình điều khiển của Sybase: Class.forName(“com.sybase.jdbc.SybDriver”); </i>

Trình điều khiển qua cầu nối ODBC:

</div><span class="text_page_counter">Trang 13</span><div class="page_container" data-page="13">

Đối với MySQL, ta phải tải một gói driver có tên MySQL Connector J JDBC

<i>driver về từ: . Giải nén sau đó add tập tin .jar vào </i>

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 <small>Class.forName(“com.microsoft.sqlserver.jdbc.SQLServerDriver”); </small>

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

<i>“com.microsoft.sqlserver.jdbc.SQLServerDriver” dùng làm tham số của </i>

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

<i><b> ước 2: Thiết l p ết n i đến cơ sở dữ liệu (Establish a database connection) </b></i>

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:

<i>-public static Connection getConnection(String url) throws SQLException: </i>

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.

<i>-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. </i>

<i>-public static Connection getConnection(String url, Properties info) throws SQLException: tương tự hai phương thức trên ngồi ra cung cấp thêm các thơng tin </i>

<b>qui định thuộc tính kết nối thơng qua đối tượng của lớp Properties. </b>

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

<small>String strConnect ="jdbc:odbc:driver={SQL Server};Server=BODUA-D778EAB2E; Database =qlCuocHen; UserName=sa; Password=123456"; </small>

<small>Connection cnObj = DriverManager.getConnection(strConnect); </small>

</div><span class="text_page_counter">Trang 14</span><div class="page_container" data-page="14">

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

<small>“jdbc:odbc:driver={SQLServer};Server=<ServerName>; Database=<YourDB>;UserName=<dbUser>;Password=<***>” </small>

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

<small>“dbc:sqlserver://<server_name>:<port>;databaseName=<YourDB>;user=<userName>; password=<pass>" </small>

<b> ướ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) </b>

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 :

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

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

<b> Statement để nhận về 1 thể hiện của lớp này thông qua phương </b>

<i><b>thức createStatement() của đối tượng Connection đ thiết lập. </b></i>

<small>Statement stCmd = this.ketNoi.createStatement(); </small>

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

<b>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 </b>

<i>động lên cơ sở dữ liệu thông qua phương thức executeQuery() (hay executeUpdate() – </i>

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

</div><span class="text_page_counter">Trang 15</span><div class="page_container" data-page="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:

<i><b> public ResultSet executeQuery(String strQuery) throws SQLException </b></i>

<b>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 </b>

tác đối với dữ liệu, hay điều khiển đối tượng này như sau

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

<i>.getString(tenCot) – đọc thông tin của 1 trường thơng tin dạng chu i có trong </i>

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

<i><b>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 </b></i>

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

<b>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 </b>

<small>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()){ </small>

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

<small> System.out.println(“Hi n nay : “ kq.getInt( ).toString() ” Tu i”); } </small>

</div><span class="text_page_counter">Trang 16</span><div class="page_container" data-page="16">

<b> ƣớc 5: Đóng kết nối và giải phóng tài nguyên (Close the database connection) </b>

<small> public void close() throws SQLException </small>

<b>1.4. Kiểu dữ liệu sql và kiểu dữ liệu java </b>

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.

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

</div><span class="text_page_counter">Trang 17</span><div class="page_container" data-page="17">

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

<b>1.5. Statement và Resulset, </b>

<b>PreparedStatement</b>

<b>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: </b>

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

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

</div><span class="text_page_counter">Trang 18</span><div class="page_container" data-page="18">

<i>• 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 </i>

<i>• 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 </i>

<i>• 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 </i>

Hãy xem xét ví dụ sau:

<small>import java.sql.Connection; import java.sql.Driver; </small>

<small>import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class ConnectDemo0 { </small>

<small> public static void main(String[] args) { Connection con = null; </small>

<small> try { </small>

<small> Class.forName("com.mysql.jdbc.Driver"); </small>

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

<small> ,"root","admin"); </small>

<small> System.out.println("connection ok"); } </small>

<small> catch (ClassNotFoundException e) { e.printStackTrace(); </small>

<small> } </small>

<small> catch (SQLException e1) { e1.printStackTrace(); } </small>

<small> try { </small>

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

</div><span class="text_page_counter">Trang 19</span><div class="page_container" data-page="19">

<small> System.out.print(rs.getInt(1)+"-"); </small>

<small> System.out.print(rs.getString("hoten")+"-"); System.out.print(rs.getString("diachi")+"-"); System.out.print(rs.getString(4)+"-"); </small>

<small> System.out.print(rs.getInt(5)); System.out.println(""); </small>

<small> } </small>

<small> rs.close(); stm.close(); con.close(); } </small>

<small> catch (SQLException e) { e.printStackTrace(); } </small>

<small> } } </small>

<b>PreparedStatement Interface là một interface con của Statement. Nó được sử </b>

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

<b>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 </b>

giá trị cho m i tham số trước khi thực thi lệnh SQL.

<b>Phương thức setXXX() gắn kết các giá trị tới các tham số, trong đó XXX biểu </b>

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

<b>quên cung cấp các giá trị, thì sẽ gặp SQLException. Các phương thức của PreparedStatement Interface </b>

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

<i>1. public void setInt(int paramIndex, int giaTri) </i>

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.

<i>Trong đó, paramIndex là tham số đầu tiên, tham số thứ hai, …; giaTri là giá trị </i>

của tham số.

<i>2. public void setString(int paramIndex, String giaTri) </i>

<b>Thiết lập tham số đ cho thành giá trị String trong Java đ cung cấp. Driver </b>

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

</div><span class="text_page_counter">Trang 20</span><div class="page_container" data-page="20">

<i>3. public void setFloat(int paramIndex, float giaTri) </i>

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

<i>4. public void setDouble(int paramIndex, double giaTri) </i>

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

<i>5. public int executeUpdate() </i>

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, …)

<i>6. public ResultSet executeQuery() throws SQLException </i>

<b>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. </b>

<small>//Buoc 1: can inport cac package can thietimport java.sql.*;</small>

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

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

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

<small> staticfinalString PASS ="123456"; publicstaticvoid main(String[] args){</small>

<small> Connection conn =null;</small>

<small> PreparedStatement stmt =null;</small>

<small> try{</small>

<small> // Buoc 2: Dang ky Driver</small>

<small> Class.forName("com.mysql.jdbc.Driver");</small>

<small> // Buoc 3: Mo mot ket noi</small>

<small> System.out.println("Dang ket noi toi co so du lieu ...");</small>

<small> conn =DriverManager.getConnection(DB_URL,USER,PASS);</small>

<small> // Buoc 4: Thuc thi truy van</small>

</div><span class="text_page_counter">Trang 21</span><div class="page_container" data-page="21">

<small> System.out.println("Tao cac lenh truy van SQL ...");</small>

<small> String sql ="UPDATE sinhvienk60 SET diemthi=? WHERE mssv=?";</small>

<small> stmt = conn.prepareStatement(sql); // Gan ket cac gia tri vao trong cac tham so.</small>

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

<small> System.out.println("So hang bi tac dong : " rows );</small>

<small> // Lua chon tat ca ban ghi va hien thi chung.</small>

<small> sql ="SELECT mssv, ho, ten, diemthi FROM sinhvienk60";</small>

<small> int diemthi = rs.getInt("diemthi");</small>

<small> String ho = rs.getString("ho");</small>

<small> String ten = rs.getString("ten");</small>

<small> // Hien thi cac gia tri</small>

<small> System.out.print("\nMSSV: " mssv);</small>

<small> System.out.print("\nHo: " ho);</small>

<small> System.out.println("\nTen: " ten);</small>

<small> System.out.print("\nDiem Thi: " diemthi);</small>

<small> System.out.print("\n=================");</small>

</div><span class="text_page_counter">Trang 22</span><div class="page_container" data-page="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.

</div><span class="text_page_counter">Trang 23</span><div class="page_container" data-page="23">

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

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 đó:

<b>-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. </b>

<b>-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 </b>

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 tồ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:

<b>1. void setAutoCommit(boolean status): Là true theo mặc định. Để </b>

thao tác với Transaction, bạn nên thiết lập về false.

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

<b>3. void rollback(): Xóa tất cả các thay đổi đ được thực hiện trước đó và </b>

quay về trạng thái trước khi thực hiện thay đổi.

<b>4. setSavepoint(String ten_cua_savepoint): Định nghĩa một savepoint </b>

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

</div><span class="text_page_counter">Trang 24</span><div class="page_container" data-page="24">

<b>6. rollback (String ten_cua_savepoint): Quay về trạng thái của </b>

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.

<small>import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; </small>

<small>public class TransactionExample { </small>

<small> public static void main(String[] args) throws SQLException { try (Connection con = ConnectionUtils.openConnection(); Statement st = con.createStatement();) { </small>

<small> con.setAutoCommit(false); // 1. Disable individualtransaction try { </small>

<small>// This user will be inserted </small>

<small> st.executeUpdate("INSERT INTO user(username, password, createdDAte) "+ "VALUE('user-1', '123', now());"); </small>

<small> System.out.println("Inserted user-1 successfully"); // This is an error sql. Cannot insert user </small>

<small> st.executeUpdate("INSERT INTO user2(username, password, createdDAte) + "VALUE('user-2', '123', now());"); </small>

<small> System.out.println("Inserted user-2 successfully"); </small>

<small> con.commit(); // 2. commit data to database if all command are success </small>

<small> } catch (Exception e) { e.printStackTrace(); </small>

<small> con.rollback(); // 2. roll-back data if one of command are failed </small>

<small> System.out.println("Rollback data"); } </small>

<small> } } } </small>

Với ví dụ trên ta sẽ có kết quả như sau: <small>Inserted user-1 successfully </small>

<small>java.sql.SQLSyntaxErrorException: Table 'jdbcdemo.user2' doesn't exist </small>

</div><span class="text_page_counter">Trang 25</span><div class="page_container" data-page="25">

<small>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</small>

<small>onsMapping.java:122) </small>

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

<small>Rollback data </small>

<b>Batch Processing </b>

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:

<b>1. addBatch(String sql) : thêm các lệnh đơn tới batch. Tham số sql ở đây là </b>

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.

<b>2. int[] executeBatch() :bắt đầu sự thực thi của tất cả các lệnh đ được nhóm </b>

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.

<b>3. clearBatch() : xóa lệnh đ thêm kh i batch. </b>

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.

</div><span class="text_page_counter">Trang 26</span><div class="page_container" data-page="26">

<small>public class BatchProcessingExample { </small>

<small> public static void main(String[] args) throws SQLException { </small>

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

<small> try ( </small>

<small> Connection con = ConnectionUtils.openConnection(); </small>

<small> PreparedStatement pstm =con.prepareStatement(sqlInsert, Statement.RETURN_GENERATED_KEYS);) { </small>

<small>// Executes the SQL statement </small>

<small> int[] counts = pstm.executeBatch(); </small>

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

<small> } catch (Exception e) { e.printStackTrace(); con.rollback(); } </small>

<small> } } </small>

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

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

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

<small> } </small>

<small> return users; } </small>

</div><span class="text_page_counter">Trang 27</span><div class="page_container" data-page="27">

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

<small>public class SQLExceptionExample { </small>

<small> private static final String hostName = "localhost"; private static final String dbName = "jdbcdemo"; private static final String userName = "root"; private static final String password = ""; </small>

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

<small> public static void main(String[] args) { try { </small>

<small> System.out.println("inserted successfully : " + numberRowsAffected); </small>

</div><span class="text_page_counter">Trang 28</span><div class="page_container" data-page="28">

<small> } </small>

<small> } catch (SQLException se) { se.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } </small>

<small> } } </small>

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: <small>java.lang.ClassNotFoundException: com.mysql.jdbc.Driver2 </small>

<small>at java.net.URLClassLoader.findClass(URLClassLoader.java:381) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) </small>

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

<small>at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:264) </small>

<small>at com.gpcoder.SQLExceptionExample.main(SQLExceptionExample.java:18) </small>

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

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

<small>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</small>

<small>onsMapping.java:122) </small>

<small>at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:827) at com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:447) </small>

<small>at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:237) </small>

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

<small>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: </small>

<small>java.sql.SQLSyntaxErrorException: Table 'jdbcdemo.user2' doesn't exist </small>

<small>at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120) at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97) </small>

</div><span class="text_page_counter">Trang 29</span><div class="page_container" data-page="29">

<small>at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) </small>

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

</div><span class="text_page_counter">Trang 30</span><div class="page_container" data-page="30">

<b> ÀI TẬP Bài 1. </b>

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

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:

<small>-public static Connection getMySQLConnection(String hostName, String dbName, String userName, String password) throws SQLException, </small>

<small>public interface DAO<T> { </small>

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

<small> public Object findByName(String name,Connection con); } </small>

<small>CREATE DATABASE banking; USE banking; </small>

<small>CREATE TABLE accounts ( </small>

</div><span class="text_page_counter">Trang 31</span><div class="page_container" data-page="31">

<small> account_number INT PRIMARY KEY, customer_name VARCHAR(255), balance DECIMAL(10, 2) ); </small>

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

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

</div><span class="text_page_counter">Trang 32</span><div class="page_container" data-page="32">

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

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

<b>Nội dung: </b>

- 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

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

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

<i>Hình 2: 1 Java Foundation Class </i>

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,

</div><span class="text_page_counter">Trang 33</span><div class="page_container" data-page="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,…

<b>2.2. AWT </b>

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

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:

<i>• 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. </i>

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

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

<b>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 </b>

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

<i>• 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. </i>

<i><b>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 </b></i>

đố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:

<i>• Frame(): Khởi tạo khơng tham số. </i>

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

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

chiều cao của frame.

<i>• 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. </i>

<b>Panel </b>

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ổ

</div><span class="text_page_counter">Trang 34</span><div class="page_container" data-page="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:

<i>• Panel(): Khởi tạo khơng tham số. </i>

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

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

<small> Button button2; TextField txt; </small>

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

<small> super(title); </small>

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

<small> Panel panel = new Panel(); </small>

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

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

</div><span class="text_page_counter">Trang 35</span><div class="page_container" data-page="35">

<small> panel.add(txt); panel.add(lblNhan1); panel.add(button1); panel.add(button2); panel.add(mylabel); panel.setLayout(null); this.add(panel); </small>

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

<small> this.setBounds(20, 20, 500, 300); this.setLayout(null); </small>

<small> this.setVisible(true); } </small>

<small>} </small>

<small>public class PanelExample1 { </small>

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

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

<small> } } </small>

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

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

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

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

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

</div><span class="text_page_counter">Trang 36</span><div class="page_container" data-page="36">

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

hình.

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

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

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

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

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

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

<small>import java.awt.*; </small>

<small>public class DialogDemo{ </small>

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

<small>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 </small>

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

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

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

<b>Label </b>

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:

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

<i>• 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 </i>

đị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}.

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

<i>• 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. </i>

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

</div><span class="text_page_counter">Trang 37</span><div class="page_container" data-page="37">

<small>public class LabelDemo{ </small>

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

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

<small>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 </small>

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

<b>TextField và TextArea </b>

Đâ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

<b>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 </b>

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

<i>• 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 tồn văn bản. </i>

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

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

<i>• TextField(): Khởi tạo một ơ văn bản r ng. </i>

<i>• 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ố </i>

đầu vào.

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

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

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.

<i>• 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. </i>

</div><span class="text_page_counter">Trang 38</span><div class="page_container" data-page="38">

<i>• 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) </i>

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

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

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

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

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

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

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

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

<small>import java.awt.*; public class TextDemo{ </small>

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

<small>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 </small>

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

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

<small>TextArea myTextArea = new TextArea(5, 40); </small>

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

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

<small>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} } </small>

<b>Button </b>

</div><span class="text_page_counter">Trang 39</span><div class="page_container" data-page="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:

<i>• 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. </i>

<small>import java.awt.*; </small>

<small>import java.awt.event.*; import javax.swing.JFrame; </small>

<small>public class DemoButton extends JFrame implements ActionListener { Button helloButton,blueButton,whiteButton,b; </small>

<small> DemoButton(String tile) {super(tile); </small>

<small> helloButton=new Button("Hello"); blueButton=new Button("Blue"); whiteButton=new Button("White"); b=new Button("OK"); </small>

<small> this.setLayout(new FlowLayout()); this.add(helloButton); </small>

<small> this.add(blueButton); this.add(whiteButton); this.add(b); </small>

<small> helloButton.addActionListener(this); blueButton.addActionListener(this); whiteButton.addActionListener(this); </small>

<small> b.addActionListener(new ActionListener() { @Override </small>

<small> public void actionPerformed(ActionEvent e) { </small>

<small> //To change body of generated methods, choose Tools | Templates. </small>

<small> System.out.println("nhan vao ok"); } </small>

<small> }); </small>

<small> this.addWindowListener(new WindowClosing()); </small>

<small> this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setBounds(50,50,300,200); </small>

<small> this.setVisible(true); </small>

</div><span class="text_page_counter">Trang 40</span><div class="page_container" data-page="40">

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

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

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:

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

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

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

trạng thái.

<b>• FocusEvent: Xuất hiện khi một component có hoặc mất focus. </b>

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

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

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

hoặc thốt ra.

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

TextArea bị thay đổi.

</div>

×