final java2 excercise 2012

94
Lập trình hướng đối tượng với Java 2 Trang 1 Khi: Đại Hc và Cao Đẳng Năm 2012 Hướng dn: Bài tp thực hành được chia theo Module Mi Module được thiết kế cho thời lượng là 6 tiết thc hành ti lp vi shướng dn ca ging viên. Tùy theo stiết phân b, mi tun hc có ththc hin nhiu Module. Sinh viên phi làm tt ccác bài tp trong các Module tuần tương ứng. Những sinh viên chưa hòan tất phn bài tp ti lp có trách nhim tlàm tiếp tc nhà. Các bài có du (*) là các bài tp nâng cao dành cho sinh viên khá gi i. Mi thc mc vcoding, sinh viên email t i [email protected] hoc thông tin trên blog: http://tranduythanh.blog.com Biên son: GV Trn Duy Thanh

Upload: sangtao

Post on 02-Dec-2015

88 views

Category:

Documents


14 download

TRANSCRIPT

Lập trình hướng đối tượng với Java 2

Trang 1

Khối: Đại Học và Cao Đẳng

Năm 2012

Hướng dẫn:

Bài tập thực hành được chia theo Module

Mỗi Module được thiết kế cho thời lượng là 6 tiết thực hành tại lớp với sự

hướng dẫn của giảng viên.

Tùy theo số tiết phân bổ, mỗi tuần học có thể thực hiện nhiều Module.

Sinh viên phải làm tất cả các bài tập trong các Module ở tuần tương ứng.

Những sinh viên chưa hòan tất phần bài tập tại lớp có trách nhiệm tự làm

tiếp tục ở nhà.

Các bài có dấu (*) là các bài tập nâng cao dành cho sinh viên khá giỏi.

Mọi thắc mắc về coding, sinh viên email tới [email protected]

hoặc thông tin trên blog: http://tranduythanh.blog.com

Biên soạn: GV Trần Duy Thanh

Lập trình hướng đối tượng với Java 2

Trang 2

Mục lục

Module 1 : Ôn tập Graphic User Interface. .................................................................... 3

Module 2: Thực hành về MultiThreading. ................................................................... 23

Module 3: Thực hành về Collections. ............................................................................ 34

Module 4: Thực hành về Networking. ........................................................................... 45

Module 5: Thực hành về JDBC. .................................................................................... 64

Module 6: Thực hành về JSP. ........................................................................................ 75

Lập trình hướng đối tượng với Java 2

Trang 3

MODULE 1 Mục đích: Ôn tập Graphic User Interface, giúp các sinh viên hiểu được LayoutManager, Common Control,

Event, DialogBox, Advanced Control. Sinh viên phải thực hiện tốt Module 1 để ứng dụng cho

các Module tiếp theo, đặc biệt là phần kết nối cơ sở dữ liệu.

Bài tập 1: Thực hành cách hiển thị cửa sổ Windows trong Java

Hãy hiển thị cửa sổ trên, yêu cầu viết class kế thừa từ JFrame

Hướng dẫn:

Giải thích:

Lập trình hướng đối tượng với Java 2

Trang 4

Bài tập 2: Thực hành về FlowLayout

FlowLayout cho phép add các control trên cùng một dòng, khi nào hết chỗ chứa nó sẽ tự động

xuống dòng, ta cũng có thể điều chỉnh hướng xuất hiện của control. Mặc định khi một JPanel

được khởi tạo thì bản thân lớp chứa này sẽ có kiểu Layout là FlowLayout.

Hướng dẫn:

Bài tập 3: Thực hành về BoxLayout

BoxLayout cho phép add các control theo dòng hoặc cột, tại mỗi vị trí add nó chỉ chấp nhận 1

control, do đó muốn xuất hiện nhiều control tại một vị trí thì bạn nên add vị trí đó là 1 JPanel rồi

sau đó add các control khác vào JPanel này.

Lập trình hướng đối tượng với Java 2

Trang 5

BoxLayout.X_AXIS : Cho phép add các control theo hướng từ trái qua phải.

BoxLayout.Y_AXIS : Cho phép add các control theo hướng từ trên xuống dưới.

BoxLayout sẽ không tự động xuống dòng khi hết chỗ chứa, tức là các control sẽ bị che khuất

nếu như thiếu không gian chứa nó.

Hướng dẫn:

Lập trình hướng đối tượng với Java 2

Trang 6

Bài tập 4: Thực hành về BorderLayout

BorderLayout giúp chúng ta hiển thị các control theo 5 vùng: North, South, West, East, Center

Nếu như không có 4 vùng : North, West, South, East. Thì vùng Center sẽ tràn đầy cửa sổ, thông

thường khi đưa các control JTable, JTree, ListView, JScrollpane… ta thường đưa vào vùng

Center để nó có thể tự co giãn theo kích thước cửa sổ giúp giao diện đẹp hơn.

Lập trình hướng đối tượng với Java 2

Trang 7

Bài tập 5: Thực hành về các control căn bản

JButton

JLabel

JTextField

JTextArea

ButtonGroup & JRadioButton

JCheckBox

JComboBox

JList Thiết kế giao diện để giải phương trình bậc 2:

Hướng dẫn: Sinh viên phải xác định Layout Manager trước, ta cũng có thể kế hợp các Layout để

thiết kế giao diện, đặt tên control theo yêu cầu bên dưới

Tên Control Tên Biến Control Mô tả

JTextField txtSoa Dùng để nhập giá trị cho a

JTextField txtSob Dùng để nhập giá trị cho b

JTextField txtSoc Dùng để nhập giá trị cho c

JTextField txtKetqua Dùng để hiển thị kết quả

JButton btnGiai Viết lệnh để giải phương trình

JButton btnXoaTrang Xóa toàn bộ dữ liệu trong ô dl

JButton btnThoat Viết lệnh thoát chương trình

JLabel lblTieuDe Giải Phương Trình Bậc 2

Lập trình hướng đối tượng với Java 2

Trang 8

Bài tập 6: thiết kế giao diện để thực hiện các phép toán : ‘+’ ‘-’ ‘*’ ‘:’

Thiết kế giao diện như hình bên dưới:

Khi bấm nút Giải thì tùy thuộc vào phép toán được chọn mà kết quả thực hiện khác nhau. import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.border.*; public class CongTruNhanChiaUI extends JFrame { private static final long serialVersionUID = 1L; public CongTruNhanChiaUI(String title) { setTitle(title); } public void doShow() { setSize(400, 300); setLocationRelativeTo(null); setDefaultCloseOperation(EXIT_ON_CLOSE); addControl(); setResizable(false); setVisible(true); } public void addControl() { JPanel pnBorder=new JPanel(); pnBorder.setLayout(new BorderLayout()); JPanel pnNorth=new JPanel(); JLabel lblTitle=new JLabel("Cộng Trừ Nhân Chia"); pnNorth.add(lblTitle); pnBorder.add(pnNorth,BorderLayout.NORTH); lblTitle.setForeground(Color.BLUE); Font ft=new Font("arial", Font.BOLD, 25);

Lập trình hướng đối tượng với Java 2

Trang 9

lblTitle.setFont(ft); JPanel pnWest=new JPanel(); pnWest.setLayout(new BoxLayout(pnWest, BoxLayout.Y_AXIS)); JButton btnGiai=new JButton("Giải "); JButton btnXoa=new JButton("Xóa "); JButton btnThoat=new JButton("Thoát"); pnWest.add(btnGiai); pnWest.add(Box.createVerticalStrut(10)); pnWest.add(btnXoa); pnWest.add(Box.createVerticalStrut(10)); pnWest.add(btnThoat); pnBorder.add(pnWest,BorderLayout.WEST); pnWest.setBackground(Color.LIGHT_GRAY); Border southborder =BorderFactory.createLineBorder(Color.RED); TitledBorder southTitleBorder= new TitledBorder(southborder, "Chọn tác vụ"); pnWest.setBorder(southTitleBorder); JPanel pnSouth=new JPanel(); pnSouth.setPreferredSize(new Dimension(0, 30)); pnSouth.setBackground(Color.PINK); JPanel pns1=new JPanel(); pns1.setBackground(Color.BLUE); pnSouth.add(pns1); JPanel pns2=new JPanel(); pns2.setBackground(Color.RED); pnSouth.add(pns2); JPanel pns3=new JPanel(); pns3.setBackground(Color.YELLOW); pnSouth.add(pns3); pnBorder.add(pnSouth,BorderLayout.SOUTH); JPanel pnCenter=new JPanel(); pnCenter.setLayout(new BoxLayout(pnCenter, BoxLayout.Y_AXIS)); pnBorder.add(pnCenter,BorderLayout.CENTER); Border centerborder =BorderFactory.createLineBorder(Color.RED); TitledBorder centerTitleBorder= new TitledBorder(centerborder, "nhập 2 số a và b:"); pnCenter.setBorder(centerTitleBorder); JPanel pna=new JPanel(); JLabel lbla=new JLabel("nhập a:"); final JTextField txta=new JTextField(15); pna.add(lbla); pna.add(txta);

Lập trình hướng đối tượng với Java 2

Trang 10

pnCenter.add(pna); JPanel pnb=new JPanel(); JLabel lblb=new JLabel("nhập b:"); final JTextField txtb=new JTextField(15); pnb.add(lblb); pnb.add(txtb); pnCenter.add(pnb); JPanel pnc=new JPanel(); JPanel pnpheptoan=new JPanel(); pnpheptoan.setLayout(new GridLayout(2, 2)); pnpheptoan.setBorder(new TitledBorder(BorderFactory.createLineBorder(Color.BLACK),"Chọn phép toán:")); final JRadioButton radCong=new JRadioButton("Cộng"); pnpheptoan.add(radCong); final JRadioButton radTru=new JRadioButton("Trừ"); pnpheptoan.add(radTru); final JRadioButton radNhan=new JRadioButton("Nhân"); pnpheptoan.add(radNhan); final JRadioButton radChia=new JRadioButton("Chia"); pnpheptoan.add(radChia); ButtonGroup group=new ButtonGroup(); group.add(radCong);group.add(radTru); group.add(radNhan);group.add(radChia); pnc.add(pnpheptoan); pnCenter.add(pnc); JPanel pnkq=new JPanel(); JLabel lblkq=new JLabel("Kết quả:"); final JTextField txtkq=new JTextField(15); pnkq.add(lblkq); pnkq.add(txtkq); pnCenter.add(pnkq); lbla.setPreferredSize(lblkq.getPreferredSize()); lblb.setPreferredSize(lblkq.getPreferredSize()); btnThoat.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { int ret=JOptionPane.showConfirmDialog(null, "Muốn thoát hả?", "Thoát", JOptionPane.YES_NO_OPTION); if(ret==JOptionPane.YES_OPTION) System.exit(0); } }); btnXoa.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) {

Lập trình hướng đối tượng với Java 2

Trang 11

txta.setText(""); txtb.setText(""); txtkq.setText(""); txta.requestFocus(); } }); btnGiai.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { String sa=txta.getText(); int a=0,b=0; try { a=Integer.parseInt(sa); } catch(Exception ex) { JOptionPane.showMessageDialog(null, "Nhập sai định dạng!"); txta.selectAll(); txta.requestFocus(); return; } String sb=txtb.getText(); try { b=Integer.parseInt(sb); } catch(Exception ex) { JOptionPane.showMessageDialog(null, "Nhập sai định dạng!"); txtb.selectAll(); txtb.requestFocus(); return; } double kq=0; if(radCong.isSelected()) { kq=(a+b); } else if(radTru.isSelected()) { kq=(a-b); } else if(radNhan.isSelected()) { kq=(a*b); } else

Lập trình hướng đối tượng với Java 2

Trang 12

{ kq=a*1.0/b*1.0; } txtkq.setText(kq+""); } }); Container con=getContentPane(); con.add(pnBorder); } public static void main(String[] args) { CongTruNhanChiaUI ui=new CongTruNhanChiaUI("Cộng - Trừ - Nhân - Chia"); ui.doShow(); } }

