<span class="text_page_counter">Trang 1</span><div class="page_container" data-page="1">
<b>LẬP TRÌNH JAVA</b>
<b>Giảng viên: Tạ Việt PhươngE-mail: </b>
<b>Ch 6. MƠ HÌNH 3 LỚP</b>
</div><span class="text_page_counter">Trang 2</span><div class="page_container" data-page="2">
<b>Nội dung</b>
1.Giới thiệu
2.Mơ hình 3 layer
3.Mơ hình MVC
</div><span class="text_page_counter">Trang 3</span><div class="page_container" data-page="3">
<b>GIỚI THIỆU</b>
</div><span class="text_page_counter">Trang 4</span><div class="page_container" data-page="4">
<b>Giới thiệu</b>
◂Mơ hình 3 lớp:
◂3 tiers ?
◂3 layer ?
</div><span class="text_page_counter">Trang 5</span><div class="page_container" data-page="5">
<b>Giới thiệu</b>
◂3 tiers -3 tầng
◂3 layer -3 lớp
</div><span class="text_page_counter">Trang 6</span><div class="page_container" data-page="6">
<b>3-tiers và 3-layer</b>
◂3-tiers là một kiến trúc kiểu client/server mà trong đó giao diện người dùng (UI-user interface), các quy tắc xử lý (BR-business rule hay BL-business logic), và việc lưu trữ dữ liệu được phát triển như những module độc lập, và hầu hết là được duy trì trên các nền tảng độc lập, và mơ hình 3
tầng (3-tiers) được coi là một kiến trúc phần mềm và là một mẫu thiết kế.
◂
Tầng Presentation: hiển thị các thành phần giao diện để tương tác với người dùng như tiếp nhận thông tin, thông báo lỗi, …
◂
Tầng Business Logic: thực hiện các hành động nghiệp vụ của phần mềm như tính tốn, đánh giá tính hợp lệ của thơng tin, Tầng này cịn di chuyển, xử lí thơng tin giữa 2 tầng trên dưới.</div><span class="text_page_counter">Trang 7</span><div class="page_container" data-page="7">
<b>3-tiers và 3-layer</b>
◂Nếu 3 tiers có tính vật lí thì 3 layer có tính logic.
Nghĩa là ta phân chia ứng dụng thành các phần (các lớp) theo chức năng hoặc vai trò một cách logic. Các layer khác nhau được thực thi trong 1 phân vùng bộ nhớ của process. Vì thế nên một tier có thể có nhiều layer.
◂“Lớp” đề cập đến bộ phận chức năng của phần
mềm, nhưng “tầng” đề cập đến bộ phận chức năng của phần mềm chạy trên cơ sở hạ tầng tách biệt với các bộ phận khác.
</div><span class="text_page_counter">Trang 8</span><div class="page_container" data-page="8">
<b>MƠ HÌNH 3 LAYER</b>
</div><span class="text_page_counter">Trang 9</span><div class="page_container" data-page="9">
<b>Mơ hình 3 lớp</b>
◂Trong phát triển ứng dụng, mơ hình 3 lớp ra đời nhằm phân chia các thành phần trong hệ thống để dễ quản lý
◂Các thành phần cùng chức năng sẽ được nhóm lại với nhau và phân chia trách nhiệm cho từng nhóm để công việc không bị chồng chéo và ảnh hưởng lẫn nhau
</div><span class="text_page_counter">Trang 10</span><div class="page_container" data-page="10">
<b>Tổ chức mơ hình 3 layer</b>
◂Mơ hình 3-layer gồm có 3 phần chính:
◂
<b>Presentation Layer (GUI) : </b>Lớp này có nhiệm vụ chính giao tiếp với người dùng. Nó gồm các thành phần giao diện ( win form, web form,…) và thực hiện các công việc như nhập liệu, hiển thị dữ liêu, kiểm tra tính đúng đắn dữ liệu trước khi gọi lớp Business Logic Layer (BLL).
◂
<b>Business Logic Layer (BLL) : Layer này phân ra 2 thành </b></div><span class="text_page_counter">Trang 11</span><div class="page_container" data-page="11">
<b>Tổ chức mô hình 3 layer</b>
◂Mơ hình 3-layer gồm có 3 phần chính:
◂
<b>Data Access Layer (DAL): </b>Lớp này có chức năng giao tiếp với hệ quản trị CSDL như thực hiện các công việc liên quan đến lưu trữ và truy vấn dữ liệu ( tìm kiếm, thêm, xóa, sửa,…).
◂Một số cách đặt tên khác nhau cho 3 layer:◂Cách 1: GUI, BUS, DAL
◂Cách 2: GUI, BLL, DAO, DTO◂Cách 3: Presentation, BLL, DAL
</div><span class="text_page_counter">Trang 12</span><div class="page_container" data-page="12">
<b>Tổ chức mơ hình 3 layer</b>
</div><span class="text_page_counter">Trang 13</span><div class="page_container" data-page="13">
<b>Tổ chức mơ hình 3 layer</b>
◂Lớp này có nhiệm vụ chính là giao tiếp với người dùng.
◂Gồm các thành phần giao diện và thực hiện các công việc như nhập liệu, hiển thị dữ liệu, kiểm tra tính
đúng đắn dữ liệu trước khi gọi lớp Business Logic Layer.
</div><span class="text_page_counter">Trang 14</span><div class="page_container" data-page="14">
<b>Tổ chức mơ hình 3 layer</b>
◂Xử lý dữ liệu từ Presentation Layer trước khi truyền xuống Data Access Layer và lưu xuống hệ quản trịCSDL.
◂Kiểm tra các ràng buộc, tính tồn vẹn và hợp lệ dữ liệu, thực hiện tính tốn và xử lý các u cầu nghiệp vụ, trước khi trả kết quả về Presentation Layer.
</div><span class="text_page_counter">Trang 15</span><div class="page_container" data-page="15">
<b>Tổ chức mơ hình 3 layer</b>
◂Lớp này có chức năng giao tiếp với hệ quản trị CSDL
◂Thực hiện các công việc liên quan đến lưu trữ và truy xuất dữ liệu (đọc, thêm, xóa, sửa,…)
</div><span class="text_page_counter">Trang 16</span><div class="page_container" data-page="16">
<b>Tổ chức mơ hình 3 layer</b>
◂Các layer trao đổi dữ liệu thông qua Data Transfer Object (DTO).
◂DTO là đối tượng chứa dữ liệu, được tạo từ các DTO class đại diện cho các đối tượng được lưu trữtrong CSDL.
</div><span class="text_page_counter">Trang 17</span><div class="page_container" data-page="17">
◂BLL sẽ kiểm tra và tính tốn các u cầu nghiệp vụ, nếu u cầu khơng hợp lệ hoặc khơng cần đến
database thì BLLsẽ trả kết quả về cho GUI.
</div><span class="text_page_counter">Trang 18</span><div class="page_container" data-page="18">
◂BLL kiểm tra và gửi kết quả lên GUI.
◂GUI sẽ hiển thị thông báo và kết quả yêu cầu cho người dùng.
</div><span class="text_page_counter">Trang 19</span><div class="page_container" data-page="19">
<b>Cách thức vận hành</b>
◂Một khi gặp lỗi (các trường hợp khơng đúng dữ liệu) thì đang ở layer nào thì đưa lên trên layer cao hơn nó 1 bậc cho tới GUI thì sẽ đưa ra cho người dùng biết – Các dữ liệu được trung chuyển giữa các Layer thông qua Data Transfer Object (DTO)
</div><span class="text_page_counter">Trang 20</span><div class="page_container" data-page="20">
<b>Cách thức vận hành</b>
</div><span class="text_page_counter">Trang 21</span><div class="page_container" data-page="21">
<b>Ưu điểm</b>
◂Giúp code được tường minh hơn, giảm sự kết dính nhờ vào việc chia ra từng lớp đảm nhận các chức năng khác nhau và riêng biệt như giao diện, xử lý, truy vấn.
◂Dễ bảo trì: Khi 1 thành phần của hệ thống thay đổi, việc thay đổi này có thể được cơ lập trong 1 lớp, hoặc ảnh hưởng đến lớp gần nhất mà không ảnh hưởng đến cả chương trình.
</div><span class="text_page_counter">Trang 22</span><div class="page_container" data-page="22">
<b>Ưu điểm</b>
◂Dễ phát triển: Khi muốn thêm chức năng nào đó thì việc lập trình theo mơ hình sẽ dễ dàng hơn vì đã có chuẩn để tuân theo.
◂Dễ bàn giao: Việc bàn giao, tương tác với nhau sẽ dễ dàng, nhanh chóng hơn vì mọi người đều theo một quy chuẩn định sẵn.
◂Dễ phân phối khối lượng cơng việc: Mỗi nhóm sẽ nhận 1 nhiệm vụ được phân chia rõ ràng trong mô hình 3 lớp
</div><span class="text_page_counter">Trang 23</span><div class="page_container" data-page="23">
<b>Ví dụ</b>
</div><span class="text_page_counter">Trang 24</span><div class="page_container" data-page="24">
<b>Ví dụ</b>
◂CSDL QLNhanSu có bảng Employee với cấu trúc như sau:
</div><span class="text_page_counter">Trang 25</span><div class="page_container" data-page="25">
<b>Ví dụ</b>
</div><span class="text_page_counter">Trang 26</span><div class="page_container" data-page="26">
<b>Ví dụ</b>
<b>public class </b>employeeDTO {
<b>private int </b>employee_id;
<b>private String </b>employee_name;
<b>private int </b>birthyear;
<b>private String</b> address;
<b>public int </b>getEmployee_id() {
</div><span class="text_page_counter">Trang 28</span><div class="page_container" data-page="28">
<b>Ví dụ</b>
package DAL;
import DTO.employeeDTO;import java.sql.*;
import java.util.Vector;public class employeeDAL {private Connection con;
public boolean openConnection() {try {
String dbUrl = "jdbc:sqlserver://localhost:1433;
</div><span class="text_page_counter">Trang 29</span><div class="page_container" data-page="29">
<b>Ví dụ</b>
return true;
} catch (Exception ex) {System.out.println(ex);return false; }
public void closeConnection() {try {
if (con!=null)con.close();
} catch (SQLException ex) {System.out.println(ex); }}
</div><span class="text_page_counter">Trang 30</span><div class="page_container" data-page="30">
<b>Ví dụ</b>
public Vector<employeeDTO> getAllEmployees(){
Vector<employeeDTO> arr = new Vector<employeeDTO>();if (openConnection()) {
try {
String sql = “Select * from Employee";Statement stmt = con.createStatement();ResultSet rs = stmt.executeQuery(sql);while(rs.next()){
employeeDTO em = new employeeDTO();
em.setAddress(rs.getString("address"));
</div><span class="text_page_counter">Trang 31</span><div class="page_container" data-page="31">
return arr;}
public boolean addEmployee(employeeDTO emp) {boolean result = false;
if (openConnection()) {try {
String sql = “Insert into Employee values(?,?,?,?)";
</div><span class="text_page_counter">Trang 32</span><div class="page_container" data-page="32">
<b>Ví dụ</b>
PreparedStatement stmt = con.prepareStatement(sql);stmt.setInt(1, emp.getEmployee_id());
stmt.setString(2, emp.getEmployee_name());stmt.setInt(3, emp.getBirthYear());
stmt.setString(4, emp.getAddress());if (stmt.executeUpdate()>=1)
}
</div><span class="text_page_counter">Trang 33</span><div class="page_container" data-page="33">
<b>Ví dụ</b>
public boolean hasEmployeeID(int id){boolean result = false;
if (openConnection()) {try {
String sql = “Select * from Employee whereemployee_id="+id;
Statement stmt = con.createStatement();ResultSet rs = stmt.executeQuery(sql);result = rs.next();
} catch (SQLException ex) {System.out.println(ex);
} finally { closeConnection(); } }return result;
} }
</div><span class="text_page_counter">Trang 34</span><div class="page_container" data-page="34">
<b>Ví dụ</b>
package BLL;
import DAL.employeeDAL;import DTO.employeeDTO;import java.util.Vector;public class employeeBLL {
employeeDAL empDAL = new employeeDAL();
public Vector<employeeDTO> getAllEmployees(){return empDAL.getAllEmployees();
}
</div><span class="text_page_counter">Trang 35</span><div class="page_container" data-page="35">
<b>Ví dụ</b>
public String addEmployee(employeeDTO emp) {if (empDAL.hasEmployeeID(emp.getEmployee_id()))return "Mã NV đã tồn tại";
if (empDAL.addEmployee(emp))return "Thêm thành công";return "Thêm thất bại";}
}
</div><span class="text_page_counter">Trang 36</span><div class="page_container" data-page="36">
… // khai báo các thành phần giao diện khácpublic employeeGUI() {
initComponents();
</div><span class="text_page_counter">Trang 37</span><div class="page_container" data-page="37">
<b>Ví dụ</b>
public void initComponents() {
….. // khởi tạo các thành phần giao diện}
public void loadEmployeeList(){
DefaultTableModel dtm = new DefaultTableModel();dtm.addColumn("Mã NV");
dtm.addColumn("Ho tên");dtm.addColumn("Năm sinh");dtm.addColumn("Địa chỉ");jTable1.setModel(dtm);
Vector<employeeDTO> arr = newVector<employeeDTO>();
</div><span class="text_page_counter">Trang 38</span><div class="page_container" data-page="38">
Object[] row = {id,name,birthyear,address};dtm.addRow(row);
}}}
</div><span class="text_page_counter">Trang 39</span><div class="page_container" data-page="39">
JOptionPane.showMessageDialog(this,"Vui lòng nhậpđủ thông tin");
else {
employeeDTO em = new employeeDTO();
em.setEmployee_id(Integer.parseInt(txtID.getText()));em.setEmployee_name(txtName.getText());
</div><span class="text_page_counter">Trang 40</span><div class="page_container" data-page="40">
<b>Ví dụ</b>
} catch (NumberFormatException ex) {
JOptionPane.showMessageDialog(this, “Thơng tin khơng hợp lệ");
}}
</div><span class="text_page_counter">Trang 41</span><div class="page_container" data-page="41">
<b>Ví dụ</b>
◂Presentation layer (main.java)
package GUI;
public class main {
public static void main(String[] args){employeeGUI frm = new employeeGUI();frm.setVisible(true);
}}
</div><span class="text_page_counter">Trang 42</span><div class="page_container" data-page="42">
<b>MƠ HÌNH MVC</b>
</div><span class="text_page_counter">Trang 43</span><div class="page_container" data-page="43">
<b>Mơ hình MVC</b>
◂Mơ hình MVC (Model – View – Controller) là một kiến trúc phần mềm hay mơ hình thiết kế được sử dụng trong kỹ thuật phần mềm. Nó giúp cho các developer tách ứng dụng của họ ra 3 thành phần khác nhau Model, View và Controller. Mỗi thành phần có một nhiệm vụ riêng biệt và độc lập với các thành phần khác.
</div><span class="text_page_counter">Trang 44</span><div class="page_container" data-page="44">
<b>Mơ hình MVC</b>
◂Các thành phần của MVC:
◂<b>Model: </b>Đây là thành phần chứa tất cả các nghiệp vụ logic, phương thức xử lý, truy xuất database, đối tượng mô tả dữ liệu như các Class, hàm xử lý…
◂<b>View: </b>Đảm nhận việc hiển thị thông tin, tương tác với người dùng, nơi chứa tất cả các đối tượng GUI như textbox, images…Hiểu một cách đơn giản, nó là tập hợp các form hoặc các file HTML
◂<b>Controller: </b>Giữ nhiệm vụ nhận điều hướng các yêu cầu từ người dùng và gọi đúng những phương thức xử lý chúng… Chẳng hạn thành phần này sẽ nhận request
</div><span class="text_page_counter">Trang 45</span><div class="page_container" data-page="45">
<b>Mơ hình MVC</b>
</div><span class="text_page_counter">Trang 46</span><div class="page_container" data-page="46">
<b>Mơ hình MVC</b>
</div><span class="text_page_counter">Trang 47</span><div class="page_container" data-page="47">
<b>Mơ hình MVC</b>
◂MVC làm việc như thế nào?
◂User tương tác với View, bằng cách click vào button, user gửi yêu cầu đi.
◂Controller nhận và điều hướng chúng đến đúng phương thức xử lý ở Model.
◂Model nhận thông tin và thực thi các yêu cầu. –
◂Khi Model hoàn tất việc xử lý, View sẽ nhận kết quả từ Model và hiển thị lại cho người dùng.
</div><span class="text_page_counter">Trang 48</span><div class="page_container" data-page="48">
◂3 Layer thường được sử dụng trong lập trình ứng dụng. Trong khi đó, MVC được ưu chuộng nhiều trong lập trình website vì tính linh hoạt và khơng bắt
</div><span class="text_page_counter">Trang 49</span><div class="page_container" data-page="49">
<b>Ví dụ</b>
</div><span class="text_page_counter">Trang 50</span><div class="page_container" data-page="50">
<b>Ví dụ</b>
◂Model
</div><span class="text_page_counter">Trang 51</span><div class="page_container" data-page="51">
<b>Ví dụ</b>
◂View
</div><span class="text_page_counter">Trang 52</span><div class="page_container" data-page="52">
<b>Ví dụ</b>
◂Controller
</div><span class="text_page_counter">Trang 53</span><div class="page_container" data-page="53">
<b>Ví dụ</b>
</div><span class="text_page_counter">Trang 54</span><div class="page_container" data-page="54">
<b>Ví dụ</b>
public class MVCPattern {
public static void main(String[] args){LoginView view = new LoginView();
LoginController control = new LoginController(view);Control.login();
}}
</div><span class="text_page_counter">Trang 55</span><div class="page_container" data-page="55">
<b>Q & A </b>
<b>Giảng viên: Tạ Việt PhươngE-mail: </b>
</div>