Tổ hợp công nghệ giáo dục Topica
Khối:
Đại Học và Cao Đẳ ng Năm 201 6
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. Thạc sỹ Trần Duy Thanh .
Trang 1
Tổ hợp công nghệ giáo dục Topica
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...................... ...................................................... 46 Module 5: Thực hành về JDBC. .................................................................................... 64
Module 6: Thực hành về JSP. ........................................................................................ 75
Trang 2
Tổ hợp công nghệ giáo dục Topica
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:
Trang 3
Tổ hợp công nghệ giáo dục Topica
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 . Trang 4
Tổ hợp công nghệ giáo dục Topica 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:
Trang 5
Tổ hợp công nghệ giáo dục Topica
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ưkhi không : North, West, South, East. Thì vùng Center tasẽ thường tràn đầyđưa cửavào sổ, thông thường đưacócác4 vùng control JTable, JTree, ListView, JScrollpane… 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.
Trang 6
Tổ hợp công nghệ giáo dục Topica
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 JTextField JTextField JTextField JTextField JButton JButton JButton
Tên Biến Control txtSoa txtSob txtSoc txtKetqua btnGiai btnXoaTrang btnThoat
Mô tả Dùng để nhập giá trị cho a Dùng để nhập giá trị cho b Dùng để nhập giá trị cho c Dùng để hiển thị kết quả Viết lệnh để giải phương trình Xóa toàn bộ dữ liệu trong ô dl Viết lệnh thoát chương trình
JLabel
lblTieuDe
Giải Phương Trình Bậc 2
Trang 7
Tổ hợp công nghệ giáo dục Topica
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 JLabel lblTitle= newJPanel(); 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);
Trang 8
Tổ hợp công nghệ giáo dục Topica 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); WEST pnBorder.add(pnWest,BorderLayout. 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);
Trang 9
Tổ hợp công nghệ giáo dục Topica 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)); new pnpheptoan.setBorder( 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) {
Trang 10
Tổ hợp công nghệ giáo dục Topica 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
Trang 11
Tổ hợp công nghệ giáo dục Topica { 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.
Trang 12
Tổ hợp công nghệ giáo dục Topica
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, …
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
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);
Trang 13
Tổ hợp công nghệ giáo dục Topica 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
Trang 14
Tổ hợp công nghệ giáo dục Topica
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();
Trang 15
Tổ hợp công nghệ giáo dục Topica 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() { publictimer.stop(); void actionPerformed(ActionEvent arg0) {
} }); Container con=getContentPane(); con.add(pnBorder); } private void addImage(JPanel pnCenter,JPanel []pnArr)
{ for(int i=0;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(); }
Trang 16
Tổ hợp công nghệ giáo dục Topica }
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());
Trang 17
Tổ hợp công nghệ giáo dục Topica JPanel pnNorth=new JPanel(); 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);
Trang 18
Tổ hợp công nghệ giáo dục Topica } 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>=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
Trang 19
Tổ hợp công nghệ giáo dục Topica
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 import import import
java.awt.BorderLayout; java.awt.Container; java.awt.event.ActionEvent; java.awt.event.ActionListener;
Trang 20
Tổ hợp công nghệ giáo dục Topica import import import import import import import import import import
javax.swing.BoxLayout; javax.swing.JButton; javax.swing.JFrame; javax.swing.JLabel; javax.swing.JOptionPane; javax.swing.JPanel; javax.swing.JScrollPane; javax.swing.JTable; javax.swing.JTextField; 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 Money"); Name"); tblModelAcc.addColumn("Acc tblAcc=new JTable(tblModelAcc); JScrollPane sc=new JScrollPane(tblAcc,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS ,JScrollPane.HORIZONTAL_SCR OLLBAR_AS_NEEDED ); con.add(sc,BorderLayout. CENTER );
Trang 21
Tổ hợp công nghệ giáo dục Topica 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(); } }
Trang 22
Tổ hợp công nghệ giáo dục Topica
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
Trang 23
Tổ hợp công nghệ giáo dục Topica
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.
Trang 24
Tổ hợp công nghệ giáo dục Topica
Trang 25
Tổ hợp công nghệ giáo dục Topica
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. Bank Class /**
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
Trang 26
Tổ hợp công nghệ giáo dục Topica @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
Trang 27
Tổ hợp công nghệ giáo dục Topica @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 private private private
Bank bank; int fromAccount; double maxAmount; 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;
}
Trang 28
Tổ hợp công nghệ giáo dục Topica
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ộ
Trang 29
Tổ hợp công nghệ giáo dục Topica
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()
{
Trang 30
Tổ hợp công nghệ giáo dục Topica 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 ;
}
TransferRunnable
Class /** 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)
{
Trang 31
Tổ hợp công nghệ giáo dục Topica 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 private private private
Bank bank; int fromAccount; double maxAmount; 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.
Trang 32
Tổ hợp công nghệ giáo dục Topica
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 (InterruptedExcep tion 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); } }
Trang 33
Tổ hợp công nghệ giáo dục Topica
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-javathuat-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 Trang 34
Tổ hợp công nghệ giáo dục Topica 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
dsSv=new ArrayList(); public boolean ktTrungma(String masv)
{ for(Sinhvien sv : dsSv)
{ if(sv.getMasv().equalsIgnoreCase(masv)) return true;
} return false;
}
Trang 35
Tổ hợp công nghệ giáo dục Topica 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
{ 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); } }
Trang 36
Tổ hợp công nghệ giáo dục Topica 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{ 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 dsSv=new ArrayList(); …//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);
} }
Trang 37
Tổ hợp công nghệ giáo dục Topica
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ử dkhông ụng cóthìchgiắcữ ch ắn mumàn ốn thoát nguyên hình.hay không? Nếu muốn thoát thì sẽ đóng chương trình, nếu *** 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. Trang 38
Tổ hợp công nghệ giáo dục Topica
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(C olor. 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);
Trang 39
Tổ hợp công nghệ giáo dục Topica 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(Co lor. 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"});
Trang 40
Tổ hợp công nghệ giáo dục Topica 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;
}
Trang 41
Tổ hợp công nghệ giáo dục Topica 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 hashTbl= new Hashtable(); 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 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). Trang 42
Tổ hợp công nghệ giáo dục Topica
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 UnitPrice void setUnitPrice( double 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) {
Trang 43
Tổ hợp công nghệ giáo dục Topica HashSet myhs=new HashSet(); 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 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 để 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.
Trang 44
Tổ hợp công nghệ giáo dục Topica
Bài tập 10: Thực hành về PriorityQueue Hãy sử dụng PriorityQueue để quản lý độ ưu tiên công việc cần thực hiện. Những công việc nào có độ ưu tiên cao nhất thì được thực hiện trước.
Bài tập 11: Cải tiến bài tập 10 Hãy sử dụng PriorityQueue để quản lý độ ưu tiên và độ phức tạp của công việc. - Nếu công việc nào có độ ưu tiên lớn hơn thì được thực hiện trước - Nếu công việc nào có cùng độ ưu tiên thì tính theo độ phức tạp, công việc nào có độ phức
tạp nhiều nhất thì được thực hiện trước. Trang 45
Tổ hợp công nghệ giáo dục Topica
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 : Trang 46
Tổ hợp công nghệ giáo dục Topica
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()
{
Trang 47
Tổ hợp công nghệ giáo dục Topica 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()
Trang 48
Tổ hợp công nghệ giáo dục Topica { 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); }
Trang 49
Tổ hợp công nghệ giáo dục Topica 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 */
Trang 50
Tổ hợp công nghệ giáo dục Topica 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)
Trang 51
Tổ hợp công nghệ giáo dục Topica -
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). Trang 52
Tổ hợp công nghệ giáo dục Topica -
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( parseDouble Double. Double. parseDouble(txta.getText()), (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(); } }
Trang 53
Tổ hợp công nghệ giáo dục Topica Class CPTB2 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 this.m_dVarA=dVarA; .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;
}
Trang 54
Tổ hợp công nghệ giáo dục Topica }
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); ArrayListlstFiles=null; if(f.exists()&& f.isDirectory()) { lstFiles=new ArrayList(); 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()); ArrayListlist=(ArrayList)ois.readObject();
Giao diện phía client như sau:
Trang 55
Tổ hợp công nghệ giáo dục Topica 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 Trang 56
Tổ hợp công nghệ giáo dục Topica
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 1 chat room. thể chat cùngtrình nhaugiả trênlậpchat room này. Người dùng nhập địa chỉ server, tên nick chat vào và có
Trang 57
Tổ hợp công nghệ giáo dục Topica
Trang 58
Tổ hợp công nghệ giáo dục Topica 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…
Trang 59
Tổ hợp công nghệ giáo dục Topica 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: Trang 60
Tổ hợp công nghệ giáo dục Topica
-
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. Trang 61
Tổ hợp công nghệ giáo dục Topica 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
Trang 62
Tổ hợp công nghệ giáo dục Topica
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. Trang 63
Tổ hợp công nghệ giáo dục Topica
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:
Trang 64
Tổ hợp công nghệ giáo dục Topica
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%87c%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:
Trang 65
Tổ hợp công nghệ giáo dục Topica
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:
Trang 66
Tổ hợp công nghệ giáo dục Topica
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
Trang 67
Tổ hợp công nghệ giáo dục Topica
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.
Trang 68
Tổ hợp công nghệ giáo dục Topica 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.
Trang 69
Tổ hợp công nghệ giáo dục Topica
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. Trang 70
Tổ hợp công nghệ giáo dục Topica
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:
Trang 71
Tổ hợp công nghệ giáo dục Topica 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
o o 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. 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 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. 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. 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);
Trang 72
Tổ hợp công nghệ giáo dục Topica
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 tblPublisher Columns Name
Data Type
Data Size
Description
PublisherCode PublisherName Address Phone
VARCHAR NVARCHAR NVARCHAR NVARCHAR
100
Mã nhà xuất bản ( khóa chính) Tên nhà xuất bản Địa chỉ Điện thọai
tblBook dùng BookCode, Bảng để ngoại lưu danh các chiếu đầu sách, khóa chính làrCode là PublisherCode, Khóa này sách sẽ tham tới cột Publishe ở trong khóa bảng ngoại tblPublishe r
tblBook Columns Name
BookCode BookName PublisherCode
Data Type
Data Size
Description
VARCHAR NVARCHAR VARCHAR
100
Mã sách ( khóa chính) Tên sách Mã nhà xuất bản(khóa ngọai)
100
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
P020202022 P020202023
John Wiley and Sons McGraw Hill
75 Arlington St., Suite 300, Boston, MA 605 Third Ave., New York, NY
P020202024
Wrox
P020202025
Prentice Hall PTR
113-1140115 113-1120117 113-1100118 114-1140119 110-1150113
121 Ave. of The Americas, New York, NY 10475 Crosspoint Blvd., Indianapolis, IN 49 Sandiego, USA
Dữ liệu mẫu của bảng tblBook( bảng lưu các đầu sách) tblBook BookCode
B032120449 B032120450
BookName
Introduction to The Design and Analysis of Algorithms Operating System Concepts
PublisherCode
P020202021 P020202022 Trang 73
Tổ hợp công nghệ giáo dục Topica B032120451 B032120452 B032120453 B032120454 B032120455 B032120456 B032120457 B032120458 B032120459 B032120460 B032120461 B032120462
Advanced Concepts in Operating Systems 6th Beginning XML 2nd Core Java 2 Volume II A Biography Compiled Academic Culture Achieving Broad Development Achieving a Productive Aging Society Portrait of a Marching Black Automatically Adaptable Software Problems in Psychology Human Relations in a Factory Admiral Halsey's Story
P020202023 P020202024 P020202025 P020202021 P020202021 P020202021 P020202021 P020202021 P020202022 P020202022 P020202022 P020202023
B032120463 B032120464 B032120465 B032120466 B032120467
Theoretical and Research Perspectives The Adolescent in Turmoil Adolphus, a Tale Adventures Aerogeology
P020202024 P020202021 P020202024 P020202021 P020202021
Giao diện chính của chương trình như sau :
Trang 74
Tổ hợp công nghệ giáo dục Topica
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
Trang 75
Tổ hợp công nghệ giáo dục Topica
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 bên dưới):
(sinh viên làm theo lab này trước khi làm các bài tập
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
Trang 76
Tổ hợp công nghệ giáo dục Topica -
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:
Trang 77
Tổ hợp công nghệ giáo dục Topica 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:
Trang 78
Tổ hợp công nghệ giáo dục Topica
Chọn User Library và click Next:
Chọn User Libraries:
Chọn New để tạo nhóm thư viện:
Trang 79
Tổ hợp công nghệ giáo dục Topica
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. Trang 80
Tổ hợp công nghệ giáo dục Topica 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 Trang 81
Tổ hợp công nghệ giáo dục Topica 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:
Trang 82
Tổ hợp công nghệ giáo dục Topica 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.
Trang 83
Tổ hợp công nghệ giáo dục Topica 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:
Trang 84
Tổ hợp công nghệ giáo dục Topica
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. Trang 85
Tổ hợp công nghệ giáo dục Topica
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:
Trang 86
Tổ hợp công nghệ giáo dục Topica
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 Trang 87
Tổ hợp công nghệ giáo dục Topica
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: Trang 88
Tổ hợp công nghệ giáo dục Topica
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ã. Trang 89
Tổ hợp công nghệ giáo dục Topica
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 t in…) 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 createStateme nt()
{ 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; } }
Trang 90
Tổ hợp công nghệ giáo dục Topica -
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 getList()
{ ResultSet rs= factor.execQuery("select * from sinhvien"); ArrayListlist= new ArrayList(); 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(); }
Trang 91
Tổ hợp công nghệ giáo dục Topica 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):
Trang 92
Tổ hợp công nghệ giáo dục Topica
Package xử lý thêm mới (java servlet):
Trang 93
Tổ hợp công nghệ giáo dục Topica Web.xml
Cách hiển thị nội dung lên trong index.jsp:
Trang 94
Tổ hợp công nghệ giáo dục Topica Trang chỉnh sửa (update.jsp – tương tự cho trang newpage.jsp)
Trang deletepage.jsp:
Trang 95