Bài tập 7: Thao tác trên JList – Jcheckbox

Thiết kế giao diện như hình bên dưới và thực hiện các thao tác theo yêu cầu:

- Chương trình cho phép nhập vào các số nguyên từ giao diện trong phần nhập thông tin,

Khi người sử nhập giá trị vào JTextField và click nút “Nhập” thì sẽ cập nhập dữ liệu

xuống JList, Nếu checked vào “Cho nhập số âm” thì các số âm mới được phép đưa vào

JList còn không thì thông báo lỗi.

- Ô Chọn tác vụ, sinh viên phải thực hiện toàn bộ các yêu cầu

- Nút Đóng chương trình: sẽ hiển thị thông báo hỏi người sử dụng có muốn đóng hay

không.

Lập trình hướng đối tượng với Java 2

Trang 13

Bài tập 8: Viết chương trình quản lý sản phẩm

Yêu cầu chức năng: Cho phép nhập/ xuất danh mục, danh sách sản phẩm

- Cho phép cập nhật thông tin

- Cho phép lưu / đọc danh mục sản phẩm

- Yêu cầu sử dụng JMenuBar, JList, JTable, JCombobox, …

Cách lưu/ đọc đối tượng trên ổ cứng:

- Tất cả các class phải implements Serializable:

o public class Sanpham implements Serializable{…}

o public class DanhMucSanPham implements Serializable{…}

- Viết một class MyFile có 2 phương thức:

o Lưu đối tượng: public static void luuDoiTuong(Object obj, String fileName)

{

try

{

FileOutputStream fOut=new FileOutputStream(fileName);

Menu Write Data to disk dùng để lưu dữ liệu xuống ổ cứng

Menu Open Data from disk để đọc dữ liệ từ ổ cứng

Menu Exit dùng để thoát chương trình

Lập trình hướng đối tượng với Java 2

Trang 14

ObjectOutputStream out=new ObjectOutputStream(fOut);

out.writeObject(obj);

out.close();

}

catch(Exception ex)

{

ex.printStackTrace();

}

}

o Đọc đối tượng public static Object docDoiTuong(String fileName)

{

try

{

FileInputStream fIn=new FileInputStream(fileName);

ObjectInputStream in=new ObjectInputStream(fIn);

Object o=in.readObject();

in.close();

return o;

}

catch(Exception ex)

{

ex.printStackTrace();

}

return null;

}

- Trong testMain: DanhMucSanPham dsDienTu=(DanhMucSanPham )MyFile.docDoiTuong("luuluu.data");

if(dsDienTu!=null)

System.out.println(dsDienTu);

MyFile.luuDoiTuong(dsDienTu, "luuluu.data");

Bài tập 9: Thực hành về Timer class (*)

Dùng class Timer để thiết kế ứng dụng ImageAnimation.

Giao diện sẽ có 2 JButton: Start và Stop. Khi bấm Start chương trình sẽ hiển thị hình ảnh tuần tự

trong mảng 10 hình ảnh có sẵn. Bấm Stop để tạm dừng duyệt hình ảnh. Xem hình yêu cầu

Lập trình hướng đối tượng với Java 2

Trang 15

Hướng dẫn: Dùng CardLayout và Timer

import java.awt.*; import java.awt.event.*; import javax.swing.*; public class ImageAnimation extends JFrame{ private static final long serialVersionUID = 1L; Timer timer; private int pos=1; public ImageAnimation(String title) { super(title); timer=new Timer(500, null); } public void doShow() { setSize(500,550); setLocationRelativeTo(null); setDefaultCloseOperation(EXIT_ON_CLOSE); addControl(); setVisible(true); } public void addControl() { JPanel pnBorder=new JPanel(); pnBorder.setLayout(new BorderLayout()); JPanel pnNorth=new JPanel(); JButton btnStart=new JButton("Start"); JButton btnStop=new JButton("Stop"); pnNorth.add(btnStart); pnNorth.add(btnStop); pnBorder.add(pnNorth,BorderLayout.NORTH); final JPanel pnCenter=new JPanel();

Lập trình hướng đối tượng với Java 2

Trang 16

pnCenter.setLayout(new CardLayout()); pnBorder.add(pnCenter,BorderLayout.CENTER); pnCenter.setBackground(Color.RED); JPanel []pnArr=new JPanel[10]; addImage(pnCenter,pnArr); showImage(pnCenter,"card1"); btnStart.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { timer.start(); timer.addActionListener(new TimerPanel(pnCenter)); } }); btnStop.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { timer.stop(); } }); Container con=getContentPane(); con.add(pnBorder); } private void addImage(JPanel pnCenter,JPanel []pnArr) { for(int i=0;i<pnArr.length;i++) { pnArr[i]=new JPanel(); JLabel lbl=new JLabel(); ImageIcon icon=new ImageIcon("E:\\hoa\\"+i+".jpg"); lbl.setIcon(icon); pnArr[i].add(lbl); pnCenter.add(pnArr[i],"card"+i); } } public void showImage(JPanel pn,String cardName) { CardLayout cl=(CardLayout)pn.getLayout(); cl.show(pn, cardName); } private class TimerPanel implements ActionListener { JPanel pn=null; public TimerPanel(JPanel pn) { this.pn=pn; } public void actionPerformed(ActionEvent arg0) { showImage(pn,"card"+pos); pos++; if(pos>=10) pos=1; } } public static void main(String[] args) {; ImageAnimation imgUi=new ImageAnimation("Image Animation!"); imgUi.doShow(); } }

Lập trình hướng đối tượng với Java 2

Trang 17

Bài tập 10: Cải tiến bài tập 10. Chương trình sẽ cho phép đọc danh sách các hình ảnh bất kỳ

trong ổ đĩa. (*)

Hướng dẫn:

import java.awt.*; import java.awt.event.*; import java.io.File; import javax.swing.*; public class ImageAnimation2 extends JFrame{ private static final long serialVersionUID = 1L; Timer timer; private int pos=0; public ImageAnimation2(String title) { super(title); timer=new Timer(500, null); } public void doShow() { setSize(500,550); setLocationRelativeTo(null); setDefaultCloseOperation(EXIT_ON_CLOSE); addControl(); setVisible(true); } public void addControl() { JPanel pnBorder=new JPanel(); pnBorder.setLayout(new BorderLayout()); JPanel pnNorth=new JPanel();

Lập trình hướng đối tượng với Java 2

Trang 18

JButton btnBrowser=new JButton("Browser"); JButton btnStart=new JButton("Start"); JButton btnStop=new JButton("Stop"); pnNorth.add(btnBrowser); pnNorth.add(btnStart); pnNorth.add(btnStop); pnBorder.add(pnNorth,BorderLayout.NORTH); final JPanel pnCenter=new JPanel(); pnCenter.setLayout(new CardLayout()); pnBorder.add(pnCenter,BorderLayout.CENTER); pnCenter.setBackground(Color.RED); btnStart.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { timer.start(); timer.addActionListener(new TimerPanel(pnCenter)); } }); btnStop.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { timer.stop(); } }); btnBrowser.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { JFileChooser jfc=new JFileChooser(); jfc.setMultiSelectionEnabled(true); if(jfc.showOpenDialog(null)==JFileChooser.APPROVE_OPTION) { File []files=jfc.getSelectedFiles(); for(int i=0;i< files.length;i++) { File f=files[i]; ImageIcon icon=new ImageIcon(f.getPath()); JPanel pn=new JPanel(); JLabel lbl=new JLabel(icon); pn.add(lbl); pnCenter.add(pn,"card"+i); } showImage(pnCenter, "card0"); } } }); Container con=getContentPane(); con.add(pnBorder); } public void showImage(JPanel pn,String cardName) { CardLayout cl=(CardLayout)pn.getLayout(); cl.show(pn, cardName); } private class TimerPanel implements ActionListener

Lập trình hướng đối tượng với Java 2

Trang 19

{ JPanel pn=null; public TimerPanel(JPanel pn) { this.pn=pn; } public void actionPerformed(ActionEvent arg0) { showImage(pn,"card"+pos); pos++; if(pos>=pn.getComponentCount()) pos=0; } } public static void main(String[] args) {; ImageAnimation2 imgUi=new ImageAnimation2("Image Animation!"); imgUi.doShow(); } }

Bài tập 11: Thực hành về tạo Menu. Yêu cầu thiết kế Menu theo hình sau, ứng với mỗi menu

item sinh viên hãy cài đặt coding để hiển thị thông báo là đang chọn menu nào. (*)

Hướng dẫn: JMenuBarJMenuJMenuItem. Phải biết kết hợp các class này.

MenuBar sẽ add Menu, Menu sẽ add MenuItem, rồi gọi setJMenuBar(menuBar);

Yêu cầu giả lập Menu giống như chương trình Foxit Reader:

Menu File có giao diện như trên

Lập trình hướng đối tượng với Java 2

Trang 20

Menu Edit có giao diện như trên

Bài tập 12: Thực hành về JToolBar, tương tự như câu 12, giả lập Toolbar của chương trình

Foxit Reader, ứng với mỗi lệnh trên JToolBar, sinh viên hãy xuấtt thông báo đang sử dụng chức

năng nào. (*)

Hướng dẫn: tạo các JButton rồi add vào JToolBar

Bài tập 13: Thiết kế giao diện như hình bên dưới - JTable: (*)

package baitap13;

import java.awt.BorderLayout;

import java.awt.Container;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

Lập trình hướng đối tượng với Java 2

Trang 21

import javax.swing.BoxLayout;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JOptionPane;

import javax.swing.JPanel;

import javax.swing.JScrollPane;

import javax.swing.JTable;

import javax.swing.JTextField;

import javax.swing.table.DefaultTableModel;

