190 likes | 263 Views
5. Übung zu Software Engineering. WS 2007/2008. Aufgabe 12. Entwickeln Sie ein Anwendungssystem zum Verwalten von Studierenden, bestehend aus den drei Schichten Datenhaltung, Geschäftslogik und Benutzerschnittstelle.
E N D
5. Übung zu Software Engineering WS 2007/2008
Aufgabe 12 • Entwickeln Sie ein Anwendungssystem zum Verwalten von Studierenden, bestehend aus den drei Schichten Datenhaltung, Geschäftslogik und Benutzerschnittstelle. • Implementieren Sie eine Klasse Student, welche den Vornamen, den Nachnamen, sowie die Matrikelnummer des Studierenden speichert. • Implementieren Sie eine Klasse StudentenVerwaltung zum Verwalten der Studierenden. Es soll möglich sein, neue Studierende anzulegen, zu ändern und zu löschen, sowie diese persistent zu speichern. Nutzen Sie die Klassen FileOutputStream und ObjectOutputStream bzw. FileInputStream und ObjectInputStream, um die verwalteten Student-Objekte in eine Datei studenten.dat zu schreiben bzw. diese aus der Datei auszulesen. Es ist ausreichend, wenn Sie diese Datei bei Programmstart komplett einlesen und die Studierenden beim Verlassen des Programms wieder in der Datei sichern. • Entwerfen Sie eine grafische Benutzeroberfläche (GUI), über welche Sie die Klasse StudentenVerwaltung ansprechen können. In dem Fenster sollte jeweils der Datensatz eines Studierenden angezeigt werden. Sehen Sie hierbei für jedes Attribut der Klasse Student ein Label und ein TextField vor. Implementieren Sie des Weiteren die Schaltflächen Vor und Zurück, mit denen Sie durch die Liste der Studierenden blättern können, eine Schaltfläche Neu, mit der Sie zu den aktuell in den TextFields eingetragenen Daten einen neuen Studenten anlegen können, eine Schaltfläche Ändern, mit der sie die Daten des angezeigten Studierenden aktualisieren können, sowie eine Schaltfläche Beenden, mit der die Daten gesichert werden und die Anwendung beendet wird.
Aufgabe 12 a) • Implementieren Sie eine Klasse Student, welche den Vornamen, den Nachnamen sowie die Matrikelnummer des Studierenden speichert. publicclass Student implements Serializable { private String vorname; private String nachname; private String matrikelnummer; public String getVorname() { return vorname; } public String getNachname() { return nachname; } public String getMatrikelnummer() { return matrikelnummer; } publicvoid setVorname(String v) { vorname = v; } publicvoid setNachname(String n) { nachname = n; } publicvoid setMatrikelnummer(String m) { matrikelnummer = m; } }
Aufgabe 12 b) publicclass StudentenVerwaltung { private Vector<Student> v; privateint pointer; StudentVerwaltung() { ... } publicvoid addStudent(Student s) { ... } public Student deleteStudent() { ... } public Student getNextStudent() { ... } public Student getPreviousStudent() { ... } publicvoid updateStudent(Student s) { ... } privatevoid loadData() { ... } privatevoid saveData() { ... } privateint getNumberOfCurrentStudent() { ... } privateint getTotalNumberOfStudents() { ... } }
Aufgabe 12 b) publicvoid saveData() { try { ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(FILENAME)); oos.writeln(v.size()); for(Student s : v) { oos.writeObject(s); } oos.close(); } catch(Exception e) { e.printStackTrace(); } }
Aufgabe 12 b) publicvoid loadData() { try { File file = new File(FILENAME); if(file.exists()) { ObjectInputStream ois = new ObjectInputStream(new FileInputStream(FILENAME)); int size = ois.readInt(); for(int i = 0; i < size; i++) { v.add((Student)ois.readObject()); } ois.close(); } pointer = -1; } catch(Exception e) { e.printStackTrace(); } }
Aufgabe 12 b) publicvoid addStudent(Student s) { v.add(s); pointer = v.size() - 1; } publicvoid updateStudent(Student s) { if(v.size() != 0) { v.setElementAt(s, pointer); } }
Aufgabe 12 b) public Student deleteStudent() { if(v.size() != 0) { v.removeElementAt(pointer); } if(v.size() == 0) { pointer = -1; returnnull; } else { if(pointer = v.size()) { pointer = v.size() - 1; } return v.elementAt(pointer); } }
Aufgabe 12 b) public Student getNextStudent() { if(v.size() == 0) { returnnull; } else { pointer++; if(pointer == v.size()) { pointer = 0; } return v.elementAt(pointer); } }
Aufgabe 12 b) public Student getPreviousStudent() { if(v.size() == 0) { returnnull; } else { pointer--; if(pointer == -1) { pointer = v.size() - 1; } return v.elementAt(pointer); } }
Aufgabe 12 b) public StudentVerwaltung() { v = new Vector<Student>(); loadData(); } publicint getTotalNumberOfStudents() { return v.size(); } publicint getNumberOfCurrentStudent() { return pointer + 1; }
Aufgabe 12 c) publicclass StudentenVerwaltungGui extends JFrame implements ActionListener, WindowListener { private StudentenVerwaltung sv; private JTextField textfieldVorname, textfieldNachname, textfieldNummer; private JLabel labelVorname, labelNachname, labelNummer; private JButton buttonPrev, buttonNext, buttonNew, buttonUpdate, buttonDelete, buttonExit; public StudentenVerwaltungGui() { ... } publicstaticvoid main(String[] args) { ... } publicvoid actionPerformed(ActionEvent e) { ... } // WindowListener, Hilfsmethoden, etc ... }
Aufgabe 13 • Implementieren Sie eine CORBA-basierte verteilte Anwendung, die auf einem Server einen Weihnachtsmann bereitstellt, von dem Sie mit dem Aufruf der Methode public String holeGeschenk() ein Geschenk abholen können. • Spezifizieren Sie die Schnittstelle der Server-Klasse Weihnachtsmann in IDL. • Implementieren Sie die Methode public String holeGeschenk() des Weihnachtsmanns in der Klasse WeihnachtsmannImpl. • Implementieren Sie die Server-Anwendung WeihnachtsmannServer analog zum auf der Vorlesungsseite zur Verfügung gestellten Beispiel. • Implementieren Sie die Client-Anwendung WeihnachtsmannClient. Geben Sie das Geschenk, das Sie von dem auf dem Server hinterlegten Weihnachtsmann bekommen, auf dem Bildschirm aus. • Erzeugen und übersetzen Sie mit idlj und javac die für Ihre Anwendung benötigten Klassen. • Testen Sie Ihre Anwendung sowohl lokal als auch mit dem Weihnachtsmann, der auf dem Rechner wi-vm573.uni-muenster.de, Port 1050 hinterlegt ist. Welches Geschenk haben Sie bekommen?
Aufgabe 13 a) • Spezifizieren Sie die Schnittstelle der Server-Klasse Weihnachtsmann in IDL. interface Weihnachtsmann { string holeGeschenk(); }
Aufgabe 13 b) • Implementieren Sie die Methode public String holeGeschenk() des Weihnachtsmanns in der Klasse WeihnachtsmannImpl. publicclass WeihnachtsmannImpl implements WeihnachtsmannPOA { public String holeGeschenk() { GregorianCalendar cal = new GregorianCalendar(); return cal.getTime().toString(); } }
Aufgabe 13 c) • Implementieren Sie die Server-Anwendung WeihnachtsmannServer analog zum auf der Vorlesungsseite zur Verfügung gestellten Beispiel. publicclass WeihnachtsmannServer { publicstaticvoid main(String[] args) { try { ORB orb = ORB.init(args, null); POA rootPOA = POAHelper.narrow(orb.resolve_initial_references("RootPOA")); rootPOA.the_POAManager().activate(); WeihnachtsmannImpl weihnachtsmannImpl = new WeihnachtsmannImpl(); org.omg.CORBA.Object reference = rootPOA.servant_to_reference(weihnachtsmannImpl); Weihnachtsmann weihnachtsmannReferenz = WeihnachtsmannHelper.narrow(reference); org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService"); NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef); NameComponent[] path = ncRef.to_name("Weihnachtsmann"); ncRef.rebind(path, weihnachtsmannReferenz); orb.run(); } catch (Exception e) { e.printStackTrace(); System.exit(0); } } }
Aufgabe 13 d) • Implementieren Sie die Client-Anwendung WeihnachtsmannClient. Geben Sie das Geschenk, das Sie von dem auf dem Server hinterlegten Weihnachtsmann bekommen, auf dem Bildschirm aus. publicclass WeihnachtsmannClient { static Weihnachtsmann weihnachtsmann; publicstaticvoid main(String[] args) { try { ORB orb = ORB.init(args, null); org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService"); NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef); weihnachtsmann = WeihnachtsmannHelper.narrow(ncRef.resolve_str("Weihnachtsmann")); System.out.println(weihnachtsmann.holeGeschenk()); } catch (Exception e) { e.printStackTrace(); System.exit(0); } } }
Aufgabe 13 e) • Erzeugen und übersetzen Sie mit idlj und javac die für Ihre Anwendung benötigten Klassen. idlj -fall Weihnachtsmann.idl javac *.java • Weihnachtsmann, WeihnachtsmannHelper, WeihnachtsmannHolder, WeihnachtsmannOperations, WeihnachtsmannPOA und _WeihnachtsmannStub jeweils als *.java- und *.class-Datei
Aufgabe 13 f) • Testen Sie Ihre Anwendung sowohl lokal als auch mit dem Weihnachtsmann, der auf dem Rechner wi-vm573.uni-muenster.de, Port 1050 hinterlegt ist. Welches Geschenk haben Sie bekommen? • ORB starten • start orbd -ORBInitialPort 1050 -ORBInitialHost localhost • Server starten • start java -cp . WeihnachtsmannServer -ORBInitialPort 1050 -ORBInitialHost localhost • Client starten • java -cp . WeihnachtsmannClient -ORBInitialPort 1050 -ORBInitialHost wi-vm573.uni-muenster.de • „Der Weihnachtsmann schaut in seinen Sack, kramt herum und überreicht dir wortlos einen Zettel mit den Lottozahl für die nächste Ziehung: ...“