public class AccUI {

JFrame myFrame=new JFrame("Account");

JTextField txtAccNumber;

JTextField txtAccName;

JTextField txtAccMoney;

JTable tblAcc;

DefaultTableModel tblModelAcc;

JButton btnAdd,btnClear,btnExit;

public AccUI()

{

JPanel pnAccNumber=new JPanel();

pnAccNumber.setLayout(new BoxLayout(pnAccNumber, BoxLayout.X_AXIS));

JLabel lblAccNumber=new JLabel("Account Number:");

pnAccNumber.add(lblAccNumber);

txtAccNumber=new JTextField(15);

pnAccNumber.add(txtAccNumber);

JPanel pnAccName=new JPanel();

pnAccName.setLayout(new BoxLayout(pnAccName, BoxLayout.X_AXIS));

JLabel lblAccName=new JLabel("Account Name:");

pnAccName.add(lblAccName);

txtAccName=new JTextField(15);

pnAccName.add(txtAccName);

JPanel pnAccMoney=new JPanel();

pnAccMoney.setLayout(new BoxLayout(pnAccMoney, BoxLayout.X_AXIS));

JLabel lblAccMoney=new JLabel("Account Money:");

pnAccMoney.add(lblAccMoney);

txtAccMoney=new JTextField(15);

pnAccMoney.add(txtAccMoney);

Container con=myFrame.getContentPane();

con.setLayout(new BorderLayout());

JPanel pInfor=new JPanel();

pInfor.setLayout(new BoxLayout(pInfor, BoxLayout.Y_AXIS));

pInfor.add(pnAccNumber);

pInfor.add(pnAccName);

pInfor.add(pnAccMoney);

con.add(pInfor,BorderLayout.NORTH);

tblModelAcc=new DefaultTableModel();

tblModelAcc.addColumn("Acc Number");

tblModelAcc.addColumn("Acc Name");

tblModelAcc.addColumn("Acc Money");

tblAcc=new JTable(tblModelAcc);

JScrollPane sc=new

JScrollPane(tblAcc,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCR

OLLBAR_AS_NEEDED);

con.add(sc,BorderLayout.CENTER);

Lập trình hướng đối tượng với Java 2

Trang 22

JPanel pnButton=new JPanel();

btnAdd=new JButton("Add");

btnAdd.setMnemonic('A');

btnClear=new JButton("Clear");

btnClear.setMnemonic('C');

btnExit=new JButton("Exit");

btnExit.setMnemonic('E');

pnButton.add(btnAdd);

pnButton.add(btnClear);

pnButton.add(btnExit);

con.add(pnButton,BorderLayout.SOUTH);

lblAccName.setPreferredSize(lblAccNumber.getPreferredSize());

lblAccMoney.setPreferredSize(lblAccNumber.getPreferredSize());

addEvents();

}

public void addEvents()

{

btnAdd.addActionListener(new ActionListener() {

@Override

public void actionPerformed(ActionEvent arg0) {

// TODO Auto-generated method stub

String

arr[]={txtAccNumber.getText(),txtAccName.getText(),txtAccMoney.getText()};

tblModelAcc.addRow(arr);

}

});

btnExit.addActionListener(new ActionListener() {

@Override

public void actionPerformed(ActionEvent arg0) {

// TODO Auto-generated method stub

int ret=JOptionPane.showConfirmDialog(null, "Are you sure you

want to exit?", "Exit!", JOptionPane.YES_NO_OPTION);

if(ret==JOptionPane.YES_OPTION)

System.exit(0);

}

});

}

public void doShow()

{

myFrame.setSize(400, 300);

myFrame.setLocationRelativeTo(null);

myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

myFrame.setVisible(true);

}

}

package baitap13;

public class TestAccount {

/**

* @param args

*/

public static void main(String[] args) {

AccUI ui=new AccUI();

ui.doShow();

}

}

Lập trình hướng đối tượng với Java 2

Trang 23

MODULE 2 Mục đích: Thực hành MultiThreading, hiểu được Thread, Runnable, Swings với Threading

Bài tập 1: Tạo một Thread kế thừa từ Thread class

Bài tập 2: Tạo một Thread implements từ Runnable interface

Lập trình hướng đối tượng với Java 2

Trang 24

Bài tập 3: Hiển thị các trạng thái trong Thread

Bài tập 4: Kiểm tra currentThread, acctiveCount và isAlive

Bài tập 5: Thiết lập độ ưu tiên cho Thread (dùng phương thức setPriority), có 3 độ ưu tiên căn

bản : MAX_PRIORITY (10), NORM_PRIORITY(5), MIN_PRIORITY(1). Chúng ta có thể

thiết lập độ ưu tiên tùy ý từ 1 tới 10.

Lập trình hướng đối tượng với Java 2

Trang 25

Lập trình hướng đối tượng với Java 2

Trang 26

Bài tập 6: Thực hành về Deamon Thread

Bài tập 7: Hãy viết chương trình Demo chuyển khoản ngân hàng

Yêu cầu : Phải đồng bộ dữ liệu giữa các lần gửi tiền / Rút tiền

Mục đích : Hiểu được Race Condition, ReentrantLock , synchronized…

Ví dụ về Race Condition.

Class Bank

/** A bank with a number of bank accounts. */ public class Bank { /** Constructs the bank. @param n the number of accounts @param initialBalance the initial balance for each account */ public Bank(int n, double initialBalance) { accounts = new double[n]; for (int i = 0; i < accounts.length; i++) accounts[i] = initialBalance; } /** Transfers money from one account to another. @param from the account to transfer from @param to the account to transfer to

Lập trình hướng đối tượng với Java 2

Trang 27

@param amount the amount to transfer */ public void transfer(int from, int to, double amount) { if (accounts[from] < amount) return; System.out.print(Thread.currentThread()); accounts[from] -= amount; System.out.printf(" %10.2f from %d to %d", amount, from, to); accounts[to] += amount; System.out.printf(" Total Balance: %10.2f%n", getTotalBalance()); } /** Gets the sum of all account balances. @return the total balance */ public double getTotalBalance() { double sum = 0; for (double a : accounts) sum += a; return sum; } /** Gets the number of accounts in the bank. @return the number of accounts */ public int size() { return accounts.length; } private final double[] accounts; }

Class TransferRunnable

/** A runnable that transfers money from an account to other accounts in a bank. */ public class TransferRunnable implements Runnable { /** Constructs a transfer runnable. @param b the bank between whose account money is transferred @param from the account to transfer money from

Lập trình hướng đối tượng với Java 2

Trang 28

@param max the maximum amount of money in each transfer */ public TransferRunnable(Bank b, int from, double max) { bank = b; fromAccount = from; maxAmount = max; } public void run() { try { while (true) { int toAccount = (int) (bank.size() * Math.random()); double amount = maxAmount * Math.random(); bank.transfer(fromAccount, toAccount, amount); Thread.sleep((int) (DELAY * Math.random())); } } catch (InterruptedException e) {} } private Bank bank; private int fromAccount; private double maxAmount; private int DELAY = 10; }

Class UnsynchBankTest

public class UnsynchBankTest { public static void main(String[] args) { Bank b = new Bank(NACCOUNTS, INITIAL_BALANCE); int i; for (i = 0; i < NACCOUNTS; i++) { TransferRunnable r = new TransferRunnable(b, i, INITIAL_BALANCE); Thread t = new Thread(r); t.start(); } } public static final int NACCOUNTS = 100; public static final double INITIAL_BALANCE = 1000; }

Lập trình hướng đối tượng với Java 2

Trang 29

Kết quả ta thấy dữ liệu không được đồng bộ, cho du chuyển / nhận sảy ra thì tổng tiền cũng

phải giữ nguyên, ở đây nó bị thay đổi, nguyên nhân gây ra là do Race Condition

Chúng ta sửa lại hàm run :

Kết quả là giữ liệu được đồng bộ

Lập trình hướng đối tượng với Java 2

Trang 30

Chúng ta có thể đồng bộ bằng cách tiếp cận ReentrantLock. Dưới đây là code minh họa:

Class Bank import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** A bank with a number of bank accounts. */ public class Bank { /** Constructs the bank. @param n the number of accounts @param initialBalance the initial balance for each account */ public Bank(int n, double initialBalance) { accounts = new double[n]; for (int i = 0; i < accounts.length; i++) accounts[i] = initialBalance; bankLock = new ReentrantLock(); sufficientFunds = bankLock.newCondition(); } /** Transfers money from one account to another. @param from the account to transfer from @param to the account to transfer to @param amount the amount to transfer */ public void transfer(int from, int to, double amount) throws InterruptedException { bankLock.lock(); try { while (accounts[from] < amount) sufficientFunds.await(); System.out.print(Thread.currentThread()); accounts[from] -= amount; System.out.printf(" %10.2f from %d to %d", amount, from, to); accounts[to] += amount; System.out.printf(" Total Balance: %10.2f%n", getTotalBalance()); sufficientFunds.signalAll(); } finally { bankLock.unlock(); } } /** Gets the sum of all account balances. @return the total balance */ public double getTotalBalance() {

Lập trình hướng đối tượng với Java 2

Trang 31

bankLock.lock(); try { double sum = 0; for (double a : accounts) sum += a; return sum; } finally { bankLock.unlock(); } } /** Gets the number of accounts in the bank. @return the number of accounts */ public int size() { return accounts.length; } private final double[] accounts; private Lock bankLock; private Condition sufficientFunds; }

Class TransferRunnable /** A runnable that transfers money from an account to other accounts in a bank. */ public class TransferRunnable implements Runnable { /** Constructs a transfer runnable. @param b the bank between whose account money is transferred @param from the account to transfer money from @param max the maximum amount of money in each transfer */ public TransferRunnable(Bank b, int from, double max) { bank = b; fromAccount = from; maxAmount = max; } public void run() { try { while (true) { int toAccount = (int) (bank.size() * Math.random());

Lập trình hướng đối tượng với Java 2

Trang 32

double amount = maxAmount * Math.random(); bank.transfer(fromAccount, toAccount, amount); Thread.sleep((int) (DELAY * Math.random())); } } catch (InterruptedException e) {} } private Bank bank; private int fromAccount; private double maxAmount; private int DELAY = 10; }

Class SynchBankTest /** This program shows how multiple threads can safely access a data structure. */ public class SynchBankTest { public static void main(String[] args) { Bank b = new Bank(NACCOUNTS, INITIAL_BALANCE); int i; for (i = 0; i < NACCOUNTS; i++) { TransferRunnable r = new TransferRunnable(b, i, INITIAL_BALANCE); Thread t = new Thread(r); t.start(); } } public static final int NACCOUNTS = 100; public static final double INITIAL_BALANCE = 1000; }

Bài tập 8 : Tiếp tục với bài chuyển khoản ở câu 7, yêu cầu thiết kế giao diện như hình dưới đây

để thực hiện chức năng chuyển khoản. Bấm vào Start chương trình sẽ tiến hành chuyển khoản

trên giao diện, khi bấm Stop chương trình sẽ dừng chuyển khoản.

Lập trình hướng đối tượng với Java 2

Trang 33

Bài tập 9: Dùng đa tiến trình để cập nhập dữ liệu cho JProgressBar. Giao diện chương trình như

bên dưới.

Coding mẫu : import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.border.Border; class myRun implements Runnable { JProgressBar proBar=null; public myRun(JProgressBar bar) { proBar=bar; } public void run() { int x=0; while(x<=100) { proBar.setValue(x); x++; try {Thread.sleep(1000);} catch (InterruptedException e) {} } Toolkit.getDefaultToolkit().beep(); JOptionPane.showMessageDialog(null, "Done"); } } public class ProgressSample { public static void main(String args[]) { JFrame f = new JFrame("JProgressBar Sample"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container content = f.getContentPane(); final JProgressBar progressBar = new JProgressBar(); progressBar.setStringPainted(true); Border border = BorderFactory.createTitledBorder("Reading..."); progressBar.setBorder(border); content.add(progressBar, BorderLayout.NORTH); JButton btn=new JButton("Start"); JPanel pn=new JPanel(); content.add(pn, BorderLayout.SOUTH); pn.add(btn); btn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { Thread t1=new Thread(new myRun(progressBar)); t1.start(); } }); f.setSize(300, 120); f.setLocationRelativeTo(null); f.setVisible(true); } }

Lập trình hướng đối tượng với Java 2

Trang 34

Bài tập 10: Dùng đa tiến trình để minh họa các thuật toán sắp xếp như giao diện bên dưới: (*)

Code mẫu xem trên trang : http://tranduythanh.blog.com/2012/07/31/vi-du-da-tien-trinh-trong-java-

thuat-toan-sap-xep/

MODULE 3 Mục đích: Thực hành về Collections, giúp sinh viên hiểu được : ArrayList, LinkedList, Vector, Hash table,

HashSet, LinkedHashSet, TreeSet, HashMap, TreeMap, PriorityQueue, Properties.

Bài tập 1 : Viết chương trình quản lý sinh viên dưới dạng console, yêu cầu sử dụng ArrayList

hoặc LinkedList hoặc Vector và thực hiện các chức năng sau (thông tin sinh viên bao gồm : mã

số sinh viên, họ tên, năm sinh, địa chỉ, lớp học):

a) Cho phép thêm, sửa, xóa danh sách sinh viên

b) Xuất ra số lượng sinh viên

c) Xuất ra danh sách các sinh viên thuộc một lớp học bất kỳ nhập vào từ bàn phím

d) Cho phép lưu/mở danh sách sinh viên trên ổ cứng

Coding mẫu câu a, các câu khác sinh viên tự làm:

Class Sinhvien

Lập trình hướng đối tượng với Java 2

Trang 35

package chap2.quanlysinhvien; import java.util.Date; public class Sinhvien { private String Masv; private String Tensv; private Date Namsinh; private String Diachi; private String Lop; public String getMasv() { return Masv; } public void setMasv(String masv) { Masv = masv; } public String getTensv() { return Tensv; } public void setTensv(String tensv) { Tensv = tensv; } public Date getNamsinh() { return Namsinh; } public void setNamsinh(Date namsinh) { Namsinh = namsinh; } public String getDiachi() { return Diachi; } public void setDiachi(String diachi) { Diachi = diachi; } public String getLop() { return Lop; } public void setLop(String lop) { Lop = lop; } public String toString() { return "Sinhvien [Masv=" + Masv + ", Tensv=" + Tensv + ", Namsinh=" + Namsinh + ", Diachi=" + Diachi + ", Lop=" + Lop + "]"; } }

Class DanhSachSinhvien package chap2.quanlysinhvien; import java.util.ArrayList; public class DanhSachSinhvien { private ArrayList<Sinhvien> dsSv=new ArrayList<Sinhvien>(); public boolean ktTrungma(String masv) { for(Sinhvien sv : dsSv) { if(sv.getMasv().equalsIgnoreCase(masv)) return true; } return false; }

Lập trình hướng đối tượng với Java 2

Trang 36

public boolean addSinhvien(Sinhvien sv) { if(ktTrungma(sv.getMasv())) return false; return dsSv.add(sv); } public Sinhvien findSinhvien1(String masv) { for(Sinhvien sv : dsSv) { if(sv.getMasv().equalsIgnoreCase(masv)) return sv; } return null; } public int findSinhvien2(String masv) { for(int i=0;i<dsSv.size();i++) { if(dsSv.get(i).getMasv().equalsIgnoreCase(masv)) return i; } return -1; } public Sinhvien updateSinhvien(int index,Sinhvien sv) { return dsSv.set(index, sv); } public void removeSinhvien(String masv) { Sinhvien sv=findSinhvien1(masv); dsSv.remove(sv); //int pos=findSinhvien2(masv); //dsSv.remove(pos); } public String toString() { return dsSv.toString(); } }

Class TestSinhvien

package chap2.quanlysinhvien; public class TestSinhvien { public static void main(String[] args) { DanhSachSinhvien qlsv=new DanhSachSinhvien(); Sinhvien teo=new Sinhvien(); teo.setMasv("113"); teo.setTensv("Nguyễn Văn Tèo"); qlsv.addSinhvien(teo); Sinhvien ty=new Sinhvien(); ty.setMasv("114"); ty.setTensv("Nguyễn Thị tý"); qlsv.addSinhvien(ty); System.out.println(qlsv); } }

Lập trình hướng đối tượng với Java 2

Trang 37

Bài tập 2: Thêm chức năng sắp xếp danh sách sinh viên theo mã số ở bài tập 1.

Bài tập này giúp sinh viên hiểu được chức năng sort của Collections và interface Comparable

Để sắp xếp được các sinh viên theo mã số thì class Sinh viên phải implements interface

Comparable đồng thời chúng ta phải override phương thức compareTo.

Coding mẫu cho bài này như sau:

package chap2.quanlysinhvien; import java.util.Date; public class Sinhvien implements Comparable<Sinhvien>{ private String Masv; …//code here… public String getMasv() { return Masv; } public int compareTo(Sinhvien o) { if(Masv.equalsIgnoreCase(o.getMasv())) return 0; return 1; } }

package chap2.quanlysinhvien; import java.util.ArrayList; import java.util.Collections; public class DanhSachSinhvien { private ArrayList<Sinhvien> dsSv=new ArrayList<Sinhvien>(); …//code here… public void sort() { Collections.sort(dsSv); } }

Khi nào muốn sắp xếp danh sách chúng ta chỉ cần gọi hàm sort trong class trên. public class TestSinhvien { public static void main(String[] args) { DanhSachSinhvien qlsv=new DanhSachSinhvien(); Sinhvien teo=new Sinhvien(); teo.setMasv("113"); teo.setTensv("Nguyễn Văn Tèo"); qlsv.addSinhvien(teo); Sinhvien ty=new Sinhvien(); ty.setMasv("114"); ty.setTensv("Nguyễn Thị tý"); qlsv.addSinhvien(ty); qlsv.sort(); System.out.println(qlsv); } }

Lập trình hướng đối tượng với Java 2

Trang 38

Bài tập 3: Hiệu chỉnh bài tập 1 về dạng Graphic User Interface, giao diện như bên dưới:

Yêu cầu:

- Sử dụng SimpleDateFormat để định dạng nhập năm sinh.

- Nút Thêm cho phép xóa trắng dữ liệu ở mục thông tin chi tiết và cho phép nhập dữ liệu

mới vào, khi nhấp nút Lưu sẽ lưu thông tin xuống ArrayList đồng thời cập nhập JTable.

- Nút Lưu dùng để lưu sinh viên vào danh sách ArrayList, nếu mã tồn tại thì tự động gọi

hàm cập nhập thông tin.

- Nút xóa cho phép xóa sinh viên đang chọn trong JTable.

- Mỗi lần click vào từng dòng trong JTable thì sẽ hiển thị thông tin chi tiết của sinh viên

vào phần thông tin chi tiết.

- Nút Lưu tập tin cho phép lưu danh sách sinh viên xuống ổ cứng (map đối tượng)

- Nút Mở tập tin cho phép load danh sách sinh viên trong tập tin lên JTable

- Nút thoát : khi nào người sử dụng chọn nút này thì sẽ hiển thị thông báo hỏi người sử

dụng có chắc chắn muốn thoát hay không? Nếu muốn thoát thì sẽ đóng chương trình, nếu

không thì giữ nguyên màn hình.

*** Chú ý, những bài này là tiền đề để vào chương JDBC chúng ta sẽ tiếp tục sử dụng

lại, do đó sinh viên phải hiểu cách tạo giao diện, gán sự kiện cũng như cách sử dụng các

collections.

Lập trình hướng đối tượng với Java 2

Trang 39

Coding mẫu cho phần giao diện (phần xử lý thông tin sinh viên tự thực hiện):

package chap2.quanlysinhvien; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; import java.awt.Font; import javax.swing.BorderFactory; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JTextField; import javax.swing.table.DefaultTableModel; public class QlsvUI extends JFrame{ private static final long serialVersionUID = 1L; JTextField txtMa,txtTen,txtNamsinh,txtDiachi,txtLop; JButton btnThemmoi,btnLuu,btnXoa,btnMotaptin,btnLuutaptin,btnThoat; JTable tblSinhvien; DefaultTableModel model; public QlsvUI(String title) { super(title); addControl(); } public void addControl() { Container con=getContentPane(); con.setLayout(new BorderLayout()); JPanel pnGeneral=new JPanel(); pnGeneral.setLayout(new BorderLayout()); con.add(pnGeneral,BorderLayout.CENTER); JPanel pnNorth=new JPanel(); pnNorth.setLayout(new BoxLayout(pnNorth, BoxLayout.Y_AXIS)); pnGeneral.add(pnNorth,BorderLayout.NORTH); JPanel pnTitle=new JPanel(); JLabel lblTitle=new JLabel("Chương trình quản lý sinh viên"); lblTitle.setFont(new Font("arial", Font.BOLD, 20)); lblTitle.setForeground(Color.BLUE); pnTitle.add(lblTitle); pnNorth.add(pnTitle); JPanel pnDetail=new JPanel(); pnDetail.setLayout(new BoxLayout(pnDetail, BoxLayout.Y_AXIS)); pnDetail.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.BLUE), "Thông tin chi tiết")); pnNorth.add(pnDetail); JPanel pnMa=new JPanel(); JLabel lblMa=new JLabel("Mã:"); pnMa.add(lblMa); txtMa=new JTextField(20); pnMa.add(txtMa);

Lập trình hướng đối tượng với Java 2

Trang 40

pnDetail.add(pnMa); JPanel pnTen=new JPanel(); JLabel lblTen=new JLabel("Tên:"); pnTen.add(lblTen); txtTen=new JTextField(20); pnTen.add(txtTen); pnDetail.add(pnTen); JPanel pnNamsinh=new JPanel(); JLabel lblNamsinh=new JLabel("Năm sinh:"); pnNamsinh.add(lblNamsinh); txtNamsinh=new JTextField(15); pnNamsinh.add(txtNamsinh); JLabel lblFormat=new JLabel("(dd/MM/yyyy)"); lblFormat.setFont(new Font("arial", Font.PLAIN, 10)); pnNamsinh.add(lblFormat); pnDetail.add(pnNamsinh); JPanel pnDiachi=new JPanel(); JLabel lblDiachi=new JLabel("Địa chỉ:"); pnDiachi.add(lblDiachi); txtDiachi=new JTextField(20); pnDiachi.add(txtDiachi); pnDetail.add(pnDiachi); JPanel pnLop=new JPanel(); JLabel lblLop=new JLabel("Lớp:"); pnLop.add(lblLop); txtLop=new JTextField(20); pnLop.add(txtLop); pnDetail.add(pnLop); JPanel pnButton1=new JPanel(); btnThemmoi=new JButton("Thêm"); btnLuu=new JButton("Lưu"); btnXoa =new JButton("Xóa"); pnButton1.add(btnThemmoi); pnButton1.add(btnLuu); pnButton1.add(btnXoa); pnDetail.add(pnButton1); JPanel pnTable=new JPanel(); pnTable.setLayout(new BorderLayout()); pnTable.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.BLUE), "Danh sách sinh viên")); model=new DefaultTableModel(); model.addColumn("Mã"); model.addColumn("Tên"); model.addColumn("Năm sinh"); model.addColumn("Địa chỉ"); model.addColumn("Lớp"); model.addRow(new String[]{"113","Lâm Sung","01/01/1970","Cà mau","CDTH10ALT"}); model.addRow(new String[]{"114","Tống Giang","01/01/1969","Móng Cái","DHTH1A"}); model.addRow(new String[]{"115","Lý Quỳ","12/12/1982","Đà Nẵng","TCTH39A"});

Lập trình hướng đối tượng với Java 2

Trang 41

tblSinhvien=new JTable(model); JScrollPane sc=new JScrollPane(tblSinhvien, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); pnTable.add(sc,BorderLayout.CENTER); pnGeneral.add(pnTable,BorderLayout.CENTER); JPanel pnButton2=new JPanel(); pnGeneral.add(pnButton2,BorderLayout.SOUTH); pnButton2.setLayout(new BorderLayout()); JPanel pnIo=new JPanel(); pnButton2.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.RED), "Nhập xuất")); btnMotaptin =new JButton("Mở tập tin"); pnIo.add(btnMotaptin); btnLuutaptin=new JButton("Lưu tập tin"); pnIo.add(btnLuutaptin); pnButton2.add(pnIo,BorderLayout.WEST); JPanel pnExit=new JPanel(); btnThoat=new JButton("Thoát"); pnExit.add(btnThoat); pnButton2.add(pnExit,BorderLayout.EAST); lblMa.setPreferredSize(lblDiachi.getPreferredSize()); lblLop.setPreferredSize(lblDiachi.getPreferredSize()); lblTen.setPreferredSize(lblDiachi.getPreferredSize()); } public void doShow() { setSize(600, 500); setLocationRelativeTo(null); setDefaultCloseOperation(EXIT_ON_CLOSE); setVisible(true); } public static void main(String[] args) { QlsvUI ui=new QlsvUI("Quản lý sinh viên"); ui.doShow(); } }

Bài tập 4: Thực hành với Hashtable.

Hashtable đi theo Key và Value. Nếu Key trùng nhau thì nó sẽ lấy theo Key thứ 2.

Hashtable cung cấp nhiều hàm hữu ích : put, get, remove, elements… tùy vào từng trường hợp

mà chúng ta ứng dụng cho phù hợp, dưới đây cung cấp một số ví dụ về Hashtable, yêu cầu sinh

viên thực hiện và cho nhận xét.

package chap1.myHashTable; public class Person { private String Id; private String Name; public String getId() { return Id; }

Lập trình hướng đối tượng với Java 2

Trang 42

public void setId(String id) { Id = id; } public String getName() { return Name; } public void setName(String name) { Name = name; } public Person(String id, String name) { super(); Id = id; Name = name; } public String toString() { return "Person [Id=" + Id + ", Name=" + Name + "]"; } }

package chap1.myHashTable; import java.util.Enumeration; import java.util.Hashtable; public class TestHashTable { public static void main(String[] args) { Hashtable<String, Person> hashTbl=new Hashtable<String, Person>(); hashTbl.put("1", new Person("1", "teo")); Person p=new Person("2", "ty"); if(hashTbl.containsKey(p.getId())) { System.out.println("Trung"); } else hashTbl.put(p.getId(), p); Person p2=new Person("3", "Nuong"); hashTbl.put(p2.getId(), p2); hashTbl.remove("1"); System.out.println(hashTbl); Person px= hashTbl.get("3"); Enumeration<Person> list=hashTbl.elements(); while(list.hasMoreElements()) { Person x=list.nextElement(); System.out.println(x); } } }

Sinh viên có thể dựa vào ví dụ này để đọc cơ sở dữ liệu và đổ vào Hashtable, với Key chính là

khóa chính, còn Value chính là đối tượng trong từng dòng dữ liệu.

Bài tập 5: Sinh viên hiệu chỉnh bài tập 3, thay vì sử dụng ArrayList để quản lý danh sách sinh

viên, bây giờ chúng ta phải sử dụng Hashtable để quản lý nhân sự (dùng class Person ở bài 4).

Lập trình hướng đối tượng với Java 2

Trang 43

Bài tập 6: Thực hành với HashSet , hãy so sánh sự khác biệt giữa HashSet , Hashtable và

ArrayList.

Sinh viên thực hiện ví dụ mẫu bên dưới, từ đó ứng dụng để viết chương trình quản lý sản phẩm.

package chap2.myHashSet; public class Product { private String Id; private String Name; private int Quantity; private double UnitPrice; public String getId() { return Id; } public void setId(String id) { Id = id; } public String getName() { return Name; } public void setName(String name) { Name = name; } public int getQuantity() { return Quantity; } public void setQuantity(int quantity) { Quantity = quantity; } public double getUnitPrice() { return UnitPrice; } public void setUnitPrice(double unitPrice) { UnitPrice = unitPrice; } public Product(String id, String name, int quantity, double unitPrice) { super(); Id = id; Name = name; Quantity = quantity; UnitPrice = unitPrice; } public String toString() { return "Product [Id=" + Id + ", Name=" + Name + ", Quantity=" + Quantity + ", UnitPrice=" + UnitPrice + "]"; } }

package chap2.myHashSet; import java.util.HashSet; import java.util.Iterator; public class TestHashSet { public static void main(String[] args) {

Lập trình hướng đối tượng với Java 2

Trang 44

HashSet<Product> myhs=new HashSet<Product>(); Product p1=new Product("p1", "Iphone 5", 2, 15); myhs.add(p1); Product p2=new Product("p2", "Samsung sII",3, 11); myhs.add(p2); System.out.println(myhs); Iterator<Product> list= myhs.iterator(); while(list.hasNext()) { Product x= list.next(); System.out.println(x); } } }

Bài tập 7: Hiệu chỉnh bài tập 6, yêu cầu sử dụng LinkedHashSet để quản lý sản phẩm. Sinh

viên hãy cho biết sự khác biệt giữa HashSet và LinkedHashSet.

Bài tập 8 : Viết chương trình biểu diễn 1 từ điển trong máy tính. Gợi ý: Sử dụng

TreeMap<String,WordObject> để lưu trữ tập các từ. Mỗi từ ở đây là 1 đối tượng gồm các thuộc

tính: từ (khóa của đối tượng), phát âm, loại từ, ghi chú.

Kết quả như hình sau:

Bài tập 9: Viết chương trình quản lý bài hát, yêu cầu sử dụng HashMap.

Lập trình hướng đối tượng với Java 2

Trang 45

MODULE 4 Mục đích: Thực hành về Networking. Module này giúp sinh viên hiểu được về InetAddress, Socket, RMI

SOCKET PROGRAMMING Bài tập 1:

Viết 1 chương trình có tên Calculator_server nhận 1 biểu thức gồm 2 chữ số và 1 phép toán sau

đó thực thi biểu thức này và gửi kết quả lại cho client.

Sữa chữa chương trình cho phép nhiều client kết nối cùng lúc.

Phía client, viết giao diện gồm 2 JtextField cho việc nhập số, 1 JLabel cho việc xuất kết quả.

Các nút Cộng, trừ, nhân,chia, clear và thoát.

Giao diện cho client như sau:

Bài tập 2:

Viết chương trình giải phương trình bậc 2, server lắng nghe tại port 8189, cho phép chạy nhiều

client. Yêu cầu viết theo 3 trường hợp (dùng Text Stream, Data Stream, Object Stream) Giao

diện được cho như bên dưới:

- Khi bấm nút Giải, server sẽ trả về kết quả.

- Khi bấm nút Xóa trắng, chương trình sẽ xóa trắng toàn bộ JTextField và focus tới số a.

- Khi chọn nút Thoát, chương trình sẽ hỏi người sử dụng có muốn thoát hay không.

Dưới đây là coding mẫu về trường hợp sử dụng Text Stream, các trường hợp khác sinh viên tự

làm :

Lập trình hướng đối tượng với Java 2

Trang 46

Class CServerThreadPtb2TextStream dùng để chạy đa tiến trình cho Test Serverr package duythanhwordpress.com.chapter3.ptb2textstream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.net.Socket; import java.util.Scanner; public class CServerThreadPtb2TextStream implements Runnable { private Socket m_soc; public CServerThreadPtb2TextStream(Socket soc) { m_soc=soc; } private String processInfomation(double a,double b,double c) { String sKQ=""; if(a==0) { if(b==0) { if(c==0) sKQ="Phương Trình có Vô số nghiệm"; else sKQ="Phương trình vô nghịêm"; } else { String sFormat=String.format("%10.2f", -c/b); sKQ="Pt có 1 no x="+sFormat; } } else { double delta=Math.pow(b, 2)-4*a*c; if(delta<0) { sKQ="Phương trình vô nghiệm"; } else if(delta==0) { String sFormat=String.format("%10.2f", -b/(2*a)); sKQ="Phương trình có nghiệm kép x1=x2="+sFormat; } else { double x1=(-b-Math.sqrt(delta))/(2*a); double x2=(-b+Math.sqrt(delta))/(2*a); String sFormat1=String.format("%10.2f", x1); String sFormat2=String.format("%10.2f", x2); sKQ ="phương trình có 2 nghiệm x1="+sFormat1 +" ; x2="+sFormat2; } } return sKQ; } @Override public void run() {

Lập trình hướng đối tượng với Java 2

Trang 47

try { InputStream in=m_soc.getInputStream(); Scanner sc=new Scanner(in); double a=sc.nextDouble(); double b=sc.nextDouble(); double c=sc.nextDouble(); String sKq=processInfomation(a,b,c); OutputStream out=m_soc.getOutputStream(); PrintWriter printOut=new PrintWriter(out,true); printOut.println(sKq); m_soc.close(); } catch(IOException ex) { ex.printStackTrace(); } catch(Exception ex) { ex.printStackTrace(); } } }

Class CClientPtb2TextStream dùng để chạy Test Client package duythanhwordpress.com.chapter3.ptb2textstream; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; import java.awt.Dimension; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.net.Socket; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTextField; public class CClientPtb2TextStream extends JFrame { private static final long serialVersionUID = 1L; private JButton btnSend,btnClear,btnExit; private JTextField txta,txtb,txtc,txtkq; public CClientPtb2TextStream() { createUI(); } private void createUI()

Lập trình hướng đối tượng với Java 2

Trang 48

{ setLayout(new BorderLayout()); JPanel pnNorth=new JPanel(); pnNorth.setBackground(Color.CYAN); JLabel lblNorth=new JLabel("Giải Phương Trình Bậc 2"); pnNorth.add(lblNorth); Container con=getContentPane(); con.add(pnNorth,BorderLayout.NORTH); JPanel pnCenter=new JPanel(); con.add(pnCenter,BorderLayout.CENTER); JPanel pnInfor=new JPanel(); pnInfor.setLayout(new BoxLayout(pnInfor, BoxLayout.Y_AXIS)); pnCenter.add(pnInfor); JPanel pna=new JPanel(); JLabel lbla=new JLabel("a:"); txta=new JTextField(15); pna.add(lbla); pna.add(txta); pnInfor.add(pna); pnInfor.add(Box.createRigidArea(new Dimension(0,5))); JPanel pnb=new JPanel(); JLabel lblb=new JLabel("b:"); txtb=new JTextField(15); pnb.add(lblb); pnb.add(txtb); pnInfor.add(pnb); pnInfor.add(Box.createRigidArea(new Dimension(0,5))); JPanel pnc=new JPanel(); JLabel lblc=new JLabel("c:"); txtc=new JTextField(15); pnc.add(lblc); pnc.add(txtc); pnInfor.add(pnc); pnInfor.add(Box.createRigidArea(new Dimension(0,20))); JLabel lblkq=new JLabel("kết quả:"); lblkq.setAlignmentX(JLabel.CENTER_ALIGNMENT); lblkq.setFont(new Font("Arial", Font.BOLD | Font.ITALIC, 25)); txtkq=new JTextField(15); txtkq.setEditable(false); pnInfor.add(lblkq); pnInfor.add(txtkq); pnInfor.add(Box.createRigidArea(new Dimension(0,20))); JPanel pnButton=new JPanel(); btnSend=new JButton("Send"); btnSend.addActionListener(new CMyEvent()); btnClear=new JButton("Clear"); btnClear.addActionListener(new CMyEvent()); btnExit=new JButton("Exit"); btnExit.addActionListener(new CMyEvent()); pnButton.add(btnSend); pnButton.add(btnClear); pnButton.add(btnExit); pnInfor.add(pnButton); }

Lập trình hướng đối tượng với Java 2

Trang 49

private void clearText() { txta.setText(""); txtb.setText(""); txtc.setText(""); } private void proccessInformation() { try { Socket soc=new Socket("localhost",8189); //Send Information to server OutputStream out=soc.getOutputStream(); PrintWriter printOut=new PrintWriter(out,true); printOut.println(Double.parseDouble(txta.getText())); printOut.println(Double.parseDouble(txtb.getText())); printOut.println(Double.parseDouble(txtc.getText())); //Get information from server InputStream in=soc.getInputStream(); java.util.Scanner sc=new java.util.Scanner(in); txtkq.setText(sc.nextLine()); soc.close(); } catch(IOException ex) { JOptionPane.showMessageDialog(this, ex.getMessage()); } catch(Exception ex) { JOptionPane.showMessageDialog(this, ex.getMessage()); } } private class CMyEvent implements ActionListener { @Override public void actionPerformed(ActionEvent arg0) { // TODO Auto-generated method stub Object o=arg0.getSource(); if(o.equals(btnSend)) { proccessInformation(); } else if(o.equals(btnClear)) { clearText(); } else if(o.equals(btnExit)) { System.exit(0); } } } /**w * @param args */

Lập trình hướng đối tượng với Java 2

Trang 50

public static void main(String[] args) { // TODO Auto-generated method stub CClientPtb2TextStream client=new CClientPtb2TextStream(); client.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); client.setSize(400, 300); client.setVisible(true); } }

Class CServerPtb2TextStream dùng để chạy Test Server

package duythanhwordpress.com.chapter3.ptb2textstream; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class CServerPtb2TextStream { public static void main(String[] args) { try { ServerSocket server=new ServerSocket(8189); System.out.println("Starting PTB2..."+server.getLocalPort()); while(true) { Socket soc=server.accept(); CServerThreadPtb2TextStream srv=new CServerThreadPtb2TextStream(soc); Thread t=new Thread(srv); Thread.sleep(100); t.start(); } }catch(IOException ex) { ex.printStackTrace(); } catch(InterruptedException ex) { ex.printStackTrace(); } catch(Exception ex) { ex.printStackTrace(); } } }

Tới đây Sinh viên chạy class Test Server (CServerPtb2TextStream) trước, sau đó chạy class

Test Client (CClientPtb2TextStream)

Lập trình hướng đối tượng với Java 2

Trang 51

- Trường hợp sử dụng Data Stream, sửa lại 2 chỗ gửi/ nhận bên Client và Server như sau:

Bên client : private void doSend() { try { Socket soc=new Socket("localhost",8189); OutputStream out=soc.getOutputStream(); DataOutputStream dataout=new DataOutputStream(out); dataout.writeDouble(Double.parseDouble(txta.getText())); dataout.writeDouble(Double.parseDouble(txtb.getText())); dataout.writeDouble(Double.parseDouble(txtc.getText())); InputStream in=soc.getInputStream(); DataInputStream datain=new DataInputStream(in); txtkq.setText(datain.readUTF()); soc.close(); } catch(IOException ex) { JOptionPane.showMessageDialog(this, ex.getMessage()); } catch(Exception ex) { JOptionPane.showMessageDialog(this, ex.getMessage()); } }

Bên Server:

public void run() { try { InputStream in=m_soc.getInputStream(); DataInputStream datain=new DataInputStream(in); String strKq=processInformation

(datain.readDouble(), datain.readDouble(), datain.readDouble());

OutputStream out=m_soc.getOutputStream(); DataOutputStream dataout=new DataOutputStream(out); dataout.writeUTF(strKq); m_soc.close(); } catch(IOException ex) { ex.printStackTrace(); } catch(Exception ex) { ex.printStackTrace(); } }

Với processInformation là hàm xử lý giải phương trình bậc 2, trả về kết quả sau khi nhận thông

số từ client gửi lên (Sinh viên tự viết thuật toán giải pt bậc 2 trong hàm này).

Lập trình hướng đối tượng với Java 2

Trang 52

- Trường hợp sử dụng Object Stream, Ta nên viết 1 class tên là CPTB2, class này

implements Serializable. Sau đó sửa lại 2 chỗ gửi/ nhận bên Client và Server như sau:

Bên client : private void doSend() { try { Socket soc=new Socket("localhost",8189); OutputStream out=soc.getOutputStream(); ObjectOutputStream objout=new ObjectOutputStream(out); CPTB2 pt2=new CPTB2( Double.parseDouble(txta.getText()), Double.parseDouble(txtb.getText()), Double.parseDouble(txtc.getText())); objout.writeObject(pt2); InputStream in=soc.getInputStream(); ObjectInputStream objin=new ObjectInputStream(in); CPTB2 pt2FromServer=(CPTB2) objin.readObject(); txtkq.setText(pt2FromServer.getKetQua()); soc.close(); } catch(IOException ex) { ex.printStackTrace(); } catch(Exception ex) { ex.printStackTrace(); } }

Bên Server: public void run() { try { InputStream in=m_soc.getInputStream(); ObjectInputStream objin=new ObjectInputStream(in); CPTB2 pt2=(CPTB2) objin.readObject(); pt2.comPute(); OutputStream out=m_soc.getOutputStream(); ObjectOutputStream objout=new ObjectOutputStream(out); objout.writeObject(pt2); m_soc.close(); } catch(IOException ex) { ex.printStackTrace(); } catch(Exception ex) { ex.printStackTrace(); } }

Class CPTB2

Lập trình hướng đối tượng với Java 2

Trang 53

package duythanhwordpress.com.chapter3.ptb2objectstream; import java.io.Serializable; public class CPTB2 implements Serializable{ private static final long serialVersionUID = 1L; private double m_dVarA; private double m_dVarB; private double m_dVarC; private String m_strKetQua; public CPTB2(double dVarA,double dVarB,double dVarC ) { this.m_dVarA=dVarA; this.m_dVarB=dVarB; this.m_dVarC=dVarC; } public void comPute () { m_strKetQua=""; if(m_dVarA==0) { if(m_dVarB==0) { if(m_dVarC==0) { m_strKetQua="Phương trình VSN"; } else { m_strKetQua="Phương trình VN"; } } else { m_strKetQua="Pt co 1 no x="+ String.format("%.2f", -m_dVarC/m_dVarB); } } else { double delta=Math.pow(m_dVarB, 2)-4*m_dVarA*m_dVarC; if(delta==0) { m_strKetQua="Phương trình co NK x1=x2="+String.format("%.2f", -m_dVarB/(2*m_dVarA)); } else if(delta<0) { m_strKetQua="Phương trình VN"; } else{ String x1=String.format("%.2f", (-m_dVarB-Math.sqrt(delta))/(2*m_dVarA)); String x2=String.format("%.2f", (-m_dVarB+Math.sqrt(delta))/(2*m_dVarA)); m_strKetQua="Pt co x1="+x1 +", x2="+x2; } } } public String getKetQua() { return this.m_strKetQua; } }

Lập trình hướng đối tượng với Java 2

Trang 54

Bài tập 3:

Viết 1 server cho phép nhiều client kết nối cùng lúc với các yêu cầu sau:

Client có thể gửi yêu cầu là đường dẫn đến 1 ổ điã hoặc 1 thư mục nào đó bất kỳ trên server.

Nếu đường dẫn đó tồn tại thị sẽ gửi về danh sách các thư mục con và các tập tin trong ổ đĩa /

đường dẫn đó.

Thiết kế client với cơ chế GUI nhận kết quả từ server và biểu diễn kết quả nhận được lên 1

JTree.

Hướng dẫn:

Đoạn code sau liệt kê tất cả thư mục, tập tin trong 1 đường dẫn path cho trước rồi đưa vào 1 đối

tượng ArrayList

File f=new File(path);

ArrayList<File>lstFiles=null;

if(f.exists()&& f.isDirectory()) {

lstFiles=new ArrayList<File>();

File []files=f.listFiles();

for(File x:files)

lstFiles.add(x);

} }

Đoạn code sau tạo luồng có thể chuyển 1 đối tượng tới client

OutputStream os = income.getOutputStream();

ObjectOutputStream oos=new ObjectOutputStream(os);

oos.writeObject(lstFiles);

oos.flush();

Đoạn code sau đây nhận đối tượng từ server

ObjectInputStream ois=new

ObjectInputStream(soc.getInputStream());

ArrayList<File>list=(ArrayList<File>)ois.readObject();

Giao diện phía client như sau:

Lập trình hướng đối tượng với Java 2

Trang 55

Bài tập 4: Cải tiến bài tập 3 thành 1 chương trình quản lý thư mục từ xa và cho phép các thao tác cơ bản

như download, delete files / folders.

Bài tập 5:

Viết 1 chương trình từ điển cho phép tra từ qua mạng. VIệc tra từ này phải đảm bảo nhiều người

có thể tra cùng lúc. Việc thiết kế chương trình gồm 2 phần: Phần server và phần client.

Phần server: chỉ sẽ được chạy trên server có giao diện như sau:

Khi người dùng start server từ điển, server này sẽ lắng nghe trên cổng 2520 và sẽ nhận đầu vào

là từ cần tra sau đó thực hiện việc tra từ và trả kết quả về cho client hoặc là 1 đối tượng từ đã tra

trong trường hợp tra thành công, hoặc là null nếu từ không tồn tại.

Phần Client: sẽ được triển khai ở phía client, có giao diện như sau

Lập trình hướng đối tượng với Java 2

Trang 56

Bài tập 6:

Viết chương trình tạo ra một bàn phím trên 2 máy tính A và B. viết chương trình điều khiển các

sự kiện nhấn phím trên máy tính B thông qua máy tính A và hiện kết quả lân màn hình của máy

B( thí dụ: khi nhấn một phím trên máy A cũng tương ứng với việc nhấn phím đó trên máy tính

B)

Bài tập 7:

Viết chương trình giả lập 1 chat room. Người dùng nhập địa chỉ server, tên nick chat vào và có

thể chat cùng nhau trên chat room này.

Lập trình hướng đối tượng với Java 2

Trang 57

Lập trình hướng đối tượng với Java 2

Trang 58

UDP PROGRAMMING

Bài tập 1: Viết 1 chương trình làm server sử dụng UDP cho phép lắng nghe trên cổng 2520. Khi client gửi

yêu cầu đến thì server này sẽ gửi 1 file hình ảnh về client. Ở phía client, sau khi nhận được

image từ server thì lưu image này xuống file đồng thời hiển thị lên 1 JFrame.

Bài tập 2: Viết chương trình làm server sử dụng UDP cho phép lắng nghe trên cổng 7777. Khi client gửi

yêu cầu đến thì server này sẽ gửi 1 file audio/video về client. Ở phía client, sau khi nhận được

file audio/video từ server sẽ lưu file này xuống đĩa và cho thực thi file vừa nhận được.

Coding mẫu:

Server:

packet=new DatagramPacket(buf, buf.length, packet.getAddress(), packet.getPort());

buf: dữ liệu gửi đi theo kiểu byte

buf.length : kích thước gửi đi

packet.getAddress() : lấy địa chỉ của máy đích

packet.getPort() : lấy port của máy đích

Các thông số trong packet được lấy từ soc.receive(packet), data ở nơi nào gửi đến thì packet sẽ

chứa toàn bộ thông tin từ nơi gửi đến bao gồm tên máy, port…

Lập trình hướng đối tượng với Java 2

Trang 59

Client:

Bài tập 3: Cải tiến bài tập 2, chương trình cho phép kết nối cùng lúc nhiều client tới server để

lấy tập tin về. Giao diện server như sau:

- Khi bấm vào Start, chương trình sẽ khởi động server tại port được nhập trên giao diện.

- Khi bấm Stop, sẽ thoát chương trình

Thiết kế giao diện client như bên dưới, cho phép người sử dụng chọn tập tin trên server để

download (hình ảnh), sau đó hiển thị lên giao diện:

Lập trình hướng đối tượng với Java 2

Trang 60

- Chú ý là chương trình cho phép chạy đồng thời nhiều client truy suất lên server (kết hợp

Multithreading + Networking).

- Bên phải màn hình có JList, khi người sử dụng bấm vào nút Get Files thì chương trình có

nhiệm vụ lên server lấy toàn đường dẫn các tập tin nằm trong Server Path.

- Khi bấm vào nút Download, chương trình sẽ dùng UDP tải tập tin đang chọn trong JList,

lưu về máy client với tên mới được nhập trong ô New File Name. Sau khi tải xong tập tin

thì tự động mở tập tin này lên giao diện (nhìn bên trái màn hình).

- Khi có lỗi sảy ra thì chương trình phải hiển thị thông báo lỗi, tương tự như thông báo lỗi

dưới đây :

Gợi ý: Dùng lớp JoptionPane để hiển thị thông báo lỗi.

Lập trình hướng đối tượng với Java 2

Trang 61

RMI PROGRAMMING Các bước tạo ứng dụng RMI (4 bước):

Bước 1: Tạo một interface kế thừa từ class Remote

Bước 2: Tạo một class thực thi interface ở bước 1 đồng thời kế thừa UnicastRemoteObject

Bước 3: Tạo server để đăng ký đối tượng RMI

Bước 4: Tạo client để truy suất RMI object

Lập trình hướng đối tượng với Java 2

Trang 62

Bài tập 1:

Viết chương trình dùng kỹ thuật RMI cho việc chuyển đổi tiền tệ. Chương trình cho phép nhập

vào số tiền, chọn loại tiền (USD/VND) rồi tính toán. Giao diện client như sau:

Bài tập 2:

Viết chương trình dùng kỹ thuật RMI cho việc tính toán các số với các phép tính cơ bản. Client

sử dụng cơ chế đồ họa như sau:

Bài tập 3:

Viết chương trình bói online, kết hợp chuyển lịch âm thành lịch dương. Giao diện Server như

sau:

- Nhiệm vụ của Server là nhận 3 thông số: ngày, tháng, năm từ client và tiến hành giải mã

- Khi bấm Start Server, chương trình sẽ đăng ký RMI object đúng như thông số trên giao

diện mà người sử dụng nhập, chuỗi URL tự động được nối khi bấm Start thành công.

- Khi bấm Shutdown, chương trình sẽ tắt.

Lập trình hướng đối tượng với Java 2

Trang 63

Giao diện client:

- Khi bấm vào Connect, chương trình sẽ kết nối để truy suất tới RMI object

- Khi bấm vào nút Bắt đầu bói, chương trình sẽ gửi thông số ngày âm lên server và nhận

kết quả trả về là ngày dương và thông tin bói chi tiết cho ngày tháng năm âm này.

- Bấm vào nút thoát để thoát khỏi chương trình.

Bài tập 4: Dùng kỹ thuật RMI để viết chương trình giải phương trình bậc 2, giao diện như sau:

Lập trình hướng đối tượng với Java 2

Trang 64

MODULE 5 Mục đích: Thực hành về JDBC, Module này giúp sinh viên kết nối tới Ms Access, SQL Server, MySQL.

Thực hiện được các chức năng : lấy dữ liệu, thêm, sửa , xóa... Có thể ứng dụng để viết các

chương trình quản lý.

Ví dụ về kết nối với nhiều hệ cơ sở dữ liệu, sinh viên xem trên blog này : http://tranduythanh.blog.com/2012/03/28/k%E1%BA%BFt-n%E1%BB%91i-cac-h%E1%BB%87-

c%C6%A1-s%E1%BB%9F-d%E1%BB%AF-li%E1%BB%87u-b%E1%BA%B1ng-java-2/

Cách kết nối và lấy dữ liệu từ Ms Access:

Cách kết nối và lấy dữ liệu từ Sql Server:

Lập trình hướng đối tượng với Java 2

Trang 65

Bài tập 1:

Làm các demontraction về kết nối CSDL và thực thi các phưong thức của đối tựong

Statement,PrepareStatement:

-executeQuery

- executeUpdate

- executeBatch

Bài tập 2: Thao tác trên ResultSet

Cho cơ sở dữ liệu tên là QLSV với cuấ trúc bảng đựoc cho như sau:

Hãy nhập liệu mỗi bảng 10 mẫu tin để kiểm tra.

Tạo 1 project bằng ngôn ngữ lập trình java thực hiện các công việc sau:

1. Kết nối với CSDL và hiển thị thông tin lên JFrame như hình sau:

Giao diện:

Lập trình hướng đối tượng với Java 2

Trang 66

Khi nhấn nút Thêm

Nhấn Hủy hoặc lưu, sau khi thực hiện xong tácc vụ sẽ khôi phục giao diện trở lại như ban đầu.

Khi nhấn nút Sửa

Khi nhấn nút “Xem danh sách sinh viên lớp hiện tại, 1 cửa sổ như sau xuất hiện hiển thị các sinh

viên thuộc lớp hiện tại đang được chọn

Lập trình hướng đối tượng với Java 2

Trang 67

Bài tập 3: Master – Details Form

Với cơ sở dữ liệu của bài 2, sinh viên thiết kế 1 Form theo như hình sau:

Bên trái là JTree, bên phải là JTable.

Lập trình hướng đối tượng với Java 2

Trang 68

Bài tập 4: Bài tập về cấp quyền sử dụng chương trình

Tạo cơ sở dữ liệu theo mô hình trên trên hệ quản trị CSDL Access hoặc SQL server 2008.

Tạo form logon như hình sau:

Khi user nhấn nút logon, chương trình sẽ kiểm tra user và password rồi hiển thị thông báo chính

xác cần thiết nếu user không đăng nhập được.

Nếu user đăng nhập thành công, chương trình sẽ lưu trữ 1 mẫu tin xuống bảng tblSession đồng

thời lấy về tất cả các quyền mà user đang có trên bảng tblPrivileges.

Khi hiển thị chương trình chính. Tùy theo quyền mà user đang có, các menu của chương trình

chính sẽ được enable hoặc disable.

Hãy tạo các form để quản lý users. Các chức năng thêm,xóa, sửa, cập nhật, tìm kiếm,…chức

năng cấp quyền cho users.

Lập trình hướng đối tượng với Java 2

Trang 69

Form đổi password

Tạo form để theo dõi các lần đăng nhập của các user (tracking).

Bài tập 5: CallableStatement

Viết chương trình demo cho phép thực thi các loại stored Procedure có tính chất sau:

a. Không có tham số

b. Có tham số IN

c. Có tham số OUT

d. Có tham số INOUT

e. Trả về 1 giá trị

Bài tập 6: Metadata

Viết chương trình cho phép kết nối vào 1 database của MS SQL server sau đó lấy danh sách các

bảng hiển thị lên 1 JTree. Khi người dùng chọn 1 phần tử trên Jtree: nếu là Table thì hiển thị cấu

trúc của nó đồng thời hiển thị dữ liệu. Nếu người dụng chọn 1 StoredProcedure thì hiển thị nội

dung của câu sql tạo storedproc này.

Viết 1 Form cho phép người dùng gõ vào 1 câu SQL và cho thực thi câu SQL này.

Lập trình hướng đối tượng với Java 2

Trang 70

Bài tập 7: Viết chương trình quản lý sản phẩm, giao diện như bên dưới:

- Sinh viên tự thiết kế cơ sở dữ liệu hợp lý để thực hiện các yêu cầu sau:

o CSDL gồm có 2 bảng: Bảng Danh mục và bảng Sản phẩm

o Khi chương trình bắt đầu khởi động thì load toàn bộ danh mục sản phẩm vào JList

bên trái màn hình và load vào JCombobox bên phải màn hình.

o Khi bấm vào từng danh mục sản phẩm thì hiển thị danh sách các sản phẩm của

danh mục đó vào JTable bên phải màn hình.

o Khi chọn từng Sản phẩm trong JTable, chương trình sẽ hiển thị thông tin chi tiết

của sản phầm đó vào mục chi tiết ở góc phải bên dưới màn hình

o Khi bấm vào nút New bên Danh mục sản phẩm, chương trình sẽ hiển thị cửa sổ

cho phép nhập mới một danh mục sản phẩm vào cơ sở dữ liệu khi người sử dụng

click nút OK:

Lập trình hướng đối tượng với Java 2

Trang 71

o Khi bấm vào nút Update bên Danh mục sản phẩm, chương trình sẽ hiển thị thông

tin chi tiết của danh mục đang chọn để cho phép người sử dụng sửa lại tên danh

mục:

o o Khi bấm nút Remove bên Danh mục sản phẩm, chương trình sẽ xóa danh mục sản

phẩm đang chọn. Chú ý rằng nếu Danh mục này đã có sản phẩm bên trong thì phải

thông báo cho người sử dụng biết và hỏi xem có muốn xóa tất cả luôn hay không.

o Khi bấm nút New bên phần sản phẩm: xóa trắng các JTextField, cho phép người

sử dụng nhập mới 1 sản phẩm theo từng danh mục

o Khi bấm nút Save: chương trình sẽ lưu thông tin của sản phẩm, Nếu như mã tồn

tại thì tự động update, còn mã chưa tồn tại thì thực hiện lưu mới sản phẩm.

o Khi bấm nút Remove bên phần sản phẩm: chương trình sẽ xóa sản phẩm đang

chọn trong JTable.

o Menu File: Sẽ có 2 mục menu con; Menu 1 tên là Print cho phép in ấn toàn bộ

danh mục sản phẩm và các sản phẩm bên trong danh mục. Menu 2 tên là Exit, cho

phép thoát khỏi chương trình.

- Để in ấn chúng ta implements Printable, sinh viên có nhiệm vụ tìm hiểu chức năng in ấn

trên internet.

- Để hiển thị thông báo hỏi người sử dụng có chắc chắn muốn thoát hay không, ta dùng

đoạn code dưới đây:

if(JOptionPane.showConfirmDialog (this, "Bạn có chắc chắn muốn thoát không?","Thôngbáo", JOptionPane.YES_NO_OPTION)==JOptionPane.YES_OPTION) System.exit(0);

Lập trình hướng đối tượng với Java 2

Trang 72

Bài tập 8 : Viết chương trình quản lý thư viện

Cho Cơ Sở Dữ Liệu tên dbLibraries với cấu trúc bảng được mô tả dưới đây:

Bảng tblPublisher Dùng để lưu danh sách các nhà xuất bản, khóa chính là PublisherCode, Một nhà

xuất bản sẽ có một hoặc nhiều đầu sách

Bảng tblBook dùng để lưu danh sách các đầu sách, khóa chính là BookCode, khóa ngoại là

PublisherCode, Khóa ngoại này sẽ tham chiếu tới cột PublisherCode ở trong bảng tblPublisher

Dưới đây là bảng mối quan hệ của tblPublisher và tblBook

Dữ liệu mẫu:

Dữ liệu mẫu của bảng tblPublisher( bảng nhà xuất bản) tblPublisher

PublisherCode PublisherName Address Phone

P020202021 Addison Wesley 75 Arlington St., Suite 300, Boston,

MA

113-114-

0115

P020202022 John Wiley and

Sons

605 Third Ave., New York, NY 113-112-

0117

P020202023 McGraw Hill 121 Ave. of The Americas, New York,

NY

113-110-

0118

P020202024 Wrox 10475 Crosspoint Blvd., Indianapolis,

IN

114-114-

0119

P020202025 Prentice Hall PTR 49 Sandiego, USA 110-115-

0113

Dữ liệu mẫu của bảng tblBook( bảng lưu các đầu sách)

tblBook

BookCode BookName PublisherCode

B032120449 Introduction to The Design and Analysis of

Algorithms

P020202021

B032120450 Operating System Concepts P020202022

tblPublisher

Columns Name Data Type Data Size Description

PublisherCode VARCHAR 100 Mã nhà xuất bản ( khóa chính)

PublisherName NVARCHAR Tên nhà xuất bản

Address NVARCHAR Địa chỉ

Phone NVARCHAR Điện thọai

tblBook

Columns Name Data Type Data Size Description BookCode VARCHAR 100 Mã sách ( khóa chính)

BookName NVARCHAR Tên sách

PublisherCode VARCHAR 100 Mã nhà xuất bản(khóa ngọai)

Lập trình hướng đối tượng với Java 2

Trang 73

B032120451 Advanced Concepts in Operating Systems 6th P020202023

B032120452 Beginning XML 2nd P020202024

B032120453 Core Java 2 Volume II P020202025

B032120454 A Biography Compiled P020202021

B032120455 Academic Culture P020202021

B032120456 Achieving Broad Development

P020202021

B032120457 Achieving a Productive Aging Society

P020202021

B032120458 Portrait of a Marching Black P020202021

B032120459 Automatically Adaptable Software P020202022

B032120460 Problems in Psychology P020202022

B032120461 Human Relations in a Factory P020202022

B032120462 Admiral Halsey's Story P020202023

B032120463 Theoretical and Research Perspectives P020202024

B032120464 The Adolescent in Turmoil P020202021

B032120465 Adolphus, a Tale P020202024

B032120466 Adventures P020202021

B032120467 Aerogeology P020202021

Giao diện chính của chương trình như sau:

Lập trình hướng đối tượng với Java 2

Trang 74

Yêu cầu:

1. Thiết kế giao diện sử dụng như trên, chạy script SQL để tạo cơ sở dữ liệu.

2. Hiển thị danh sách các nhà xuất bản lên JTable, viết các sự kiện cho 2 JButton Về trước,

về sau và JTable. Chú ý rằng mỗi lần click vào từng dòng trên JTable thì sẽ hiển thị

thông tin của nhà xuất bản lên phần thông tin chi tiết; Click “Về trước” thì hiển thị nhà

xuất bản ở phía trước; Click “Về sau” thì hiển thị nhà xuất bản ở phía sau.

3. Thực hiện các chức năng Thêm, Lưu, Sửa, Xóa

4. Thực hiện chức năng tìm kiếm khi bấm vào nút “Tìm Kiếm”

Khi thực hiện chức năng này thì giao diện Tìm Kiếm sẽ được hiển thị như bên dưới(chú ý

rằng chức năng này cho phép tìm kiếm tương đối)

Ví dụ: (Khi bấm nút Tìm kiếm trong công cụ tìm kiếm)

Người sử dụng nhập p02, hoặc 23 thì sẽ xuất ra toàn bộ đầu sách theo mã nhà xuất bản có chứa

bất kỳ chuỗi p02, hoặc 23

Gợi ý: Dùng từ khóa like và % trong câu truy vấn tìm kiếm tương đối

Lập trình hướng đối tượng với Java 2

Trang 75

MODULE 6 Mục đích: Thực hành về JSP. Module này giúp sinh viên làm quen với Javaservlet và JSP

Thiết kết Html sinh viên có thể sử dụng công cụ Microsoft Expression Web hoặc Dreamweaver

Để tạo Project JSP trong eclipse, chúng ta cần các công cụ sau:

- Chương trình eclipse Java EE

- Apache tomcat ver 7.0 (hoặc tùy …)

- JDK version 6, 7 (hoặc tùy…)

Lab 1: Các bước tạo 1 project Web như sau (sinh viên làm theo lab này trước khi làm các bài tập

bên dưới):

1) Giả sử ta cài tomcat vào “C:\Program Files\Apache Software Foundation\Tomcat 7.0”

2) Khởi động Eclipse Java EE để tạo Project

Bấm chuột phải vào

Project Explorer /

new/ chọn Dynamic

Web Project

Lập trình hướng đối tượng với Java 2

Trang 76

- Sau khi chọn Dynamic Web Project

- Cứ Chọn Next cho tới màn hình cuối cùng và chọn các thông số như hình sau đó

bấm Finish:

Lập trình hướng đối tượng với Java 2

Trang 77

Cấu trúc thư mục của project Web:

Để kết nối tới SQL Server, chúng ta làm bước sau (trước tiên phải có thư viện kết nối):

- Có nhiều cách tham chiếu tới các thư viện, ở đây chúng ta làm theo cách tham chiếu kiểu

gom nhóm các thư viện vào chung 1 chỗ cho tiện lợi, thực tế chúng ta hay làm theo cách

này:

Bấm chuột phải vào Project/ chọn Build Path / chọn Configure Build Path…

Tại cửa sổ này, chúng ta chọn Add Library:

Lập trình hướng đối tượng với Java 2

Trang 78

Chọn User Library và click Next:

Chọn User Libraries:

Chọn New để tạo nhóm thư viện:

Lập trình hướng đối tượng với Java 2

Trang 79

Nhập tên thư viện và nhấn OK.

Tại cửa sổ này, chọn Libcuatui rồi click Add JARs…

Trong trường hợp này chúng ta sẽ trỏ tới thư viện kết nối Sqlserver, ở đây là gói

sqljdbc4.jar. Chúng ta có thể tìm thấy nó ở bất cứ nơi đâu trên internet.

Lập trình hướng đối tượng với Java 2

Trang 80

Bây giờ quan sát Project, chúng ta sẽ thấy thư viện vừa thêm vào:

Để chạy được, chúng ta đồng thời phải sao chép sqljdbc4.jar vào “C:\Program Files\Apache

Software Foundation\Tomcat 7.0\lib”

Ở đây chúng ta sẽ tạo một số class để tương tác tới cơ sở dữ liệu sql server

Class Account là mô hình hóa cơ sở dữ liệu thành hướng đối tượng: ở đây chỉ có mã, tên.

Class MyData có nhiệm vụ truy suất sqlserver và trả về ArrayList Account

Lập trình hướng đối tượng với Java 2

Trang 81

Class Account:

Class MyData:

Tiếp tục, chúng ta tạo 1 trang web, tên là index.jsp để hiển thị danh sách Account:

Lập trình hướng đối tượng với Java 2

Trang 82

Trang index.jsp:

Sau khi chạy, dữ liệu sẽ được hiển thị lên trang index.jsp như bên dưới.

Lập trình hướng đối tượng với Java 2

Trang 83

Lab 2: Thao tác với JavaServlet

Tạo một Servlet tên là ProcessData để xử lý dữ liệu.

Chỉnh sửa thêm tập tin web.xml như bên dưới:

Trang web nào muốn tương tác tới servlet thì làm như sau:

Lập trình hướng đối tượng với Java 2

Trang 84

Thuộc tính action của form chính là tên của servlet, method có 2 loại: Nếu ta chọn “post” thì

hàm doPost của servlet sẽ thực thi, nếu ta chọn “get” thì hàm doGet của servlet sẽ thực thi.

Để lấy các giá trị của các control trên web, chúng ta dùng request.getParameter(“tên”)

- Để triển khai ứng dụng web. Bấm chuột phải vào Project/ Export / WAR file

Tại màn hình này chúng ta Export vào thư mục webapps của apache tom cat.

Quan sát project QLThuvien sẽ được sinh ra từ QLThuvien.war trong webapps:

Muốn chạy : http://localhost:8888/qlthuvien . Với 8888 là port do ta chọn lúc cài đặt.

Lập trình hướng đối tượng với Java 2

Trang 85

Bài tập 1: Quản lý thí sinh, Sinh viên phải làm trên Access và Sqlserver 2008

Cho CSDL có tên QLTS.mdb (sinh viên tự chuyển qua SQL server). Thiết kế bảng Thisinh co

cấu trúc như hình

Nhập liệu vài mẫu tin thử

Tạo 1 ứng dụng Dynamic Web Project có tên QLTS. Thiết kế trang index.jsp sao cho khi chạy

hiển thị danh sách thí sinh như hình sau:

Khi nhấn vào link Insert New sẽ cho phép người dùng nhập thông tin của 1 thí sinh và thêm vào

CSDL như hình:

Lập trình hướng đối tượng với Java 2

Trang 86

Khi nhấn link Edit sẽ cho phép người dùng hiệu chỉnh thông tin của thí sinh được chọn sau đó

cập nhật xuống csdl

Khi nhấn Link Delete sẽ xóa thí sinh được chọn.

Gợi ý: kiến trúc dự án trong eclipse

Lập trình hướng đối tượng với Java 2

Trang 87

Bài tập 2: Quản lý sinh viên. Sinh viên làm theo mẫu Lab này để làm quen với Servlet. Lab này

làm ví dụ cho bài tập 1

- Chương cho phép hiển thị danh sách sinh viên

- Thêm mới sinh viên

- Chỉnh sửa thông tin sinh viên

- Xóa sinh viên

Dưới đây là một phần của thiết kế cơ sở dữ liệu quản lý sinh viên.

Cấu trúc Website trong Eclipse được tạo như sau:

Lập trình hướng đối tượng với Java 2

Trang 88

Giải thích:

1) Webcontent chứa các tập tin web jsp:

Trang index.jsp sẽ hiển thị danh sách sinh viên theo mẫu bên dưới:

Trang update.jsp/ newpage.jsp: Dùng để chỉnh sửa/ thêm mới sinh viên:

Trang deletepage.jsp : dùng để thực thi việc xóa 1 sinh viên theo mã.

Lập trình hướng đối tượng với Java 2

Trang 89

2) Trong Java Resource có 4 package thực hiện các chức năng sau:

vn.edu.hui.connector : Dùng để tương tác trực tiếp tới cơ sở dữ liệu (Tạo connection,

tạo Resultset, tạo Statement, update thông tin…)

vn.edu.hui.model : lưu trữ các class là mô hình hóa cơ sở dữ liệu thành hướng đối tượng

vn.edu.hui.dal : Dùng để tương tác với connector, kết hợp chặt chẽ với model.

vn.edu.hui.servlet : Servlet để xử lý các thông tin từ các trang Jsp gửi về.

Dưới đây là coding của các package ConnectorFactory:

package vn.edu.hui.connector; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class ConnectorFactory { public Connection getConnect() { Connection conn=null; try { Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); conn =DriverManager.getConnection ("jdbc:sqlserver://localhost;databaseName=dbqlsv;user=sa;password=hoilamgi"); } catch (Exception e) { e.printStackTrace(); } return conn; } public Statement createStatement() { Statement st=null; try { st = getConnect().createStatement(); } catch (SQLException e) { e.printStackTrace();} return st; } public ResultSet execQuery(String sql) { ResultSet rs=null; try { rs=createStatement().executeQuery(sql); } catch (SQLException e) { e.printStackTrace(); } return rs; } public int excecNonQuery(String sql) { Statement st=createStatement(); int ret=0; try { ret = st.executeUpdate(sql); } catch (SQLException e) { e.printStackTrace();} return ret; } }

Lập trình hướng đối tượng với Java 2

Trang 90

- Package Model

Package dal:

package vn.edu.hui.dal; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import vn.edu.hui.connector.ConnectorFactory; import vn.edu.hui.model.Sinhvien; public class ProcessSinhvien { ConnectorFactory factor=null; public ProcessSinhvien() { factor=new ConnectorFactory(); } public ArrayList<Sinhvien> getList() { ResultSet rs=factor.execQuery("select * from sinhvien"); ArrayList<Sinhvien>list=new ArrayList<Sinhvien>(); try { while(rs.next()) { Sinhvien sv=new Sinhvien(rs.getString("masinhvien"), rs.getString("tensinhvien"), rs.getString("malop")); list.add(sv); } } catch (SQLException e) { e.printStackTrace(); }

Lập trình hướng đối tượng với Java 2

Trang 91

return list; } public Sinhvien getInfor(String masv) { Sinhvien sv=null; try { ResultSet rs=factor.execQuery("select * from sinhvien where masinhvien='"+masv+"'"); rs.next(); sv=new Sinhvien(rs.getString("masinhvien"), rs.getString("tensinhvien"), rs.getString("malop")); } catch(Exception ex) { ex.printStackTrace(); } return sv; } public int update(Sinhvien sv) { int ret=0; String sql="update sinhvien set tensinhvien='"+sv.getTensinhvien()+"',malop='"+sv.getMalop()+"' where masinhvien='"+sv.getMasinhvien()+"'"; ret=factor.excecNonQuery(sql); return ret; } public int insert(Sinhvien sv) { int ret=0; String sql="insert into sinhvien values('"+sv.getMasinhvien()+"','"+sv.getTensinhvien()+"','"+sv.getMalop()+"')"; ret=factor.excecNonQuery(sql); return ret; } public int delete(Sinhvien sv) { int ret=0; String sql="delete from sinhvien where masinhvien='"+sv.getMasinhvien()+"'"; ret=factor.excecNonQuery(sql); return ret; } public int delete(String masv) { int ret=0; String sql="delete from sinhvien where masinhvien='"+masv+"'"; ret=factor.excecNonQuery(sql); return ret; } }

Package xử lý update (java servlet):

Lập trình hướng đối tượng với Java 2

Trang 92

Package xử lý thêm mới (java servlet):

Lập trình hướng đối tượng với Java 2

Trang 93

Web.xml

Cách hiển thị nội dung lên trong index.jsp:

Lập trình hướng đối tượng với Java 2

Trang 94

Trang chỉnh sửa (update.jsp – tương tự cho trang newpage.jsp)

Trang deletepage.jsp: